쿠버네티스로 MSA DevOps 환경 구축
3. Pod, Service, Deployment
8. ArgoCD - GitOps
4. 쿠버네티스 배포
쿠버네티스에 마이크로서비스를 배포하려면 먼저 쿠버네티스가 어떻게 구성되어 있는지 살펴보면, 좀 더 쉽게 배포의 절차를 이해할 수 있을 것이다. 아래 그림은 쿠버네티스 아키텍처를 설명해 주는 쿠버네티의 공식 문서에서 가져왔다.
보기에 복잡해 보이지만 화살표 연결만으로도, cloud-control-manager는 AWS, GCP와 같은 cloud provider와 연결하기 위한 컴포넌트로 보이고, kube-api-server는 모든 컴포넌트가 연결되어 있는 것으로 봐서 전체를 연결해 주는 API서버로 보이고, 쿠버네티스가 OpenStack과는 달리 DB를 운영하지 않는 것으로 봐서 etcd가 working storage를 저장하는 곳이고, 내 마이크로서비스들이 언제 어느 Node로 배포되고 몇 개의 Pod로 동작하여야 하는지에 대한 작업 처리를 Scheduler가 관리하는 것으로 보이고, Controller Manager는 여기까지 제어의 중심, brain, 역할을 하는 것이 없는 걸로 봐서 각 Node를 관리하는 kubelet들에게 어떤 지시를 내릴 것인지 결정하는 Orchestration brain역할을 하는 것으로 보인다.
이제 기본적인 구조를 알았으니 쿠버네티스의 많은 기능 중 기본이 되는 3가지가 Pod, Service, Deployment개념을 사용해서 앞에서 만든 프로그램을 배포해 보자.
a. 쿠버네티스의 기본, Pod
Pod는 쿠버네티스가 관리하는 실행 인스턴스의 최소단위이다. 쿠버네티스는 docker image로 만들어진 컨테이너를 직접 관리하지 않는다. 대신 컨테이너를 Pod라는 쿠버네티스 실행 단위로 한번 패키징 한 다음, 이 Pod단위로 관리한다. 이렇게 함으로써 컨테이너 기술의 변경과 관계없이, 쿠버네티스는 사용자의 서비스를 같은 방법으로 운영할 수 있다.
마이크로서비스 구조를 잘 따르려면 하나의 Pod에 하나의 컨테이너가 실행되도록 정의하는 것이 운영하기에 효율적이다.
앞에서 만든 docker image를 쿠버네티스에 배포하기 위한 첫 번째 개념인 먼저 Pod로 만들려면 다음과 같은 내용으로 만들어 YAML파일로 만들고 poda.yml로 저장한다.
apiVersion: v1
kind: Pod
metadata:
name: pod-a
labels:
app: pod-a-label
spec:
containers:
- name: container-a
image: localhost:5000/microservice-a:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
이 파일을 kubectl apply명령으로 실행하면, 쿠버테티스 클러스터에 "pod-a"라는 이름을 가진 Pod가 만들어진다.
kubectl apply -f poda.yml
만들어진 Pod에 대한 모든 정보를 보고 싶으면,
kubectl describe pod pod-a
Pod가 생성되면
- Pod내부에서 직접 명령어를 실행해서 동작을 확인해 볼 수도 있고,
kubectl exec pod-a -- curl -X GET http://localhost:8000
- Pod밖 Node에 debug용 컨테이너를 만들 다음 ssh로 들어가서 동작을 확인해 볼 수도 있고,
kubectl debug node/minikube -it --image=ubuntu
- minikube의 경우 직접 node로 ssh로 들어간 다음 확인해 볼 수도 있다.
minikube ssh
b. 네트워크를 설정하는 곳, Service
쿠버네티스의 장점은 서비스 수요에 대응하여 빠르게 Pod들을 스케일 아웃 또는 스케일 인하는 것이 가능하고, 이를 위해 쿠버네티스는 Node(가상머쉰이나 서버)에 Pod를 자동으로 배포하고 삭제하는 것이 가능해야 한다. 이때 네트워크가 Pod에 직접 묶여 있으면 빠르게 스케일링하는 것도 어려울 뿐 아니라, 연결이 끊어지는 현상도 발생할 수 있다.
각 Node에서 Pod에 대한 전반적인 관리는 kublet이 하지만, 각 Node에 존재하는 Pod로 연결되는 네트워크는 kub-proxy를 통해 설정되는데, 쿠버네티스에서 관리하는 모든 노드에 분산되어 있는 Pod들에 대한 네트워크 연결방법을 정의하기 위해 Service가 존재한다.
앞에서 만든 Pod를 묶는(현재는 1개만 있지만) Service를 아래와 같이 "servicea.yml"파일로 만들어 저장하고,
apiVersion: v1
kind: Service
metadata:
name: service-a
labels:
net: service-a-label
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
targetPort: 8000
selector:
app: pod-a-label
kubectl apply명령을 다음과 같이 실행하면, 쿠버네티스 클러스터에 "service-a"가 만들어진다.
kubectl apply -f servicea.yml
이 서비스는 "type: NodePort"로 선언되어 있다. 쿠너베티스의 service type에는
- ClusterIP: 클러스터 내부 IP로만 노출하는 방법
- NodePort: Node의 Port로 외부에 노출하는 방법 (일반 컴퓨터에서 포트포워딩과 비슷한 개념),
- Load Balancer: AWS, GCP, NginX Plus, 등 쿠버네티스 외주에서 제공하는 Load balancer를 이용하는 방법,
등이 있는데, 그중 NodePort를 사용했다.
minikube의 경우 service명령을 통해서 접근할 수 있는 URL을 얻을 수 있다.
minikube service service-a --url
이 서비스를 내 노트북에서 접근하려면, 포트포워딩(port-forwarding)을 하거나, AWS, GCP, 또는 NginX Plus 등에서 제공하는 Load Balancer서비스가 필요하다. 외부 Load Balancer에 대해서는 다음에 자세히 정리하려고 한다.
kubectl로 포트포워딩을 하려면, 아래와 명령과 같이 <노트북에서 접근할 포트>:<서비스에서 지정한 포트>의 순서로 포트를 지정하면 된다.
kubectl port-forward --address 0.0.0.0 services/service-a 8000:80
c. 배포를 설정하는 곳, Deployment
Pod로 실행 인스턴스에 대한 설정을 했다면, 이제 이 Pod를 최소 몇 개를 유지하고, 최대 몇 개까지 필요하면 만들어서 외부의 수요에 대응할 것인가에 대한 설정을 하는 곳이 Deployment이다.
Deployment를 사용하면,
- Pod를 템플릿으로 해서 몇 개의 복사복(ReplicaSet)을 만들어 낼 것인지,
- 변하는 수요가 반영해서 복사본(ReplicaSet)을 Scaling을 할 것인지,
- Pod가 업데이트되었다면, 어떻게 업데이트(rollout) 할 것인지,
- Pod의 업데이트할 정보를 수정하기 위해 일시 중지(pause)하거나, 다시 시작(resume) 하거나,
- 혹시 업데이트하는 Pod가 잘못된 것이라면, 복구(undo)할 것인지,
- 업데이트가 자신이 없으니 시험용(Canary) 배포를 한번 해보고 배포할 것인지
등을 지정할 수 있다.
앞에서 만든 Pod를 2개의 ReplicaSet으로 구성한 Deployment를 만들어 deploymenta.yml로 저장하고,
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-a
spec:
selector:
matchLabels:
app: pod-a-label
replicas: 2
template:
metadata:
labels:
app: pod-a-label
spec:
containers:
- name: container-a
image: localhost:5000/microservice-a:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
kubectl apply명령을 사용하면, 쿠버네티스 클러스터에 "deploy-a"라는 이름의 deployment와, "deploy-a-xxxx"라는 이름의 pod들이 만들어진다.
kubectl apply -f deploymenta.yml
'윈도우 개발환경' 카테고리의 다른 글
쿠버네티스로 MSA DevOps 환경 구축; 5. URL기반 Service - Ingress (0) | 2024.08.28 |
---|---|
쿠버네티스로 MSA DevOps 환경 구축; 4. 포트포워딩 없는 Minikube (0) | 2024.08.23 |
시계열 데이터베이스 사용하기; 2. InfluxDB 이용한 모니터링 대시보드 (1) | 2024.03.26 |
쿠버네티스로 MSA DevOps 환경 구축; 2. 로컬 컨테이너 Registry (0) | 2024.02.23 |
시계열 데이터베이스 사용하기; 1. InfluxDB 준비하기 (2) | 2024.02.20 |