728x90
컨트롤러
Controller 개념
컨트롤러란
- 쿠버네티스에서는 어플리케이션 구동을 위해 파드를 생성함
- 실제 쿠버네티스를 통해서 서비스를 구축할 경우 개별 파드 오브젝트를 직접 컨트롤하는 방식은 사용하지 않음
- 쿠버네티스는 컨테이너 가상화의 특징을 활용하여 유연하고 확장성 있는 서비스를 구성할 수 있도록 컨트롤러 오브젝트를 제공하고 있음
- 컨트롤러는 'A 파드 5개 생성' 과 같은 동작 방식이 아닌 'A 파드가 5개인 상태 유지'와 같은 방식을 사용함
레플리카셋 컨트롤러란
- 쿠버네티스의 컨트롤러는 파드를 올바르게 동작하기 위해 특정 상태를 보장하는 역할
- 특정 상태는 컨트롤러에 따라 동작하는 방식 및 정의하는 상태가 조금씩 다름
- 레플리카셋 컨트롤러는 파드가 특정 갯수만큼 복제되고 동작하는 것을 보장함
- 노드에 문제가 발생하여 파드가 정상 작동하지 않을 경우 자동으로 스케줄러에 의해 새로운 노드 또는 기존 노드에 다시 새로운 파드를 생성하여 파드의 갯수를 유지하도록 복제함
정의한 갯수를 유지하지 않는 경우
- 수동으로 동일한 형식의 파드를 생성하는 경우
- 기존의 파드 유형을 변경하는 경우
- 정의한 복제본의 갯수를 변경하는 경우
레플리카셋 컨트롤러의 구성 요소
- 레이블 셀렉터: 파드 지정
- 파드 템플릿: 새로운 파드의 복제본 생성
- 복제본 수: 기본 값은 '1'
레플리카셋 컨트롤러가 제공하는 기능
- 정의한 복제본의 수만큼 파드가 없는 경우 파드 템플릿을 이용해 파드 생성
- 노드에 장애 발생 시 해당 노드에서 실행 중이던 파드를 다른 노드에 복제본 생성
- 수동이나 자동으로 파드 스케일 아웃이 가능함
실습
레플리카셋 컨트롤러 실습 - 1
.spec.selector.matchLabels: 일치성 기준 레이블 셀렉터 지정
- 복제본 수: 3
- .spec.selector.matchLabels: 레이블 셀렉터의 레이블: app=testapp-rs
- .spec.template.metadata.labels: 파드의 레이블: app=testapp-rs
- 레이블 셀렉터의 레이블과 파드 템플릿의 레이블이 일치하지 않으면 파드는 생성되지 않음
vagrant@kube-master1:~/test$ vi testapp-rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: testapp-rs
spec:
replicas: 3
selector:
matchLabels:
app: testapp-rs
template:
metadata:
labels:
app: testapp-rs
spec:
containers:
- name: testapp
image: c1t1d0s7/myweb
ports:
- containerPort: 8080
protocol: TCP
imagePullPolicy: Never
- 레플리카셋 컨트롤러 생성
vagrant@kube-master1:~/test$ vagrant@kube-master1:~/test$ kubectl create -f testapp-rs.yml
replicaset.apps/testapp-rs created
- 생성된 파드 확인
vagrant@kube-master1:~/test$ kubectl get pods
NAME READY STATUS RESTARTS AGE
testapp-pod-label 1/1 Running 0 8m46s
testapp-rs-c5g4s 1/1 Running 0 29s
testapp-rs-wwptq 1/1 Running 0 29s
vagrant@kube-master1:~/test$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
testapp-pod-label 1/1 Running 0 11m app=testapp-rs
testapp-rs-c5g4s 1/1 Running 0 3m8s app=testapp-rs
testapp-rs-wwptq 1/1 Running 0 3m8s app=testapp-rs
vagrant@kube-master1:~/test$ kubectl describe replicaset.apps testapp-rs | less
- 파드의 레이블 변경
- 실행 중인 파드의 레이블이 변경됨과 동시에 testapp-rs 레이블이 정의된 파드가 새로 생성됨
vagrant@kube-master1:~/test$ kubectl label pods testapp-rs-wwptq app=rs --overwrite
pod/testapp-rs-wwptq labeled
vagrant@kube-master1:~/test$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
testapp-pod-label 1/1 Running 0 13m app=testapp-rs
testapp-rs-c5g4s 1/1 Running 0 5m20s app=testapp-rs
testapp-rs-dvgs6 1/1 Running 0 4s app=testapp-rs
testapp-rs-wwptq 1/1 Running 0 5m20s app=rs
- 변경한 레이블을 원래대로 설정함과 동시에 한 개의 파드가 삭제됨
- yml 파일에서 정의한 복제본 수를 유지하기 위함 (3개)
vagrant@kube-master1:~/test$ kubectl label pods testapp-rs-wwptq app=testapp-rs --overwrite
pod/testapp-rs-wwptq labeled
vagrant@kube-master1:~/test$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
testapp-pod-label 1/1 Running 0 14m app=testapp-rs
testapp-rs-c5g4s 1/1 Running 0 6m1s app=testapp-rs
testapp-rs-dvgs6 1/1 Terminating 0 45s app=testapp-rs
testapp-rs-wwptq 1/1 Running 0 6m1s app=testapp-rs
레플리카셋 컨트롤러 실습 - 2
파드 스케일 아웃
- kubectl scale: 명령을 통한 스케일링
vagrant@kube-master1:~/test$ kubectl scale replicaset testapp-rs --replicas=4
replicaset.apps/testapp-rs scaled
vagrant@kube-master1:~/test$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/testapp-pod-label 1/1 Running 0 38m
pod/testapp-rs-c5g4s 1/1 Running 0 30m
pod/testapp-rs-drssp 1/1 Running 0 4s
pod/testapp-rs-wwptq 1/1 Running 0 30m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 24h
NAME DESIRED CURRENT READY AGE
replicaset.apps/testapp-rs 4 4 4 30m
- kubectl edit: 온라인 상태의 YAML 파일 수정을 통해 스케일링
- 변경한 내용이 문법 오류일 경우 저장이 되지 않고, 변경 사항이 반영되지 않음
- 저장 후 출력 구문이 "~ edited" 라고 나오는지 반드시 확인
vagrant@kube-master1:~/test$ kubectl edit replicasets.apps testapp-rs
replicaset.apps/testapp-rs edited
- kubectl replace: 오브젝트 파일 수정을 통한 스케일링
- 기존 생성된 오브젝트의 구성과 YAML 파일의 구성 정보를 비교한 후 변경된 사항에 대해서만 반영됨
vagrant@kube-master1:~/test$ vi testapp-rs.yml
vagrant@kube-master1:~/test$ kubectl replace -f testapp-rs.yml
replicaset.apps/testapp-rs replaced
레플리카셋 컨트롤러 실습 - 3
.spec.selector.matchExpressions: 집합성 기준 레이블 셀렉터 지정
- 레이블 매칭 확장 연산자
In | 레이블의 키가 존재하며, 값이 대상 중 하나와 일치 |
NotIn | 레이블의 키가 존재하며, 값이 대상 모두와 불일치 |
Exists | 레이블의 키가 존재함 (값 무관) |
DoesNotExist | 레이블의 키가 존재하지 않아야 함 |
- 실행 중인 모든 파드 삭제
vagrant@kube-master1:~/test$ kubectl delete replicasets.apps testapp-rs
replicaset.apps "testapp-rs" deleted
vagrant@kube-master1:~/test$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/testapp-pod-label 1/1 Terminating 0 46m
pod/testapp-rs-7kjdt 1/1 Terminating 0 3m46s
pod/testapp-rs-kss92 1/1 Terminating 0 5m4s
pod/testapp-rs-wwptq 1/1 Terminating 0 37m
pod/testapp-rs-xghs5 1/1 Terminating 0 3m46s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 24h
vagrant@kube-master1:~/test$ kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 24h
- app=testapp-rs-exp 레이블을 포함한 파드 생성
- metadata.name: testapp-pod-1, 2 부분을 변경하여 파드 생성
vagrant@kube-master1:~/test$ kubectl create -f testapp-pod.yml
pod/testapp-pod-1 created
vagrant@kube-master1:~/test$ kubectl create -f testapp-pod.yml
pod/testapp-pod-2 created
vagrant@kube-master1:~/test$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
testapp-pod-1 1/1 Running 0 52s app=testapp-rs-exp,env=dev
testapp-pod-2 1/1 Running 0 16s app=testapp-rs-exp,env=admin
vagrant@kube-master1:~/test$ cat testapp-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: testapp-pod-2
labels:
app: testapp-rs-exp
env: admin
spec:
containers:
- name: testapp
image: c1t1d0s7/myweb
ports:
- containerPort: 8080
imagePullPolicy: Never
- app(key)의 값이 testapp-rs-exp 또는 testapp-rs와 일치하고 env(key)를 포함한 파드의 복제본 4개가 유지되도록 구성함
vagrant@kube-master1:~/test$ vi testapp-rs-exp.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: testapp-rs-exp
spec:
replicas: 4
selector:
matchExpressions:
- key: app
operator: In
values:
- testapp-rs-exp
- testapp-rs
- key: env
operator: Exists
template:
metadata:
labels:
app: testapp-rs
env: op
spec:
containers:
- name: testapp
image: c1t1d0s7/myweb
ports:
- containerPort: 8080
imagePullPolicy: Never
- 레플리카셋 생성
vagrant@kube-master1:~/test$ kubectl create -f testapp-rs-exp.yml
replicaset.apps/testapp-rs-exp created
- 레플리카셋 확인
- 실행 중인 파드는 총 4개
vagrant@kube-master1:~/test$ kubectl get all --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod/testapp-pod-1 1/1 Running 0 13m app=testapp-rs-exp,env=dev
pod/testapp-pod-2 1/1 Running 0 12m app=testapp-rs-exp,env=admin
pod/testapp-rs-exp-9mnjz 1/1 Running 0 11s app=testapp-rs,env=op
pod/testapp-rs-exp-pmc29 1/1 Running 0 11s app=testapp-rs,env=op
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELSservice/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 25h component=apiserver,provider=kubernetes
NAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/testapp-rs-exp 4 4 4 11s <none>
- testapp-pod-1 파드의 레플리카셋 컨트롤러 확인
- => testapp-rs-exp 파드들과 컨트롤러가 동일함
vagrant@kube-master1:~/test$ kubectl describe pods testapp-rs-exp-9mnjz | grep -i 'control'
Controlled By: ReplicaSet/testapp-rs-exp
vagrant@kube-master1:~/test$ kubectl describe pods testapp-pod-1 | grep -i 'control'
Controlled By: ReplicaSet/testapp-rs-exp
- testapp-pod-1의 env 레이블 삭제
vagrant@kube-master1:~/test$ kubectl label pods testapp-pod-1 env- --overwrite
pod/testapp-pod-1 labeled
- 파드 확인
- app=testapp-rs, env=op 레이블을 포함한 파드가 생성됨
vagrant@kube-master1:~/test$ kubectl get all --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod/testapp-pod-1 1/1 Running 0 121m app=testapp-rs-exp
pod/testapp-pod-2 1/1 Running 0 120m app=testapp-rs-exp,env=admin
pod/testapp-rs-exp-9mnjz 1/1 Running 0 107m app=testapp-rs,env=op
pod/testapp-rs-exp-gjnkk 1/1 Running 0 25s app=testapp-rs,env=op
pod/testapp-rs-exp-pmc29 1/1 Running 0 107m app=testapp-rs,env=op
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 26h component=apiserver,provider=kubernetes
NAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/testapp-rs-exp 4 4 4 107m <none>
- testapp-pod-1 파드의 레플리카셋 컨트롤러 확인
- => 컨트롤러가 사라짐
vagrant@kube-master1:~/test$ kubectl describe pods testapp-pod-1 | grep -i 'control'
vagrant@kube-master1:~/test$
728x90
'쿠버네티스 교육 > 강의 내용 정리' 카테고리의 다른 글
220623_2_k8s_컨트롤러-Job Controller (0) | 2022.06.23 |
---|---|
220623_1_k8s_컨트롤러-DaemonSet (0) | 2022.06.23 |
220622_2_k8s_파드의 생명 주기와 프로브-livenessProbe, startupProbe (0) | 2022.06.22 |
220622_1_k8s_deployment, replicaset, pod (0) | 2022.06.22 |
220621_3_k8s_네임스페이스_생성 및 삭제 (0) | 2022.06.21 |