Article - 깊게 탐구하기 73

[Pinit] 핀잇 백엔드 마이크로서비스를 배포할 k8s 클러스터 구축하기

목차인프라 세팅ARC 설치ARC가 사용할 ServiceAccount 정의pinit 네임스페이스에서 role 생성 & sa와 바인딩워크플로우 작성테스트/빌드도커파일 작성도커 이미지 업로드러너가 해당 서비스 어카운트를 이용해 kubeconfig 생성kubectl을 이용해 해당 deployment 실행deployment 정의파드에 secret 환경 변수 세팅하기도커 이미지를 받아오고 해당 이미지를 배포Health Probe 시스템 구축서비스/인그레스 설정들어오는 서비스 설정인그레스/게이트웨이가 해당 서비스를 가리키도록 설정이 글은 쿠버네티스 클러스터 내에 Github Self-Hosted runner를 두고, 해당 러너에서 워크플로우를 트리거해 CI/CD를 진행하는 과정을 담은 가이드입니다.진행하며 이해가 안..

[쿠버네티스 튜토리얼] 7. 쿠버네티스의 리소스 조절

본 글은 GPT 정리를 참고하였습니다. 쿠버네티스(Kubernetes)에서 “리소스 조절”은 크게 2가지 의미로 쓰인다.한 컨테이너/파드(Pod)가 쓰는 CPU·메모리 양을 정하는 것부하에 따라 파드/노드 개수를 자동으로 늘리고 줄이는 것1) 가장 기본: requests / limits (리퀘스트 / 리밋)파드 안의 컨테이너마다 CPU, 메모리 사용량을 어느 정도로 잡을지를 선언한다.requests (요청량): “최소 이 정도는 필요”쿠버네티스 스케줄러(Kubernetes Scheduler)가 파드를 어느 노드(Node)에 올릴지 결정할 때 참고한다.limits (제한량): “최대 이 이상은 못 씀”실행 중 제한을 넘으면 제어가 들어가게 된다.CPU는 보통 쓰로틀링(throttling, 속도 제한)이 걸..

[쿠버네티스 튜토리얼] 6. Helm 설치 및 애플리케이션 관리

Kubernetes에서는 복잡한 애플리케이션 배포를 쉽게 하기 위해 Helm 패키지 매니저를 널리 사용한다.Helm은 차트(Chart)라는 단위로 Kubernetes 매니페스트들을 묶어 패키징하고, 템플릿화하여 재사용 가능하게 한다. 차트는 애플리케이션(예: WordPress, MySQL 등)의 Kubernetes 리소스 정의들을 포함하며, 값 파일(values.yaml)을 통해 환경별 설정을 바꿀 수 있다. 간단히 말해, Helm은 Kubernetes 세계의 apt/yum/npm 같은 패키지 매니저이다. (사용법은 도커허브와 유사하다.)차트를 이용하여 복잡한 앱을 한 줄로 설치하거나, 버전 관리를 할 수 있다.Helm CLI 설치 (로컬 환경)Helm 설치Ubuntu에서는 snap으로 설치하거나, 스크..

문제가 발생했을 때의 해결 방법

경험칙 위주로 나열할 것이기 때문에, 신뢰도가 떨어질 수 있다는 걸 인지하고 있다. 스스로 판단하고 취사선택해주길 바란다. 디버깅 준비문제를 한눈에 이해하기 쉽게 글/도식으로 정리해라.문제를 글 혹은 도식으로 정리하는 과정에서 문제의 원인이 뭔지 나온다.문제의 내가 통제할 수 있는 값들은 무엇이 있는가?문제의 내가 통제할 수 없는 값들은 무엇이 있는가?위 값들로 인해 출력되는 결과는 무엇인가? 그리고 어떠한 결과를 원하는가?"재현/롤백할 수 있는 환경"을 구축해라.빠르게 재현 가능하면서, 반복적으로 재현 가능한 환경을 구축해라.당신의 전문 지식을 발휘할 수 있는 순간이다.이게 안 되어 있다면, 주어진 문제보다 더 중요한 문제가 준비되어있지 않은 것이다.한번 시도하는 데 빠르게 재현하기 어려워지면, 디버..

[쿠버네티스 튜토리얼] 5. 쿠버네티스 네트워크 동작원리

쿠버네티스 네트워킹은 Pod 간 통신, 서비스 디스커버리, 외부 접근 등을 포함한다.앞서 서비스, 인그레스 등을 다뤘지만, 이번에는 내부 네트워크 동작 원리에 초점을 맞춰 간략히 정리한다.Pod간 통신 관점Pod IP 및 통신Kubernetes에서 각 Pod는 고유 IP를 갖는다 (Pods are given unique IPs).클러스터 내 모든 Pod는 하나의 가상 네트워크에 연결되어 있으며, IP를 통해 서로 직접 통신 가능하다.(클러스터의 CNI 플러그인, k3s 기본은 Flannel VXLAN이 이를 구현)즉, Pod A에서 Pod B의 IP로 요청을 보내면, 노드 경계와 상관없이 네트워크 패킷이 전달된다. 이는 kube-proxy와 CNI가 협력하여 이루어진다.그러나 직접 Pod IP를 사용해 ..

