개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 쿠버네티스 핵심 개념-레플리케이션 컨트롤러와 레플리카셋

nineDeveloper 2020. 12. 1.
728x90

ReplicaSet

레플리케이션컨트롤러

  • 포드가 항상 실행되도록 유지하는 쿠버네티스 리소스
  • 노드가 클러스터에서 사라지는 경우 해당 포드를 감지하고 대체 포드 생성
  • 실행 중인 포드의 목록을 지속적으로 모니터링으로 하고 '유형'의 실제 포드 수가 원하는 수와 항상 일치하는지 확인

레플리케이션(Replication): 데이터 저장과 백업하는 방법과 관 련이 있는 데이터를 호스트 컴퓨터에서 다른 컴퓨터로 복사하는 것 (위키백과)

레플리케이션컨트롤러의 세 가지 요소

  • 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
  • 실행해야 하는 포드의 수를 결정하는 복제본 수
  • 새로운 포드의 모양을 설명하는 포드 템플릿

레플리케이션컨트롤러의 장점

  • 포드가 없는 경우 새 포드를 항상 실행
  • 노드에 장애 발생 시 다른 노드에 복제복 생성
  • 수동, 자동으로 수평 스케일링

레플리케이션컨트롤러의 YAML 작성

https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/#running-an-example-replicationcontroller

  • http-go-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  # 레플리케이션컨트롤러 이름
  name: http-go
spec:
  # 실행해야 하는 포드의 수를 결정하는 복제본 수
  replicas: 3
  # 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
  selector:
    app: http-go

  # 새로운 포드의 모양을 설명하는 포드 템플릿
  template:
    # 포드와 완전히 동일
    metadata:
      name: http-go
      labels:
        app: http-go
    spec:
      containers:
      - name: http-go
        image: gasbugs/http-go
        ports:
        - containerPort: 9080
  • 실행 중인 레플리케이션컨트롤러와 포드 확인
$ kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
http-go-ffbjw   1/1     Running   0          23s
http-go-s6fkl   1/1     Running   0          23s
http-go-xzgr4   1/1     Running   0          23s

$ kubectl get rc
NAME      DESIRED   CURRENT   READY   AGE
http-go   3         3         3       17s
  • 포드를 임의로 정지시켜 반응 확인
$ kubectl delete pod http-go-ffbjw
pod "http-go-ffbjw" deleted

$ kubectl get pod
http-go-5z7hf   1/1     Running   0          9s
http-go-s6fkl   1/1     Running   0          3m25s
http-go-xzgr4   1/1     Running   0          3m25s

레플리케이션 정보 확인

$ kubectl describe rc http-go
Name:         http-go
Namespace:    default
Selector:     app=http-go
Labels:       app=http-go
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=http-go
  Containers:
   http-go:
    Image:        gasbugs/http-go
    Port:         9080/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                    Message
  ----    ------            ----   ----                    -------
  Normal  SuccessfulCreate  4m13s  replication-controller  Created pod: http-go-ffbjw
  Normal  SuccessfulCreate  4m13s  replication-controller  Created pod: http-go-xzgr4
  Normal  SuccessfulCreate  4m13s  replication-controller  Created pod: http-go-s6fkl
  Normal  SuccessfulCreate  57s    replication-controller  Created pod: http-go-5z7hf

노드 통신 직접 다운시켜 보기

  • GCP 에서 테스트 시
$ gcloud compute ssh gke-standard-cluster-1-default-pool-b1e2cd6b-z2nd
$ sudo ifconfig eth0 down
  • VirtualBox 에서 테스트 시
    • work2 node 네트워크 연결 끊기
$ kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   73d   v1.19.2
work1    Ready    <none>   73d   v1.19.2
work2    Ready    <none>   73d   v1.19.2
work2    NotReady   <none>   73d   v1.19.2

레플리카컨트롤러의 관리 레이블 벗어나기

  • 포드의 레이블이 변경되어 관리 밖으로 벗어나면 이를 건드리지 않고 새로운 포드를 생성
$ kubectl get pod -L app
NAME            READY   STATUS    RESTARTS   AGE   APP
http-go-5z7hf   1/1     Running   0          22m   http-go
http-go-s6fkl   1/1     Running   0          26m   http-go
http-go-xzgr4   1/1     Running   0          26m   http-go

$ kubectl label pod http-go-5z7hf app=http-go2 --overwrite
pod/http-go-5z7hf labeled

