쿠버네티스 교육/강의 내용 정리

220622_3_k8s_컨트롤러-ReplicaSet Controller

kimhope 2022. 6. 22. 18:26
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