ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [따배쿠] Controller - Replicaset
    kubernetes 2024. 12. 4. 15:10

    Replicaset

    • ReplicationController와 같은 역할을 하는 컨트롤러
    • ReplicationController보다 풍부한 selector 정의 가능
    selector:
      matchLabels:
        component: redis
      matchExpressions:
        - {key: tier, operator: In, values: [cache]}
        - {key: environment, operator: NotIn, values; [dev]
    • matchLabels
      • key: Value
    • matchExpressions 연산자
      • In : key와 values를 지정하여 key, value가 일치하는 Pod만 연결
      • NotIn : key는 일치하고 value는 일치하지 않는 Pod에 연결
      • Exists: key에 맞는 label의 pod를 연결
      • DoesNotExist : key와 다른 label의 pod를 연결
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: rs-exam1
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: webui
        matchExpressions:
        - {key: ver, operator: In, value:["2.1","2.2"]}
      temp..

     

    label은 app = webui고, version은 2.1 혹은 2.2인 pod 3개를 배포해줘

     

     

    apiVersion, kind, selector의 차이 (ReplicaionController와 비교)

     

    예시

     

    # rs-nginx.yaml 파일 작성

    root@master:~/Getting-Start-Kubernetes/6# cat rs-nginx.yaml
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: rs-nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: webui
      template:
        metadata:
          name: nginx-pod
          labels:
            app: webui
        spec:
          containers:
          - name: nginx-container
            image: nginx:1.14

     

    # 생성 및 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f rs-nginx.yaml
    replicaset.apps/rs-nginx created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pod --show-labels
    NAME             READY   STATUS    RESTARTS        AGE     LABELS
    mydb-node1       1/1     Running   1 (6h15m ago)   5m45s   <none>
    rs-nginx-7cjj2   1/1     Running   0               2m44s   app=webui
    rs-nginx-dwpgc   1/1     Running   0               2m44s   app=webui
    rs-nginx-pc6jc   1/1     Running   0               2m44s   app=webui
    root@master:~/Getting-Start-Kubernetes/6# kubectl get replicaset
    NAME       DESIRED   CURRENT   READY   AGE
    rs-nginx   3         3         3       4m31s
    root@master:~/Getting-Start-Kubernetes/6# kubectl get rs
    NAME       DESIRED   CURRENT   READY   AGE
    rs-nginx   3         3         3       4m41s

     

    # pod 1개 임의로 삭제 후 확인

    root@master:~/Getting-Start-Kubernetes/6# kubectl delete pod rs-nginx-7cjj2
    pod "rs-nginx-7cjj2" deleted
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pod
    NAME             READY   STATUS    RESTARTS        AGE
    mydb-node1       1/1     Running   1 (6h19m ago)   9m29s
    rs-nginx-dwpgc   1/1     Running   0               6m28s
    rs-nginx-jjpzh   1/1     Running   0               22s
    rs-nginx-pc6jc   1/1     Running   0               6m28s

     

    pod 삭제와 동시에 자동으로 생성되는 것을 확인 가능하다.

     

    # kubectl scale ~ 명령어로 replicaset 갯수 조정

    root@master:~/Getting-Start-Kubernetes/6# kubectl scale rs rs-nginx --replicas=2
    replicaset.apps/rs-nginx scaled
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pod
    NAME             READY   STATUS    RESTARTS        AGE
    mydb-node1       1/1     Running   1 (6h21m ago)   11m
    rs-nginx-dwpgc   1/1     Running   0               8m34s
    rs-nginx-pc6jc   1/1     Running   0               8m34s

     

    2개로 조정했더니, pod가 자동으로 삭제됐다.

     

    # 번외. --cascade = false 옵션으로 controller만 삭제하고 pod는 남겨두기 (연쇄 삭제 기능 비활성화)

    root@master:~/Getting-Start-Kubernetes/6# kubectl delete rs rs-nginx --cascade=false
    warning: --cascade=false is deprecated (boolean value) and can be replaced with --cascade=orphan.
    replicaset.apps "rs-nginx" deleted

     

    원래 controller를 지우면, controller가 관리하고 있는 pod도 자동으로 삭제가 되지만

    controller만 삭제하고 pod는 남겨두고 싶으면 --cascade = false 옵션으로 가능

     

    root@master:~/Getting-Start-Kubernetes/6# kubectl get rs
    No resources found in default namespace.
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods --show-labels
    NAME             READY   STATUS    RESTARTS        AGE   LABELS
    rs-nginx-dwpgc   1/1     Running   0               13m   app=webui
    rs-nginx-pc6jc   1/1     Running   0               13m   app=webui

     

    replicaset은 삭제가 되었지만, 그에 종속된 pod는 그대로 남아있는 것을 확인 가능

    아무도 control하지 않는 단독 pod가 되었다.

     

    # 번외2. 

     

    root@master:~/Getting-Start-Kubernetes/6# vi rc-nginx.yaml
    apiVersion: v1
    kind: ReplicationController
    metadata:
      name: rc-nginx
    spec:
      replicas: 3
      selector:
        app: webui
      template:
        metadata:
          name: nginx-pod
          labels:
            app: webui
        spec:
          containers:
          - name: nginx-container
            image: nginx:1.14

     

    현재 replicaset이 삭제된 단독 pod 2개 (label이 app=webui)가 남아있는 상태인데,

    여기서 replicationcontroller를 통해 pod(label이 app=webui)를 배포해보자

     

    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f rc-nginx.yaml
    replicationcontroller/rc-nginx created
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods --show-labels
    NAME             READY   STATUS    RESTARTS        AGE   LABELS
    rc-nginx-8hdwb   1/1     Running   0               5s    app=webui
    rs-nginx-dwpgc   1/1     Running   0               16m   app=webui
    rs-nginx-pc6jc   1/1     Running   0               16m   app=webui

     

    pod가 1개 더 추가된 것을 알 수 있고

    재밌는 사실은 기존에 단독 pod였던 2개 모두 replicationcontroller에 종속된다.

    따라서 replicationcontroller가 해당 pod들을 다 관리한다.

     

    label selector을 가지고 구분하기 때문 !!

    label은 매우매우 중요하다 ~~

     

    퀴즈

    • 다음의 조건으로 ReplicaSet을 사용하는 rc-lab.yaml 파일을 생성하고, 동작시킵니다.
      • labels (name : apache, app:main, rel:stable)을 가지는 httpd:2.2 버전의 Pod를 2개 운영합니다.
        • rs name : rs-mainui
        • container : httpd:2.2
      • 현재 디렉토리에 rs-lab.yaml 파일이 생성되어야 하고, 애플리케이션 동작은 파일을 이용해 실행합니다.
    root@master:~/Getting-Start-Kubernetes/6# vi rs-lab.yaml
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: rs-mainui
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: main
        matchExpressions:
          - {key: ver, operator: In, values: ["2.2"]}
      template:
        metadata:
          name: apache-pod
          labels:
            app: main
            ver: "2.2"
        spec:
          containers:
          - name: httpd
            image: httpd:2.2
            ports:
            - containerPort: 80
    root@master:~/Getting-Start-Kubernetes/6# kubectl create -f rs-lab.yaml
    replicaset.apps/rs-mainui created
    • 동작되는 http:2.2 버전의 컨테이너를 1개로 축소하는 명령을 적고 실행하세요.
    root@master:~/Getting-Start-Kubernetes/6# kubectl scale rs rs-mainui --replicas=1
    replicaset.apps/rs-mainui scaled
    root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
    NAME              READY   STATUS    RESTARTS   AGE
    rs-mainui-c4kv2   1/1     Running   0          4m41s

    참고 영상

    https://www.youtube.com/watch?v=78QmQdjovCc

     

     

Designed by Tistory.