[쿠버네티스 튜토리얼] 4. ConfigMap과 Secret 활용

애플리케이션 설정 관리는 애플리케이션 컨테이너화 및 배포 시 중요한 부분이다.Kubernetes에서는 ConfigMap과 Secret을 사용하여 설정값을 관리한다.ConfigMap: 환경설정 등의 비밀이 아닌 데이터를 키-값 형태로 저장하는 객체.예를 들면 애플리케이션 설정 파일, 환경 변수 등등Secret: 비밀번호, API 키 등 민감한 정보를 저장하는 객체이다.Secret의 데이터는 base64로 인코딩되어 저장되지만 기본적으로 암호화되진 않으므로 적절한 권한 관리와 필요 시 암호화 설정이 필요하다.ConfigMap과 Secret 모두 Pod에 주입할 수 있다.환경변수로 노출하거나파일로 마운트하여컨테이너 내에서 읽도록 할 수 있다. 이번 섹션에서는 ConfigMap과 Secret을 생성하고 Pod에..

[쿠버네티스 튜토리얼] 3. 서비스 노출: ClusterIP, NodePort, Ingress

Kubernetes에서 Service(서비스) 객체는 Pod들의 논리적인 집합에 단일 접근 포인트(IP 및 DNS 이름)을 제공하는 역할을 한다.앞서 Deployment로 Nginx Pod 여러 개를 띄웠다면, 클라이언트가 그중 어떤 Pod에 접속해야 할지 알기 어렵다.Service를 사용하면 여러 Pod들을 하나의 서비스로 묶고, 부하 분산(Load Balancing) 및 서비스 디스커버리(DNS)를 제공할 수 있다. Kubernetes에는 몇 가지 서비스 유형(Service Types)이 있다.ClusterIP (기본값)클러스터 내부에서만 접근 가능한 가상 IP를 부여한다.내부 서비스 용도로 사용된다.NodePort각 Node의 IP에서 정해진 포트를 열어, 외부에서 노드IP:포트로 접근할 수 있게 ..

[쿠버네티스 튜토리얼] 2. Deployment 생성과 ReplicaSet 이해

Deployment는 Kubernetes에서 애플리케이션의 배포(Deployment)와 업데이트를 관리하는 상위 리소스이다.Deployment를 생성하면 Kubernetes는 자동으로 ReplicaSet이라는 객체를 만들고, ReplicaSet이 정의된 수만큼 Pod를 생성하여 애플리케이션을 실행한다.Deployment를 통해 롤링 업데이트, 자동 복구, 배포 이력관리 등이 가능하며, 운영 환경에서 주로 사용된다.ReplicaSet은 말 그대로 Pod 레플리카(복제본) 집합을 관리하는 객체이다.“이런 Pod를 N개 running 시켜라”라는 역할을 하며, 자체적으로는 수평 확장만 관리할 뿐 업데이트 전략 등은 없다.Deployment가 ReplicaSet을 감싸서 관리한다고 이해할 수 있다. 요약하면, ..

[쿠버네티스 튜토리얼] 1. k3s로 배워보자.

서비스를 배포할 때, 롤링/카나리/블루 그린같은 무중단 배포 전략을 고려하다 보면, 자연스레 컨테이너를 다루는 방식으로 손이 가게 된다. 현재 진행하고 있는 프로젝트 Pinit의 경우, MSA로 구성되어 있어서, 무중단 배포를 위한 전략을 쉽게 선택할 수 있는 도구가 필요했다. 이때, 도커 컴포즈와 쿠버네티스를 보통 이야기하는데, 이번 기회에 쿠버네티스를 한번 쭉 써보면서 MSA의 인프라 구성에 대해 이해하고자 다음과 같이 튜토리얼을 시작했다. k3s는 Rancher사가 배포한 경량 Kubernetes로, 리소스가 적은 환경이나 로컬 실습에 적합하다.k3s는 설치가 매우 간단하며, 단일 바이너리에 Kubernetes의 핵심 기능을 모두 포함하고 있다.이 섹션에서는 Ubuntu 20.04+ 환경에 k3..

[Pinit] 최종 일관성 구현 - 회원가입 플로우, 이대로 괜찮은가?

문제 상황현재 auth 서비스와 task 서비스는 이벤트를 통해 상호작용을 조율하고 있다. 그런데, 사용자가 회원가입 후 로그인을 한 뒤 task서비스를 이용하려는데, task에 회원 정보가 존재하지 않다면 어떻게 될까? 로그인 성공 - task에 이벤트가 도착한 후task 서버에서 사용자 정보를 정상 처리정상 플로우로그인 성공 - task에 이벤트가 도착하기 전task 서버에서 auth 서버에서 처리한 사용자 정보를 아직 못받음일정을 생성할 수 없음(예외 발생)사용자의 지역 정보를 받아와야 하는데, member record 자체가 없음별명도 존재하지 않음 문제를 깔끔하게 정리해보자.현재 이 문제는 task, auth 서버 간의 문제다.사용자 경험(UX) 기준에서, 별명 정보는 필수가 아니다.진짜 문제는..