다음은 쿠버네티스 스터디 자료를 참고해 정리한 내용입니다.
모니터링하며, 원하는 상태가 되도록 만들어 주는것이 컨트롤러 이다.
정해진 작업을 수행하는 주체
원하는 상태를 만들어 준다.
먼저 볼 컨트롤러 동영상
<2> Replica Set ?
Pod의 수를 일정 갯수로 유지 되도록 해주는것
아래 예제에서 3개의 Pod를 유지해보자~
1
node 1 다운 ?
pod의 레이블 참고한다.
레플리카셋의 셀렉터을 참고한다.
2
clear
master node의 api 서버 접속
ssh -i ~/.ssh/id_rsa ubuntu@api.k8s.serverchk.com
kubectl delete pod --all
3
터미널 하나 더 띠워서 모니터링
watch -d 'kubectl get pods,rs,deploy -o wide'
4
pod 3개
selector
label 확인
spec 용량 확인
cat << EOF > replicaset-cndk.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-cndk
spec:
replicas: 3
selector:
matchLabels:
app: cndk-nginx-pods
template:
metadata:
name: cndk-nginx-pod
labels:
app: cndk-nginx-pods
spec:
containers:
- name: nginx
image: nginx:latest
EOF
5
kubectl apply -f replicaset-cndk.yaml
replicaset.apps/replicaset-cndk created
6
모니터링에 떠 있는것
rs 3개
7
리플리카 세트 확인 ?
kubectl get replicasets.apps -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset-cndk 3 3 3 4m2s nginx nginx:latest app=cndk-nginx-pods
// Selecor가 있다. app=cndk-nginx-pods
8
상세 확인
kubectl describe replicasets.apps replicaset-cndk
9
pod 확인 ?
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-cndk-dxvvw 1/1 Running 0 42s app=cndk-nginx-pods
replicaset-cndk-hl4b8 1/1 Running 0 42s app=cndk-nginx-pods
replicaset-cndk-jr6s4 1/1 Running 0 42s app=cndk-nginx-pods
// pod이름은 replicaset-cndk-xxxxxxxxx로 생성됨
// LABLES 도 확인 바람
8
replicas: 6 으로 수정 ?
kubectl edit replicasets.apps replicaset-cndk
spec:
replicas: 6
9
kubectl get pods
NAME READY STATUS RESTARTS AGE
replicaset-cndk-46wgx 1/1 Running 0 10s
replicaset-cndk-4pfgr 1/1 Running 0 10s
replicaset-cndk-6dtrx 1/1 Running 0 10s
replicaset-cndk-dxvvw 1/1 Running 0 9m28s
replicaset-cndk-hl4b8 1/1 Running 0 9m28s
replicaset-cndk-jr6s4 1/1 Running 0 9m28s
// 3개가 더 생성되었다!
10
리플리카 세트 삭제
kubectl delete replicasets.apps replicaset-cndk
replicaset.apps "replicaset-cndk" deleted
k delete replicaset replicaset-cndk
<3> 리플리카셋 실습
1
다시 생성
kubectl apply -f replicaset-cndk.yaml
2
확인
kubectl get replicasets.apps -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset-cndk 3 3 3 15s nginx nginx:latest app=cndk-nginx-pods
3
중복되는 Label의 Pod 생성하면 ?
생성되자 마자 죽는다!!
ubuntu@ip-172-20-41-255:~$ more pod-rs.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
labels:
app: cndk-nginx-pods
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
labels:
app: cndk-nginx-pods
spec:
containers:
- name: hello2
image: gcr.io/google-samples/hello-app:2.0
4
적용 ?
kubectl apply -f pod-rs.yaml && kubectl get pod -w
중복되는 Pod 생성시 ?
생성되자 마자 종료 시킨다.!!
이미 Relicaset 이 라벨 3개인것을 관리하고 있다.
더 들어 오더라도 3개로 관리하고 있어서 종료 시킨다.
pod/pod1 created
pod/pod2 created
NAME READY STATUS RESTARTS AGE
pod1 0/1 Terminating 0 0s
pod2 0/1 Terminating 0 0s
replicaset-cndk-4jf6c 1/1 Running 0 2m50s
replicaset-cndk-dx7vt 1/1 Running 0 2m50s
replicaset-cndk-sghdl 1/1 Running 0 2m50s
pod1 0/1 Terminating 0 1s
pod2 0/1 Terminating 0 1s
pod2 0/1 Terminating 0 2s
<4> 죽지 않는 pod - 리플리카셋이 관리하고 있음
1
kubectl get pod -w
ubuntu@ip-172-20-41-255:~$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
replicaset-cndk-4jf6c 1/1 Running 0 4m38s
replicaset-cndk-dx7vt 1/1 Running 0 4m38s
replicaset-cndk-sghdl 1/1 Running 0 4m38s
2
pod 삭제 ?
kubectl delete pod -l app=cndk-nginx-pods
// 안죽는다.
kubectl get pod -w
3
전체 pod 삭제 ?
kubectl delete pod --all
안죽는다
Pod는 레플리카 세트가 3개로 유지하락고 관리하고 있다.
4
라벨 보기 ?
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-cndk-fx6dn 1/1 Running 0 15s app=cndk-nginx-pods
replicaset-cndk-gj8zv 1/1 Running 0 15s app=cndk-nginx-pods
replicaset-cndk-xvhbl 1/1 Running 0 15s app=cndk-nginx-pods
kubectl get pod -w
5
pod에 라벨 하나 제거 ?
kubectl label pod <pod name> app-
라벨 제거
// app- - 붙이면 라벨을 제거 하는 것이다.
kubectl label pod replicaset-cndk-fx6dn app-
pod/replicaset-cndk-fx6dn labeled
라벨 보기
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-cndk-5fv9m 1/1 Running 0 15s app=cndk-nginx-pods
replicaset-cndk-fx6dn 1/1 Running 0 2m22s <none>
replicaset-cndk-gj8zv 1/1 Running 0 2m22s app=cndk-nginx-pods
replicaset-cndk-xvhbl 1/1 Running 0 2m22s app=cndk-nginx-pods
6
kubectl delete rs replicaset-cndk
replicaset.apps "replicaset-cndk" deleted
7
레플리카 세트를 삭제하면 라벨 없는 pod만 살아 있다.
라벨이 있는것만 레플리카 세트가 관리한다.
ubuntu@ip-172-20-41-255:~$ kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
replicaset-cndk-fx6dn 1/1 Running 0 3m41s <none>
8
pod 모두 삭제
kubectl delete pod --all
pod "replicaset-cndk-fx6dn" deleted
// 장애 처리시 ?
라벨을 삭제하여 새로운 pod를 올리고, 살아 있는 pod에 접근해서 원인을 확인
RS삭제 ?
kubectl delete rs --all
<5> 디플로이먼트 ?
레플리카 세트를 관리한다.
롤링 업데이트와 배포,롤백 제공한다.
1
구성?
디플로이먼트 ---- 레플리카셋 1 , 레플리카셋 2 로 구성
레플리카셋 1 아래에 pod 들
레플리카셋 2 아래에 pod 들
2
터미널2에서 모니터링
마스터 ?
watch -d 'kubectl get pods,rs,deploy -o wide'
3
clear
4
cat << EOF > deployment-cndk.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-cndk
spec:
replicas: 3
selector:
matchLabels:
app: cndk-nginx-pods
template:
metadata:
name: cndk-nginx-pod
labels:
app: cndk-nginx-pods
spec:
containers:
- name: nginx
image: nginx:latest
EOF
5
kubectl apply -f deployment-cndk.yaml
deployment.apps/deployment-cndk created
6
확인?
kubectl get deploy,rs,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/deployment-cndk 3/3 3 3 29s
NAME DESIRED CURRENT READY AGE
replicaset.apps/deployment-cndk-5f5d7bfcb8 3 3 3 29s
NAME READY STATUS RESTARTS AGE
pod/deployment-cndk-5f5d7bfcb8-4vttz 1/1 Running 0 29s
pod/deployment-cndk-5f5d7bfcb8-9fhrm 1/1 Running 0 29s
pod/deployment-cndk-5f5d7bfcb8-rntrh 1/1 Running 0 29s
// deploy,rs,pods 가 생성 되어 있다.
7
deployments 확인 ?
kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment-cndk 3/3 3 3 88s nginx nginx:latest app=cndk-nginx-pods
8
deployments 상세 확인 ?
kubectl describe deployments.apps deployment-cndk
9
리플리카 셋 확인?
kubectl get replicasets.apps -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
deployment-cndk-5f5d7bfcb8 3 3 3 2m55s nginx nginx:latest app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8
10
파드 , 파드 라벨 확인?
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
deployment-cndk-5f5d7bfcb8-4vttz 1/1 Running 0 3m20s app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8
deployment-cndk-5f5d7bfcb8-9fhrm 1/1 Running 0 3m20s app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8
deployment-cndk-5f5d7bfcb8-rntrh 1/1 Running 0 3m20s app=cndk-nginx-pods,pod-template-hash=5f5d7bfcb8
11
파드 갯수 증가 ?
kubectl scale deployment --replicas=6 deployment-cndk
deployment.apps/deployment-cndk scaled
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
deployment-cndk-5f5d7bfcb8-4vttz 1/1 Running 0 4m22s app=cndk-nginx-pods,pod-
deployment-cndk-5f5d7bfcb8-9fhrm 1/1 Running 0 4m22s app=cndk-nginx-
deployment-cndk-5f5d7bfcb8-rntrh 1/1 Running 0 4m22s app=cndk-nginx-pods,pod-
deployment-cndk-5f5d7bfcb8-svv4b 1/1 Running 0 6s app=cndk-nginx-pods,pod-
deployment-cndk-5f5d7bfcb8-vz5ml 1/1 Running 0 6s app=cndk-nginx-pods,pod-
deployment-cndk-5f5d7bfcb8-whh6l 1/1 Running 0 6s app=cndk-nginx-pods,pod-
// 6개로 증가됨
12
pod 삭제
kubectl delete pod --all
// pod 삭제가 안된다.
// pod 다시 6개 됨
13
rs 삭제
kubectl delete replicasets.apps --all
// replicasets 삭제가 안된다.
// 디플로이 먼트가 replicasets를 다시 생성한다.
14
디플로이 먼트 삭제
kubectl delete deployments.apps deployment-cndk
deployment.apps "deployment-cndk" deleted
// 모두 삭제됨
// pod, rs ,deployment 모두 삭제됨.
// 디플로이 먼트 삭제를 해야 모두 삭제 된다!
15
확인 ?
kubectl get deploy,rs,pod
No resources found in default namespace.
<6> 롤링 업데이트 와 롤백
롤링 업데이트 = 순차적으로 하나씩 Pod 를 업데이트 하는것.
1
clear
2
deployment-nginx-1.yaml
nginx v1.11 확인
3
cat << EOF > deployment-nginx-1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
spec:
replicas: 3
selector:
matchLabels:
app: cndk-nginx-pods
template:
metadata:
name: cndk-nginx-pod
labels:
app: cndk-nginx-pods
spec:
containers:
- name: nginx
image: nginx:1.11
EOF
4
// 레코드를 추가해 생성 한다 !!
kubectl apply -f deployment-nginx-1.yaml --record
deployment.apps/deployment-nginx configured
5
pod 정보 확인?
kubectl get pod -o yaml | grep "image: nginx"
- image: nginx:1.11
- image: nginx:1.11
- image: nginx:1.11
배포 히스토리 확인 명령어
kubectl rollout history deployment deployment-nginx
ectl rollout history deployment deployment-nginx
deployment.apps/deployment-nginx
REVISION CHANGE-CAUSE
1 kubectl apply --filename=deployment-nginx-1.yaml --record=true
6
업데이트 실행 ?
set image 로 이미지를 set image로 변경해 보자.
kubectl set image deployment deployment-nginx nginx=nginx:1.12 --record && kubectl get pod -w
kubectl get pod -o yaml | grep "image: nginx"
NAME READY STATUS RESTARTS AGE
deployment-nginx-77b4cbf48d-2mtj8 1/1 Running 0 90s
deployment-nginx-77b4cbf48d-bb2g2 1/1 Running 0 90s
deployment-nginx-77b4cbf48d-bc598 1/1 Running 0 90s
deployment-nginx-78bc6dfdf7-cx6lw 0/1 ContainerCreating 0 0s
deployment-nginx-78bc6dfdf7-cx6lw 0/1 ContainerCreating 0 0s
deployment-nginx-78bc6dfdf7-cx6lw 1/1 Running 0 1s
deployment-nginx-77b4cbf48d-bc598 1/1 Terminating 0 91s
deployment-nginx-78bc6dfdf7-96wqb 0/1 Pending 0 0s
deployment-nginx-78bc6dfdf7-96wqb 0/1 Pending 0 0s
deployment-nginx-78bc6dfdf7-96wqb 0/1 ContainerCreating 0 0s
deployment-nginx-77b4cbf48d-bc598 1/1 Terminating 0 91s
deployment-nginx-78bc6dfdf7-96wqb 0/1 ContainerCreating 0 0s
deployment-nginx-77b4cbf48d-bc598 0/1 Terminating 0 92s
deployment-nginx-78bc6dfdf7-96wqb 1/1 Running 0 2s
deployment-nginx-77b4cbf48d-2mtj8 1/1 Terminating 0 93s
deployment-nginx-78bc6dfdf7-6xr7w 0/1 Pending 0 0s
deployment-nginx-78bc6dfdf7-6xr7w 0/1 Pending 0 0s
deployment-nginx-78bc6dfdf7-6xr7w 0/1 ContainerCreating 0 0s
deployment-nginx-77b4cbf48d-2mtj8 1/1 Terminating 0 93s
deployment-nginx-78bc6dfdf7-6xr7w 0/1 ContainerCreating 0 0s
deployment-nginx-78bc6dfdf7-6xr7w 1/1 Running 0 1s
deployment-nginx-77b4cbf48d-2mtj8 0/1 Terminating 0 94s
deployment-nginx-77b4cbf48d-bb2g2 1/1 Terminating 0 94s
deployment-nginx-77b4cbf48d-bb2g2 1/1 Terminating 0 94s
deployment-nginx-77b4cbf48d-bb2g2 0/1 Terminating 0 95s
deployment-nginx-77b4cbf48d-2mtj8 0/1 Terminating 0 103s
deployment-nginx-77b4cbf48d-2mtj8 0/1 Terminating 0 103s
deployment-nginx-77b4cbf48d-bc598 0/1 Terminating 0 103s
deployment-nginx-77b4cbf48d-bc598 0/1 Terminating 0 103s
deployment-nginx-77b4cbf48d-bb2g2 0/1 Terminating 0 107s
deployment-nginx-77b4cbf48d-bb2g2 0/1 Terminating 0 107s
업데이트 확인
kubectget pod -o yaml | grep "image: nginx"-w
- image: nginx:1.12
- image: nginx:1.12
- image: nginx:1.12
7
1.13으로 업데이트?
kubectl set image deployment deployment-nginx nginx=nginx:1.13 --record && kubectl get pod -w
kubectl get pod -o yaml | grep "image: nginx"
8
1.14 버전으로 업데이트 ?
kubectl set image deployment deployment-nginx nginx=nginx:1.14 --record && kubectl get pod -w
kubectl get pod -o yaml | grep "image: nginx"
9
히스토리 확인 ?
kubectl rollout history deployment deployment-nginx
EVISION CHANGE-CAUSE
6 kubectl apply --filename=deployment-nginx-1.yaml --record=true
7 kubectl set image deployment deployment-nginx nginx=nginx:1.12 --record=true
8 kubectl set image deployment deployment-nginx nginx=nginx:1.13 --record=true
9 kubectl set image deployment deployment-nginx nginx=nginx:1.14 --record=true
10
롤백 ?
kubectl rollout undo deployment deployment-nginx --to-revision=7
deployment.apps/deployment-nginx rolled back
11
kubectl get pod -o yaml | grep "image: nginx"
- image: nginx:1.12
- image: nginx:1.12
- image: nginx:1.12
12
라벨로 구분 되어 있어 롤백이 가능하다 ?
kubectl get replicasets.apps --show-labels
NAME DESIRED CURRENT READY AGE LABELS
deployment-nginx-5cbcc59b4c 0 0 0 45h app=cndk-nginx-pods,pod-template-deployment-nginx-67cc8cd4f4 0 0 0 45h app=cndk-nginx-pods,pod-template-
deployment-nginx-77b4cbf48d 0 0 0 45h app=cndk-nginx-pods,pod-template-
deployment-nginx-78bc6dfdf7 3 3 3 45h app=cndk-nginx-pods,pod-template-
13
상세 확인?
kubectl describe deployments.apps deployment-nginx
14
watch -d 'kubectl get pods,rs,deploy -o wide'
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/deployment-nginx 3/3 3 3 47s nginx nginx:1.11 app=cndk-nginx-pods
15
디프롤이먼트 삭제해야 다 삭제된다.
kubectl delete deployments.apps --all
deployment.apps "deployment-nginx" deleted
<7> 정리
1
쿠버네티스는 컨트롤러라는 놈이 있다.
원하는 상태로 만들어 준다.
2
ReplicaSet이 있다.
파드 수를 관리한다.
3
디플로이 먼트가 있다.
리플리케 세트를 관리하는 상위 오브젝트이다.
리플리카세트와 파드를 조정하며, 이중화 되도록 한다.
롤링 업데이트와 롤백도 지원한다.
<8> 다음 과정
https://brunch.co.kr/@topasvga/1675
감사합니다.