🥞 BE
home

Ch6. 컨트롤러

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

6.1 레플리케이션 컨트롤러

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

6.2 레플리카 세트

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

6.2.1 레플리카세트 사용하기

apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx-replicaset spec: template: metadata: name: nginx-replicaset labels: app: nginx-replicaset spec: containers: - name: nginx-replicaset image: nginx ports: - containerPort: 80 replicas: 3 selector: matchLabels: app: nginx-replicaset
YAML
복사
replicaset/replicaset-nginx.yaml
kubectl apply -f replicaset-nginx.yaml 명령으로 클러스터에 적용.
kubectl get pods 명령으로 현재 파드 정보 확인.
.spec.replicas를 3으로 설정했으므로, 3개의 replica 파드가 실행되고 있다.
kubectl delete pod <삭제하려는 파드 이름> 으로 파드 1개를 임의로 삭제해도 파드 개수를 3개로 유지하기 위해 파드 하나를 추가로 실행하는 것을 확인할 수 있다.

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

파드는 레이블 기준으로 관리 → 레블리카세트 & 파드 결합 느슨함.
즉, 레플리카세트와 파드를 한꺼번에 삭제할 때는 kubectl delete replicaset <컨테이너이름> 명령을 실행하지만, --cascade=orphan 옵션을 사용하면 레플리카세트가 관리하는 파드에 영향을 끼치지 않고 레플리카세트만 삭제할 수 있다.
kubectl delete pods nginx-replicaset-9ncpn
kubectl edit pod nginx-replicaset-68ppd
kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{'\t'}{.metadata.labels}{'\n'}{end}"

6.3 디플로이먼트

6.3.1 디플로이먼트 사용하기

apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx-deployment template: metadata: labels: app: nginx-deployment spec: containers: - name: nginx-deployment image: nginx ports: - containerPort: 80
YAML
복사
deployment/deployment-nginx.yaml
kubectl apply -f deployment-nginx.yaml 명령으로 클러스터에 적용.
kubectl get deploy,rs,rc,pods 명령으로 디플로이먼트 실행 확인. deploy는 디플로이먼트, rs는 레플리카세트, pods는 파드를 뜻한다. rc는 레플리케이션 컨트롤러를 뜻한다.
kubectl set image deployment/nginx-deployment nginx-deployment=nginx:1.25.3
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}{'\n'}"
kubectl edit deploy nginx-deployment

6.3.2 디플로이먼트 롤백하기

kubectl rollout history deploy nginx-deployment
kubectl rollout history deploy nginx-deployment --revision=3
kubectl rollout undo deploy nginx-deployment
kubectl get deploy,rs,rc,pods
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}{'\n'}"
kubectl rollout history deploy nginx-deployment
kubectl rollout undo deploy nginx-deployment --to-revision=3
kubectl apply -f deployment-nginx.yaml

6.3.3 파드 개수 조정하기

kubectl scale deploy nginx-deployment --replicas=5

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

kubectl set image deploy/nginx-deployment nginx-deployment=nginx:1.24
kubectl patch deployment/nginx-deployment -p "{\"metadata\":{\"annotations\":{\"kubernetes.io/change-cause\":\"version 1.24\"}}}"
kubectl rollout resume deploy/nginx-deployment
kubectl rollout restart deployment/nginx-deployment

6.3.5 디플로이먼트 상태

kubectl patch deployment/nginx-deployment -p "{\"spec\":{\"progressDeadlineSeconds\":2}}"
kubectl get deploy nginx-deployment -o=jsonpath="{.spec.progressDeadlineSeconds}{'\n'}"
kubectl set image deploy/nginx-deployment nginx-deployment=nginx:1.23

6.4 데몬세트

6.4.1 데몬세트 사용하기

apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-elasticsearch namespace: kube-system labels: k8s-app: fluentd-logging spec: selector: matchLabels: name: fluentd-elasticsearch updateStrategy: type: RollingUpdate template: metadata: labels: name: fluentd-elasticsearch spec: containers: - name: fluentd-elasticsearch image: fluent/fluentd-kubernetes-daemonset:elasticsearch env: - name: testenv value: value resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi
YAML
복사
daemonset/daemonset.yaml

6.4.2 데몬세트의 파드 업데이트 방법 변경하기

kubectl edit daemonset fluentd-elasticsearch -n kube-system

6.5 스테이트풀 세트

6.5.1 스테이트풀세트 사용하기

apiVersion: v1 kind: Service metadata: name: nginx-statefulset-service labels: app: nginx-statefulset-service spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-statefulset-service --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx-statefulset serviceName: "nginx-statefulset-service" replicas: 3 template: metadata: labels: app: nginx-statefulset spec: terminationGracePeriodSeconds: 10 containers: - name: nginx-statefulset image: nginx ports: - containerPort: 80 name: web
YAML
복사
statefulset/statefulset.yaml
kubectl apply -f statefulset.yaml

6.5.2 파드를 순서 없이 실행하거나 종료하기

apiVersion: v1 kind: Service metadata: name: nginx-statefulset-service labels: app: nginx-statefulset-service spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-statefulset-service --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-parallel spec: podManagementPolicy: Parallel selector: matchLabels: app: nginx-statefulset serviceName: "nginx-statefulset-service" replicas: 3 template: metadata: labels: app: nginx-statefulset spec: terminationGracePeriodSeconds: 10 containers: - name: nginx-statefulset image: nginx ports: - containerPort: 80 name: web
YAML
복사
statefulset/statefulset=parallel.yaml

6.5.3 스테이트풀세트로 파드 업데이트하기

kubectl edit statefulset web
kubectl get pods -o=jsonpath="{range .items[*]}{.metadata.name}{.spec.containers[0].env}{'\n'}{end}”
apiVersion: v1 kind: Service metadata: name: nginx-statefulset-service labels: app: nginx-statefulset-service spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-statefulset-service --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx-statefulset serviceName: "nginx-statefulset-service" replicas: 3 template: metadata: labels: app: nginx-statefulset spec: terminationGracePeriodSeconds: 10 containers: - name: nginx-statefulset image: nginx ports: - containerPort: 80 name: web env: - name: testenv value: testvalue01
YAML
복사
statefulset/statefulset-env.yaml
변경사항을 바로 반영하지 않는 스테이트풀 설정
apiVersion: v1 kind: Service metadata: name: nginx-statefulset-service labels: app: nginx-statefulset-service spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx-statefulset-service --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web-ondelete spec: selector: matchLabels: app: nginx-statefulset serviceName: "nginx-statefulset-service" replicas: 3 template: metadata: labels: app: nginx-statefulset spec: terminationGracePeriodSeconds: 10 containers: - name: nginx-statefulset image: nginx ports: - containerPort: 80 name: web env: - name: testenv value: testvalue01 updateStrategy: type: OnDelete
YAML
복사
statefulset/statefulset-ondelete.yaml

6.6 잡

6.6.1 잡 사용하기

apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: spec: containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never backoffLimit: 4
YAML
복사
job/job.yaml
kubectl describe job pi
kubectl logs <파드이름>

6.6.2 잡 병렬성 관리

6.6.3 잡의 종류

6.6.4 비정상적으로 실행 종료된 파드 관리하기

6.6.5 잡 종료와 정리

6.6.6 잡 패턴

6.7 크론잡

6.7.1 크론잡 사용하기

apiVersion: batch/v1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure
YAML
복사
cronjob/cronjob.yaml

6.7.2 크론잡 설정

apiVersion: batch/v1 kind: CronJob metadata: name: hello-concurrency spec: schedule: "*/1 * * * *" startingDeadlineSeconds: 600 concurrencyPolicy: Forbid jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster; sleep 6000 restartPolicy: OnFailure
YAML
복사
cronjob/cronjob-concurrency.yaml
kubectl edit cronjob hello-concurrency