실습
Deployment
Deployment 생성
kubectl create deployment nginx --image=nginx --replicas=3
Deployment 상태 확인
kubectl get deployment nginx
Deployment에 발생한 Event 확인
kubectl describe deployment nginx
ReplicaSet 상태 확인
kubectl get rs -l app=nginx
ReplicaSet에 발생한 Event 확인
kubectl describe rs -l app=nginx
Pod 상태 확인
kubectl get pod -l app=nginx
Pod에 발생한 Event 확인
kubectl describe pod -l app=nginx
Deployment에 명시된 Template 확인
kubectl get deploy nginx -o jsonpath='{.spec.template}' | jq
CLI로 동일한 이미지를 사용해서 Pod를 생성할때 나오는 Manifest 확인
kubectl run nginx --image=nginx --dry-run=client -ojson | jq
Deployment에 명시된 컨테이너 이미지 확인
kubectl get deploy nginx \ -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
실제로 생성된 Pod에 사용된 이미지 확인
kubectl get pod -l app=nginx \ -o jsonpath='{.items[0].status.containerStatuses[0].image}{"\n"}'
DockerHub에서 NGINX 도커 이미지 태그 확인 - https://hub.docker.com/_/nginx
생성된 Deployment 객체의 Manifest를 텍스트 에디터로 열기
kubectl edit deployment nginx
spec.template.spec.containers[0].image를 nginx에서 nginx:alpine으로 변경 후 저장하고 나가기
... ... template: metadata: creationTimestamp: null labels: app: nginx spec: containers: - image: nginx:alpine imagePullPolicy: Always name: nginx ... ...
PodSpec에 이미지가 업데이트 됐는지 확인
kubectl get pod $(kubectl get pod -l app=nginx \ -o=jsonpath='{.items[0].metadata.name}{"\n"}') -ojsonpath='{.spec.containers[0].image}{"\n"}'
실제로 생성된 Pod에 사용된 이미지 확인
kubectl get pod -l app=nginx \ -o jsonpath='{.items[0].status.containerStatuses[0].image}{"\n"}'
클러스터에서 발생한 Event를 시간순으로 확인
kubectl get events --sort-by='.lastTimestamp'
아래의 명령어로 컨테이너 이미지를 nginx:stable 로 업데이트
kubectl set image deployment nginx nginx=nginx:stable
Pod의 이미지가 업데이트 됐는지 확인
kubectl get pod $(kubectl get pod -l app=nginx \ -o=jsonpath='{.items[0].metadata.name}') -ojsonpath='{.spec.containers[0].image}{"\n"}'
Deployment 변경사항 히스토리 확인
kubectl rollout history deployment nginx
첫번째 버전과 현재 버전 비교
diff <(kubectl rollout history deploy nginx --revision=1) <(kubectl rollout history deploy nginx --revision=$(kubectl get deploy nginx -o jsonpath='{.metadata.annotations.deployment\.kubernetes\.io/revision}')) -y
아래의 명령어로 컨테이너 이미지를 nginx:perl 로 업데이트
kubectl patch deploy nginx --record --type=json \ -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value": "nginx:perl"}]'
Deployment 변경사항 히스토리 확인
kubectl rollout history deployment nginx
이전 Revision으로 롤백
kubectl rollout undo deployment nginx
Deployment 변경사항 히스토리 확인
kubectl rollout history deployment nginx
클러스터에서 발생한 Event를 시간순으로 확인
kubectl get events --sort-by='.lastTimestamp'
Deployment에 발생한 Event 확인
kubectl describe deploy nginx
Revision 4로 롤백
kubectl rollout undo deployment nginx --to-revision=4
Deployment 변경사항 히스토리 확인
kubectl rollout history deployment nginx
Deployment 삭제
kubectl delete deploy nginx
Under the hood of ReplicaSet
Deployment 생성
kubectl create deployment nginx --image=nginx --replicas=3
Pod 생성 확인
kubectl get pod -l app=nginx
다른 터미널을 열고 Event 객체에 상태 변화 실시간 모니터링 - 아래의 명령어를 입력하고 엔터키를 몇번 입력해서 간격을 만들어두면 새로운 로그를 좀 더 쉽게 알아볼수 있음
kubectl get events -w
기존 터미널로 돌아와서 3개의 Pod 중에서 한개를 삭제
kubectl delete pod \ $(kubectl get pod -l app=nginx -o=jsonpath='{.items[0].metadata.name}')
Pod가 다시 생성됐는지 확인
kubectl get pod -l app=nginx
다른 터미널로 이동해서 새로 발생한 Event 확인
기존 터미널로 돌아와서 ReplicaSet의 Selector 조건 확인
kubectl get rs -l app=nginx -o=jsonpath='{.items[*].spec.selector}' | jq
현재 생성된 Pod들의 Label 확인
kubectl get pod --show-labels
다른 터미널로 이동해서 ReplicaSet 상태 변화 실시간 모니터링
kubectl get rs -l app=nginx -w
기존 터미널로 돌아와서 ReplicaSet의 Selector 조건에 명시된 Label을 가진 Pod 생성
kubectl run httpd --image=httpd \ --labels="app=nginx,pod-template-hash=$(kubectl get rs -l app=nginx -o jsonpath='{.items[0].metadata.labels.pod-template-hash}')"
생성된 Pod 확인
kubectl get pod -l app=nginx
다른 터미널로 이동해서 ReplicaSet 상태 변화 확인 - https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/#scaling-a-replicaset
기존 터미널로 돌아와서 ReplicaSet에 발생한 Event 확인
kubectl describe rs -l app=nginx
3개의 Pod 중에서 한개의 Pod의 app Label의 값을 nginx에서 httpd로 변경
kubectl label pod \ $(kubectl get pod -l app=nginx -o jsonpath='{.items[0].metadata.name}') \ app=httpd --overwrite
다른 터미널로 이동해서 ReplicaSet 상태 변화 확인
현재 생성된 Pod들의 Label 확인
kubectl get pod --show-labels
리소스 삭제
{ kubectl delete deployment nginx kubectl delete pod -l app=httpd }
Deployment Strategy
Deployment 생성
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: replicas: 8 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: youngwjung/nginx:v1 ports: - name: http containerPort: 80 readinessProbe: httpGet: path: / port: http initialDelaySeconds: 10 EOF
생성된 Pod 확인
kubectl get pod -l app=nginx
Deployment에 명시된 배포 전략 확인
kubectl get deploy nginx -o jsonpath='{.spec.strategy}' | jq
Service 생성
kubectl expose deploy nginx
부하를 생성하는 Pod 생성
kubectl run load-generator --image=curlimages/curl --command -- \ sh -c "while true; do curl -sSf --no-keepalive --connect-timeout 0.5 nginx; sleep 0.5; done"
두번째 터미널을 열고 Deployment 상태 변화 실시간 모니터링
kubectl get deploy nginx -w
세번째 터미널을 열고 부하를 생성하는 Pod 로그 확인
kubectl logs load-generator --tail 10 -f
첫번째 터미널로 이동해서 컨테이너 이미지 변경
kubectl set image deployment nginx nginx=youngwjung/nginx:v2
세번째 터미널로 이동해서 웹서버 응답 확인
두번째 터미널을 열고 Deployment 상태 변화 확인
첫번째 터미널로 이동해서 배포 전략 변경
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: strategy: type: Recreate replicas: 8 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: youngwjung/nginx:v2 ports: - name: http containerPort: 80 readinessProbe: httpGet: path: / port: http initialDelaySeconds: 10 EOF
Deployment에 명시된 배포 전략 확인
kubectl get deploy nginx -o jsonpath='{.spec.strategy}' | jq
컨테이너 이미지 변경
kubectl set image deployment nginx nginx=youngwjung/nginx:v3
세번째 터미널로 이동해서 웹서버 응답 확인
두번째 터미널을 열고 Deployment 상태 변화 확인
첫번째 터미널로 이동해서 리소스 삭제
{ kubectl delete pod load-generator --grace-period=0 kubectl delete svc nginx kubectl delete deploy nginx }
Owners and Dependents
이미 생성된 Deployment, ReplicaSet, Pod 확인
kubectl get deploy,rs,pod
Deployment 생성
kubectl create deployment nginx --image=nginx --replicas=3
생성된 ReplicaSet 확인
kubectl get rs -l app=nginx
생성된 ReplicaSet에 명시된 ownerReferences 확인
kubectl get rs -l app=nginx \ -o=jsonpath='{.items[0].metadata.ownerReferences}' | jq
위에서 생성한 Deployment의 uid 확인
kubectl get deploy nginx -o=jsonpath='{.metadata.uid}{"\n"}'
생성된 Pod 확인
kubectl get pod -l app=nginx
생성된 Pod에 명시된 ownerReferences 확인
kubectl get pod -l app=nginx \ -o=jsonpath='{.items[*].metadata.ownerReferences}' | jq
생성된 ReplicaSet의 이름 확인
kubectl get rs -l app=nginx
생성된 ReplicaSet의 uid 확인
kubectl get rs -l app=nginx -o=jsonpath='{.items[0].metadata.uid}{"\n"}'
하나의 Pod의 이름을 환경변수로 저장
export ORPHAN_POD=$(kubectl get pod -l app=nginx -o=jsonpath='{.items[0].metadata.name}')
Pod의 이름이 환경변수로 저장되었는지 확인
echo $ORPHAN_POD
Pod에 명시된 ownerReferences 확인
kubectl get pod $ORPHAN_POD \ -o=jsonpath='{.metadata.ownerReferences}' | jq
ReplicaSet의 Selector 조건 확인
kubectl get rs \ $(kubectl get rs -l app=nginx -o=jsonpath='{.items[0].metadata.name}') \ -ojsonpath='{.spec.selector}' | jq
Pod의 Label 확인
kubectl get pod $ORPHAN_POD --show-labels
Pod의 Label 변경
kubectl label pod $ORPHAN_POD app=orphan --overwrite
Pod에 명시된 ownerReferences 확인
kubectl get pod $ORPHAN_POD \ -o=jsonpath='{.metadata.ownerReferences}' | jq
Pod의 메타데이터에 ownerReferences가 존재하는지 확인
kubectl get pod $ORPHAN_POD \ -o=jsonpath='{.metadata}' | jq 'del(.managedFields)'
이미 생성된 Deployment, ReplicaSet, Pod 확인
kubectl get deploy,rs,pod
Deployment 삭제
kubectl delete deploy nginx
ReplicaSet랑 Pod도 같이 삭제되었는지 확인
kubectl get deploy,rs,pod
삭제되지 않은 Pod가 기존에 Label을 변경한 Pod 인지 학인
echo $ORPHAN_POD
Pod 삭제
kubectl delete pod $ORPHAN_POD
Last updated