$ kubectl get pod -L app
NAME            READY   STATUS              RESTARTS   AGE   APP
http-go-5z7hf   1/1     Running             0          23m   http-go2
http-go-qnnzz   0/1     ContainerCreating   0          2s    http-go
http-go-s6fkl   1/1     Running             0          27m   http-go
http-go-xzgr4   1/1     Running             0          27m   http-go

레플리케이션컨트롤러 설정 바꾸기

  • 다음 명령어로 replicationcontroller 설정파일 접근

  • 임시 디렉토리에 접근해서 수정을 하면 바로 반영이 됨

  • pod은 이런 방식으로 수정할 수 없음

  • deployment 나 replicationcontroller 옵션만 수정됨

    • 다른 옵션은 수정이 되는 것처럼 보이지만 임시 디렉토리에 저장만되고 수정되지 않음
  • vim이 열리면 replicas 개수를 3에서 20개로 수정하고 저장 종료

    $ kubectl edit rc http-go
  • 포드의 수 변화 확인

$ kubectl get pod
NAME            READY   STATUS              RESTARTS   AGE
http-go-46592   1/1     Running             0          20s
http-go-5vxc2   0/1     ContainerCreating   0          20s
http-go-5z7hf   1/1     Running             0          26m
http-go-68l4r   0/1     ContainerCreating   0          20s
http-go-785n6   1/1     Running             0          20s
http-go-89lvp   0/1     ContainerCreating   0          20s
http-go-97czq   1/1     Running             0          20s
http-go-9p4wm   1/1     Running             0          20s
http-go-bmngp   0/1     ContainerCreating   0          20s
http-go-clh8k   0/1     ContainerCreating   0          20s
http-go-f55dm   1/1     Running             0          20s
http-go-fmwgk   1/1     Running             0          20s
http-go-frc6j   1/1     Running             0          20s
http-go-hffzq   0/1     ContainerCreating   0          20s
http-go-m4fhc   0/1     ContainerCreating   0          20s
http-go-ms4wz   1/1     Running             0          20s
http-go-nnlck   1/1     Running             0          20s
http-go-qnnzz   1/1     Running             0          2m4s
http-go-s6fkl   1/1     Running             0          29m
http-go-wvhg9   1/1     Running             0          20s
http-go-xzgr4   1/1     Running             0          29m
  • 다음 명령어로 레플리케이션컨트롤러 설정 변경
$ kubectl scale rc http-go --replicas=10
replicationcontroller/http-go scaled

$ kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
http-go-46592   1/1     Running   0          102s
http-go-5z7hf   1/1     Running   0          27m
http-go-97czq   1/1     Running   0          102s
http-go-9p4wm   1/1     Running   0          102s
http-go-f55dm   1/1     Running   0          102s
http-go-ms4wz   1/1     Running   0          102s
http-go-nnlck   1/1     Running   0          102s
http-go-qnnzz   1/1     Running   0          3m26s
http-go-s6fkl   1/1     Running   0          30m
http-go-wvhg9   1/1     Running   0          102s
http-go-xzgr4   1/1     Running   0          30m
  • 다른 설정파일을 적용하여 레플리케이션컨트롤러 설정 변경
    • 파일을 copy 해서 replicas: 5 수정 후 apply
$ kubectl apply -f http-go-rc-v2.yaml
replicationcontroller/http-go created

$ kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
http-go-2v82m   1/1     Running   0          9m56s
http-go-2vkst   1/1     Running   0          10s
http-go-44ts8   1/1     Running   0          10s
http-go-dztth   1/1     Running   0          9m56s
http-go-mfnt6   1/1     Running   0          9m56s

레플리케이션컨트롤러 삭제 바꾸기

  • 일반적인 삭제 명령어와 동일
$ kubectl delete rc http-go
replicationcontroller "http-go" deleted
  • 실행 시키고 있는 포드는 계속 실행을 유지하고 싶은 경우에는 --cascade 옵션 사용
$ kubectl delete rc http-go --cascade=false
replicationcontroller "http-go" deleted

$ kubectl get pod
NAME            READY   STATUS    RESTARTS   AGE
http-go-2v82m   1/1     Running   0          39s
http-go-dztth   1/1     Running   0          39s
http-go-mfnt6   1/1     Running   0          39s

