시작하세요! 도커/쿠버네티스 6장 읽기
- 쿠버네티스는 대부분의 리소스를 ‘오브젝트’라고 불리는 형태로 관리한다.
- 컨테이너의 집합(Pods), Pods를 관리하는 컨트롤러(Replica Set), 사용자(Service Account), 노드(Node)…
kubectl explain {이름 ex. pod}
으로 특정 오브젝트의 간단한 설명을 볼 수 있다.
- 쿠버네티스를 잘 사용하는 방법을 한마디로 표현하자면 YAML 파일을 잘 작성하는 것이다.
- 쿠버네티스를 구성하는 여러 컴포넌트들은 기본적으로 컨테이너로서 실행되고 있다.
파드(Pod): 컨테이너를 다루는 기본 단위
-
컨테이너 애플리케이션을 배포하기 위한 기본 단위이다.
-
1개의 파드에는 1+a개의 컨테이너가 존재할 수 있다.
ex. 동일한 nginx 컨테이너를 여러 개 생성하려면 1개 nginx 컨테이너가 담긴 파드를 여러 개 생성apiVersion: v1 kind: Pod metadata: name: my-nginx-pod spec: containers: - name: my-nginx-container image: nginx:latest ports: - containerPort: 80 protocol: TCP
# 파드 생성 $ kubectl apply -f pod.yaml # 현재 쿠버네티스에 존재하는 파드 목록 $ kubectl get pods # IP를 포함한 파드 정보 출력 # 이때 IP는 클러스터 내부에서만 접근 가능한 상태 $ kubectl describe pods my-nginx-pod # 파드 컨테이너 내부로 진입 $ kubectl exec -it my-nginx-pod bash root@my-nginx-pod:/# ls /etc/nginx root@my-nginx-pod:/# exit # 쿠버네티스 오브젝트는 쉽게 삭제 가능 $ kubectl delete -f pod.yaml
-
파드 내부의 컨테이너들은 네트워크와 같은 리눅스 네임스페이스를 공유한다.
-
하나의 파드는 하나의 완전한 애플리케이션이다.
레플리카셋(Replica Set): 일정 개수의 파드를 유지하는 컨트롤러
-
정해진 수의 동일한 파드가 항상 실행되도록 관리한다.
-
노드 장애 등의 이유로 파드를 사용할 수 없다면 다른 노드에서 파드를 다시 생성한다.
apiVersion: apps/v1 kind: ReplicaSet metadata: name: replicaset-nginx spec: replicas: 3 selector: matchLabels: app: my-nginx-pods-label template: metadata: name: my-nginx-pod labels: app: my-nginx-pods-label spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
# 레플리카셋 생성 kubectl apply -f replicaset.yaml # 레플리카셋과 파드 목록 출력 kubectl get po kubectl get rs # 이름으로 레플리카셋 삭제 kubectl delete rs replicaset-nginx
-
레플리카셋과 파드는 label selector를 이용해 느슨한 연결로 유지된다.
- 레플리카셋은
spec.selector.matchLabel
에 정의된 라벨을 통해 생성할 파드를 찾는다. - 즉,
app: my-nginx-pods-label
라벨을 가지는 파드의 수 !==spec.replicas
이면, 파드를 정의하는 파드 템플릿(template) 내용으로 파드를 생성한다.
- 레플리카셋은
-
레플리카셋의 목적은 파드 생성이 아니라 일정 개수의 파드를 유지하는 것이다.
-
현재 파드의 수가 replicas에 설정된 값과 다르면 레플리카셋은 동일한 수를 유지하려 시도한다.
-
따라서 위 예시에서 replicas 수를 수정해서 다시 생성하면 설정이 변경되고, 개수를 조정한다.
디플로이먼트(Deployment): 레플리카셋/파드의 배포를 관리
-
실제 쿠버 운영 환경에서는 디플로이먼트라는 오브젝트를 YAML에 정의해 사용한다.
apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx-deployment spec: replicas: 3 selector: matchLabels: app: my-nginx template: metadata: name: my-nginx-pod labels: app: my-nginx spec: containers: - name: nginx image: nginx:1.10 ports: - containerPort: 80
# 디플로이먼트 생성 kubectl apply -f deployment.yaml # 디플로이먼트 목록 출력 kubectl get deploy kubectl get replicaset kubectl get pods
-
디플로이먼트를 통해 애플리케이션의 업데이트와 배포를 더 편하게 할 수 있다.
- 레플리카셋의 변경사항을 저장하는 revision을 남겨 롤백을 가능하게 해준다.
- 무중단 서비스를 위해 파드의 롤링 업데이트 전략을 지정할 수도 있다.
여러 인스턴스가 있어도 업데이트가 멈춤 없이 된다고 해서롤링
업데이트라고 부름
롤링 업, 롤링 다운 -> 버저닝을 자연스럽게 해줌
-
컨테이너 애플리케이션의 버전이 업데이트되어 파드 이미지를 변경해야 할 때?
# (1) kubectl set image deployment my-nginx-deployment nginx=nginx:1.11 --record # (2) kubectl rollout history deployment my-nginx-deployment # (3) kubectl rollout undo deployment my-nginx-deployment --to-revision=1
- (1) 파드 템플릿의 containers에서 nginx 이름을 가진 컨테이너의 이미지를 nginx:1.11로 변경한다.
--record
옵션을 붙여야 어떤 명령으로 변경되었는지도 기록해준다.- (2) 변경되는 파드의 정보들을 리비전으로 보존하는데, 이를 확인할 수 있다.
- (3)
--to-revision
을 통해 이전 버전의 레플리카셋으로 되돌리는 롤백을 할 수 있다.