🥞 BE
home

컨트롤러

컨트롤러: 파드 관리
ex) 웹 서비스처럼 오랜 시간 동안 계속 실행되어야 하는 파드들을 관리 → 레플리케이션 컨트롤러, 레플리카세트, 디플로이먼트 등 사용

6.1 레플리케이션 컨트롤러

레플리케이션 컨트롤러: 가장 기본적인 컨트롤러
-지정한 숫자만큼의 파드가 항상 클러스터 안에서 실행되도록 관리
-요즘은 레플리카세트를 이용하는 추세 / 앱의 배포 - 디플로이먼트

6.2 레플리카세트

레플리카세트: 레플리케이션 컨트롤러의 발전형
→ 차이:
1) 집합 기반의 셀렉터(in, notin. exists 등 연산자)지원
2) kubectl에서 rolling-update 옵션 사용 불가(디플로이먼트 사용해야 함)

6.2.1 레플리카세트 사용하기

→레플리카세트 템플릿 설정
$kubectl apply -f replicaset-nginx.yaml #클러스터에 적용 $kubectl get pod #현재 파드 정보 확인
Python
복사
$kubectl delete pod nginx-replicaset-p5ql #파드 1개 임의로 삭제
Python
복사

6.2.2 레플리카세트와 파드의 연관 관계

파드 - 레이블 기준 관리 → 레플리카세트 & 파드 연결 느슨함
⇒ —cascade=orphan 옵션 사용 → 레플리카세트가 관리하는 파드에 영향을 끼치지 않고 레플리카세트만 삭제 가능
$kubectl delete replicaset nginx-replicaset --cascade=orphan #파드는 남겨두고 컨트롤러만 삭제 $kubectl get replicaset,pod #현재 레플리카세트, 파드 정보 확인
Python
복사
$kubectl apply -f replicaset-nginx.yaml #남아있는 파드 관리하는 레플리카세트 생성 $kubectl get replicaset,pod #레플리카세트 생성 후 파드 상태 확인
Python
복사
레플리카 상태 확인
DESIRED: 레플리카세트 설정에 지정한 파드 개수
CURRENT: 레플리카세트를 이용해 현재 클러스터에서 동작하는 실제 파드 개수
→새로 만든 레플리카세트가 정상적으로 동작하는지 확인해보자!

6.3 디플로이먼트

디플로이먼트: 상태가 없는 앱을 배포할 때 사용하는 가장 기본적인 컨트롤러
배포 기능 세분화 → 실행시켜야 할 파드 개수 유지 + 롤링 업데이트 + 앱 배포 중단했다가 재시작 가능 + 앱 배포 후 이전 버전으로 롤백 가능

6.3.1 디플로이먼트 사용하기

→ 디플로이먼트 템플릿 설정
$kubectl apply -f deployment-nginx.yaml #클러스터에 적용 $kubectl get deploy,rs,rc,pods #현재 디플로이먼트, 레플리카세트, 레플리케이션 컨트롤러, 파드 정보 확인
Python
복사
deployment-nginx의 컨테이너 이미지 설정 정보 업데이트
1.
kubectl set 명령으로 직접 컨테이너 이미지를 지정
2.
kubectl edit 명령으로 현재 파드의 설정 정보를 연 다음 컨테이너 이미지 정보를 수정
3.
처음 적용했던 템플릿의 컨테이너 이미지 정보를 수행한 다음 kubectl apply 명령을 실행해서 변경
→ kubectl set 명령으로 직접 컨테이너 이미지를 지정해보자!
$kubectl set image deployment/디플로이먼트이름 컨테이너이름=컨테이너이미지:버전숫자 #실행 중인 디플로이먼트에서 image 필드 값만 변경
Python
복사
→ $kubectl get deploy,rs,rc,pods 실행 ⇒ nginx-deployment가 관리하는 새로운 레플리카 세트 생성
→ 기존 파드 - 해당 레플리카세트가 관리하는 nginx-deployment-65877b6746-xxxxx 형식의 파드로 변경
⇒ 디플로이먼트의 설정 변경 → 새로운 레플리카세트 생성 + 파드 변경
$kubectl get deploy 디플로이먼트이름 -o=jsonpath="{.spec.template.spec.containers[0].image}{'\n'}" #변경한 컨테이너 이미지 정보 확인
Python
복사

6.3.2 디플로이먼트 롤백하기

$kubectl rollout history deploy 디플로이먼트이름 #컨테이너 이미지 변경 내역 확인 $kubectl rollout history deploy 디플로이먼트이름 --revision=리비전숫자옵션 #특정 리비전의 상세 내용 확인
Python
복사
$kubectl rollout undo deploy nginx-deployment #컨테이너 이미지 되돌리기
Python
복사

6.3.3 파드 개수 조정하기

$kubectl scale deploy 디플로이먼트이름 --replicas=파드 개수 #파드 개수 조정
Python
복사

6.3.4 디플로이먼트 배포 정지, 배포 재개, 재시작하기

$kubectl rollout pause deployment/디플로이먼트이름 #업데이트 멈추기 $kubectl set image deploy/디플로이먼트이름 컨테이너이름=nginx:버전숫자 $kubectl patch deployment/nginx-deployment -p "{\"metadata\":{\"annotations\":{\"kubernetes.io/change-cause\":\"version 1.11\"}}}"
Python
복사
→ 컨테이너 이미지와 CHANGE-CAUSE 항목에 나타나는 메시지 변경!
→컨테이너 이미지와 CHANGE-CAUSE 항목에 나타나는 메시지를 업데이트했다는 메시지 등장
BUT
$kubectl rollout history deploy/디플로이먼트이름
Python
복사
→ 배포가 진행되지 않았다는 결과가 나타남 ; 업데이트 정지 → 디플로이먼트 작업 진행 X
→ 다시 $kubectl rollout history deploy/디플로이먼트이름 실행 ⇒ 미뤘던 배포 진행
배포를 하는 중간에도 pause 이용해서 정지 가능 + resume 이용: 멈췄던 배포 다시 진행

6.3.5 디플로이먼트 상태

배포 중에는 디플로이먼트 상태가 변함(우선 진행이었다가 성공→완료, 실패→실패)
$kubectl rollout status deploy/디플로이먼트이름 #배포 진행 상태 확인
Python
복사
템플릿에 spec.progressDeadlineSeconds 항목 추가 → 지정된 시간이 지났을 때 상태를 False로 바꿈
→ Progressing의 Status 항목이 False → 실패

6.4 데몬세트

데몬세트: 클러스터 전체 노드에 특정 파드를 실해할 때 사용하는 컨트롤러

6.4.1 데몬세트 사용하기

→ 데몬세트 템플릿 설정
$kubectl apply -f daemonset.yaml #클러스터에 적용
Python
복사
→kube-system 네임스페이스에 fluentd-elasticsearch라는 데몬세트 생성됨
4kubectl describe daemonset -n kube-system으로 변경 사항 확인 가능

6.5 스테이트풀세트