레플리카셋의 등장

  • 쿠버네티스 1.8버전부터 디플로이먼트(Deployment), 데몬셋(Daemonset), 레플리카셋(ReplicaSet), 스테이트풀셋(SatetfulSet) 네 API가 베타로 업데이트되고 1.9 버전에서는 정식 버전으로 업데이트됨
  • 레플리카셋은 차세대 레플리케이션컨트롤러로 레플리케이션컨트롤러를 완전히 대체 가능
  • 초기 쿠버네티스에서 제공했기 때문에 현장에서는 여전히 계속 사용중인 경우 존재

레플리케이션컨트롤러 vs. 레플리카셋

  • 레플리카셋과 레플리케이션컨트롤러은 거의 동일하게 동작
  • 레플리카셋이 더 풍부한 표현식 포드 셀렉터 사용 가능
    • 레플리케이션컨트롤러: 특정 레이블을 포함하는 포드가 일치하는지 확인
    • 레플리카셋: 특정 레이블이 없거나 해당 값과 관계없이 특정 레이블 키를 포함하는 포드를 매치하는지 확인

레플리카셋 생성

https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/#example

  • 대부분의 요소는 거의 비슷
  • apiVersion: apps/v1beta2
  • kind: ReplicaSet
  • matchExpressions: 레이블을 매칭하는 별도의 표현 방식 존재
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  # 레플리케이션컨트롤러 이름
  name: http-go
spec:
  # 실행해야 하는 포드의 수를 결정하는 복제본 수
  replicas: 3
  # 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
  selector:
    matchExpressions:
    - key: app
      operator: In
      values:
      - http-go
  # 새로운 포드의 모양을 설명하는 포드 템플릿
  template:
    # 포드와 완전히 동일
    metadata:
      labels:
        app: http-go
    spec:
      containers:
      - name: http-go
        image: gasbugs/http-go
        ports:
        - containerPort: 9080
$ kubectl get pod --show-labels
NAME             READY   STATUS    RESTARTS   AGE     LABELS
http-go-rs-7smqc   1/1     Running   0          2m44s   app=http-go
http-go-rs-blrgz   1/1     Running   0          2m44s   app=http-go
http-go-rs-f76tz   1/1     Running   0          2m44s   app=http-go

레플리카셋의 조회와 삭제

  • 다른 리소스와 모두 동일
  • 조회: $ kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
http-go-rs   3         3         3       47s
  • 상세조회: $ kubectl describe rs http-go-rs
$ kubectl describe rs http-go-rs
Name:         http-go-rs
Namespace:    default
Selector:     app=http-go-rs
Labels:       <none>
Annotations:  <none>
Replicas:     10 current / 10 desired
Pods Status:  10 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=rs-nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         9080/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  3m54s  replicaset-controller  Created pod: http-go-rs-7smqc
  Normal  SuccessfulCreate  3m54s  replicaset-controller  Created pod: http-go-rs-blrgz
  Normal  SuccessfulCreate  3m54s  replicaset-controller  Created pod: http-go-rs-f76tz
  • 삭제 $ kubectl delete rs http-go-rs

연습문제

  • nginx를 3개 생성하는 rs-nginx 레플리카셋을 생성하라
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  # 레플리케이션컨트롤러 이름
  name: rs-nginx
spec:
  # 실행해야 하는 포드의 수를 결정하는 복제본 수
  replicas: 3
  # 레플리케이션컨트롤러가 관리하는 포드 범위를 결정 하는 레이블 셀렉터
  selector:
    matchLabels:
      app: rs-nginx

  # 새로운 포드의 모양을 설명하는 포드 템플릿
  template:
    # 포드와 완전히 동일
    metadata:
      labels:
        app: rs-nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 9080
  • rs-nginx 포드의 개수를 10개로 스케일링하라
$ kubectl edit rs rs-nginx
replicaset.apps/rs-nginx edited

NAME             READY   STATUS              RESTARTS   AGE
rs-nginx-7smqc   1/1     Running             0          82s
rs-nginx-blrgz   1/1     Running             0          82s
rs-nginx-f76tz   1/1     Running             0          82s
rs-nginx-g2lms   0/1     ContainerCreating   0          5s
rs-nginx-g52wg   0/1     ContainerCreating   0          5s
rs-nginx-gcj6s   0/1     ContainerCreating   0          5s
rs-nginx-gq4fj   0/1     ContainerCreating   0          5s
rs-nginx-jl4qk   0/1     ContainerCreating   0          5s
rs-nginx-l22vq   0/1     ContainerCreating   0          5s
rs-nginx-xrzqr   0/1     ContainerCreating   0          5s
728x90

댓글

💲 추천 글