0.Controller(컨트롤러)
컨트롤러는 다양한 파드들을 관리하는 Auto Healing, Software Update, Auto Scaling, Job 4가지역할을 맡는다.
쿠버네티스는 클러스터 구조여서 단일 노드와 파드만 사용하는 경우는 흔하지않기 때문에, 장애 없는 서비스를 유지하기 위해컨트롤러는 중요하다. 다양한 목적에 맞게 파드를 사용 할 수 있는 컨트롤러가 존재한다는 것이 쿠버네티스의 장점이기도 하다.
- 오랜 시간동안 실행되어야하는 파드 관리 : 레플리카셋 + 디플로이먼트
- 클러스터의 전체 노드에 같은 파드 실행 : 데몬세트
- statefull한 앱의 파드를 관리 : 스테이트풀셋
- 1회성 작업 및 주기적인 배치 작업 실행할 때 사용 : 크론잡
------------------------------------------------------------------------------------------
1. Deployment
stateless한 상태의 앱 배포할 때 사용하는 가장 기본적인 컨트롤러.
디폴리이먼트는 레플리카세트를 관리하면서 앱 배포를 더 세밀하게 관리할 수 있다.
레플리카셋은 파드 개수 유지하는 기능이라면 디플로이먼트는 앱 배포 시 롤링 업데이트 및 업데이트 중단 후 재배포, 버전 롤백의 추가적인 기능이 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
type: front-end
spec:
replicas: 3 #pods 몇 개 실행할건지 지정
selector:
matchLabels: #metadata.labels 하위 필드와 같은 설정이어야함.
type: front-end
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers: #실제 사용하려는 컨테이너의 이름과 이미지 정보가 있음
- name: nginx-container
image: nginx
ports:
- containerPort:80
# .yaml 파일로 저장 후
k apply -f myapp-deployment.yaml #클러스터에 적용 명령어
k get deploy,rs,rx,pods # 디플로이먼트가 제대로 실행됐는지 확인
2. 디플로이먼트 설정 정보 업데이트 (3)
- alias k=kubectl; k set 명령으로 직접 컨테이너 이미지 지정
- k edit 명령으로 현재 파드의 설정 정보를 연다음 컨테이너 이미지 정보 수정
- 처음 적용했던 yaml 템플릿의 컨테이너 이미지 정보를 수정한다음 k apply 명령 수행
'''1. kubectl set image'''
# k set image deployment/디플로이먼트이름 컨테이너이름=컨테이너이미지:버전
k set image deployment/nginx-container myapp-deployment=nginx:1.9.1
#결과 : 디플로이먼트의 설정을 변경할 때마다 새로운 레플리카세트가 생성되고 그에 맞게 파드가 변경됨
#1. 컨테이너 이미지를 업데이트 하면서 nginx-container 디플로이먼트가 관리하는 새로운 레플리카세트가 생성됨
#2. 해당 레플리카 세트가 관리하는 새로운 형식의 파드로 바뀜
'''2. k edit deploy 디플로이먼트이름'''
k edit deploy nginx-container
#확인 : 만일 .spec.template.spec.containers[].image 필드 값을 nginx:1.9.1 -> 1.10.1로 변경했다고 하면
#하단 명령어를 통해 nginx:1.10.1 바뀐거 확인 가능
K get deploy 디플로이먼트이름 -o=jsonpath="{spec.template.spec.containers[0].image}{'\n'}"
'''3. 템플릿 이미지 정보 수정'''
vi 템플릿명.yaml
k apply -f 템플릿명.yaml
🍓컨테이너 이미지명 버전(태그)
쿠버네티스에서 사용되는 컨테이너 이미지명은 아래와 같이 컨테이너이미지명:태그 구성이다.
$ k set image deployment/디플로이먼트이름 컨테이너이름=컨테이너이미지:버전
컨테이너를 새로 빌드할 때마다 버전을 변경해줘야, 나중에 추적하기 편하기 때문에 태그를 버전명으로 사용하는 것을 권장한다.
참고) 🍓 버전 대신 깃옵스
3. 디플로이먼트 업데이트 정보 롤백
k rollout history deploy 디플로이먼트이름
특정 리비전의 상세 내용 확인
k rollout history deploy 디플로이먼트이름 --revision=리비전숫자
특정 리비전으로 롤백
옵션: --to-revision=수정 버전
k rollout undo deploy 디플로이먼트이름 #이렇게하면 리비전 숫자는 4로 업데이트 됨
#확인
k get deploy,rs,rc,pods
# 이전에 업데이트했던 컨테이너이미지 버전 확인
k get deploy 디플로이먼트이름 -o=jsonpath="{.spec.template.spex.containers[0].image{'\n'}"
# 이후 kubectl rollout history deployment/nginx-deployment 수정 사항 확인하면
deployments "nginx-deployment"
REVISION CHANGE-CAUSE
1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml
4 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
5 <none>
추가로 알면 좋은 것 (리버전 숫자 제한, 디플로이먼트 chage-cause 주석 달기)
'''되돌릴 수 있는 리비전 숫자'''
#디플로이먼트 템플릿의 .spec.revisionHistoryLimit 필드값 설정, 기본은 10
'''CHANGE-CAUSE
: CHANGE-CAUSE 는 수정 생성시 디플로이먼트 주석(kubectl describe deployment nginx-deployment)
인 kubernetes.io/change-cause 에서 복사해도 되고 직접 필드에 값추가해도 됨'''
#디플로이먼트에 주석달기 예시
kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="image updated to 1.16.1"
#수동으로 리소스 매니페스트 편집 예시
deployment-nginx.yaml에 .metadata.annotation 필드에 kubernetes.io/change-cause 추가 해서 값 설정
k apply -f deployment-nginx.yaml --record=false
#옵션 설정을 안해주면 필드값이 아니라 명령 내용 그대로를 CHANGE-CAUS 항목에 저장하기 때문에 옵션 필수
4. 디플로이먼트 생성 & 삭제
kubectl create deployment <디플로이먼트명> --image= (<계정 이름> / <이미지 이름>)--replicas=<레플리카수>
1. 생성 : kubectl create deployment new-deploy --image=path/new-rep
2. 삭제 : kubectl delete deployment new-deploy
5. 스케일링 (파드 개수 조정)
create에서는 --replicas 옵션을 사용할 수 없고, scale은 이미 만들어진 디플로이먼트에서만 사용할 수 있다.
때문에 오브젝트 스펙(spec) 인 yaml(야믈)파일로 설정을 작성해줘야함.
scale 명령어
kubectl scale deployment/nginx-deployment --replicas=5
apply 명령어
kubectl apply -f (<계정 이름> / <템플릿명.yaml>)
- 여기서 잠깐
run VS create VS apply
run | create | apply | |
명령 실행 | 제한적임 | 가능함 | 안 됨 |
파일 실행 | 안 됨 | 가능함 | 가능함 |
변경 가능 | 안 됨 | 안 됨 | 가능함 |
실행 편의성 | 매우 좋음 | 매우 좋음 | 좋음 |
기능 유지 | 제한적임 | 지원됨 | 다양하게 지원됨 |
따라서!! 변경 사항이 발생할 가능성이 있는 오브젝트는 처음부터 apply로 생성하자
6. 디플로이먼트 배포 정지, 재개, 재시작
1. 업데이트 중단
$ k rollout pause deployment/디플로이먼트 이름
2. 컨테이너 이미지와 chage-cause 메세지 변경
$ k patch deployment/디플로이먼트 이름 컨테이너이름=nginx:버전숫자
$ k patch deployment/nginx-deployment -p "{\"metadata\":{\"annotations\":{\"kubernetes.io/chage-cause\":\"version 1.11\"}}}|
$ k rollout history deploy/nginx-deployment#하지만 먼저 업데이트를 pause 시켰기에 디플로이먼트 작업진행 x
3. 미뤘던 배포 진행시키기
$ k rollout resum deploy/nginx-deployment
파드 수정없이 전체 파드를 단순히 재시작해야될 때도 있는데, 재시작 기능을 1.15 이전까지는 쿠버네티스 사상과 맞지 않는다며 지원하지 않다가 이후 지원하게 됨 (디플로이먼트, 스테이트풀세트, 데몬세트 -> restart)
$k rollout restart
7. 디플로이먼트 상태
배포 중에 디플로이먼트 상태는 변함
$k rollout status #상태확인
progressing(진행) | complete(완료) | fail(실패) | |
예시 | 새로운 레플리카세트 생성, 파드 개수 늘리고 줄일 때, 새로운 파드가 준비 상태가 되거나 이용가능한 상태 | 디플로이먼트가 관리하는 모든 레플리카 세트 업데이트 완료되었을 때, 모든 레플리카세트 사용가능상태, 예전 레플리카세트가 모두 종료 되었을 때 | 쿼터부족, readinessProbe진단실패, 권한 부족, 컨테이너이미지로드 에러, 제한 범위 초가, 앱 실행조건 잘못 지정 |
tip
Reference (Bookmark this page for exam. It will be very handy):
https://kubernetes.io/docs/reference/kubectl/conventions/
#Create an NGINX Pod
kubectl run nginx --image=nginx
#Generate POD Manifest YAML file (-o yaml). Don't create it(--dry-run)
kubectl run nginx --image=nginx --dry-run=client -o yaml
#Create a deployment
kubectl create deployment --image=nginx nginx
#Generate Deployment YAML file (-o yaml). Don't create it(--dry-run)
kubectl create deployment --image=nginx nginx --dry-run=client -o yaml
#Generate Deployment YAML file (-o yaml). Don't create it(--dry-run) with 4 Replicas (--replicas=4)
kubectl create deployment --image=nginx nginx --dry-run=client -o yaml > nginx-deployment.yaml
#Save it to a file, make necessary changes to the file (for example, adding more replicas) and then create the deployment.
kubectl create -f nginx-deployment.yaml
OR
#In k8s version 1.19+, we can specify the --replicas option to create a deployment with 4 replicas.
kubectl create deployment --image=nginx nginx --replicas=4 --dry-run=client -o yaml > nginx-deployment.yaml
KodeKloud
'STUDY > Data Engineering' 카테고리의 다른 글
7. CKA udemy 강의 정리 - Section 2 [Namespace] (1) | 2023.01.06 |
---|---|
6. CKA udemy 강의 정리 - Section 2 [Services & kodekloud] (0) | 2023.01.05 |
4. CKA udemy 강의 정리 - Section 2 [ReplicaSet & kodekloud] (0) | 2023.01.05 |
3. CKA udemy 강의 정리 - Section 2 [kodekloud PODs] (0) | 2023.01.04 |
2. CKA udemy 강의 정리 - Section 2 [k8s 컴포넌트] (0) | 2023.01.04 |