목차
컨트롤러: 파드 관리
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