backend/kubernetes in action

[kubernetes in action] 4-2. Introducing repliactioncontrollers

seul chan 2020. 5. 27. 21:31

ch4. Replication and other controllers: deploying managed pods

소챕터들

4.2 Introducing replicationcontrollers

참고: 최신 Kubernetes 문서에 따르면 ReplicaSett을 구성하는 Deployment가 현재 권장되는 설정 방법이라고 한다. 따라서 요번 장은 별로 정리하지 않음. 문서 참고.

ReplicationController는 세가지 필수적인 파트로 나뉨

  • label selector
  • replica count
  • pod template

!image

Creating a ReplicationController

kubia-rc.yaml을 통해 ReplicationController를 만들어 보자

apiVersion: v1
kind: ReplicationController        1
metadata:
  name: kubia                      2
spec:
  replicas: 3                      3
  selector:                        4
    app: kubia                     4
  template:                        5
    metadata:                      5
      labels:                      5
        app: kubia                 5
    spec:                          5
      containers:                  5
      - name: kubia                5
        image: luksa/kubia         5
        ports:                     5
        - containerPort: 8080      5
  • 4번은 ReplicationController가 사용할 pod selector
  • 5번은 ReplicationController가 참고하여 만들 pod 정보.

selector를 지정하지 않으면 Kubernetes가 pod template에서 참고하여 만든다. 이렇게 하는게 더 쉽고 심플함

$ kubectl create -f kubia-rc.yaml
replicationcontroller/kubia created

Seeing the ReplicationController in action

기존에 app=kubia인 pod가 없었기 때문에 ReplicationController는 이를 pod template으로부터 만든다.

$ kubectl get pods
NAME          READY   STATUS              RESTARTS   AGE
kubia-5pcc6   0/1     ContainerCreating   0          15s
kubia-c6fzz   0/1     ContainerCreating   0          15s
kubia-z4z9n   0/1     ContainerCreating   0          15s

이제 이 중 하나의 pod를 없애서 ReplicationController가 이를 다시 만들어내는지 확인해보자.

$ kubectl delete pod kubia-5pcc6
pod "kubia-5pcc6" deleted
$ kubectl get pods
NAME          READY   STATUS        RESTARTS   AGE
kubia-5pcc6   1/1     Terminating   0          2m46s
kubia-c7tpw   1/1     Running       0          6s
kubia-lc8hh   1/1     Running       0          56s
kubia-z4z9n   1/1     Running       0          2m46s

새로운 pod가 생긴 것을 볼 수 있다

kubectl get을 통해 ReplicationController의 상태를 볼 수 있다.

$ kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
kubia   3         3         3       3m21s

다른 object들과 마찬가지로 kubectl describe를 사용하여 더 자세한 정보를 볼 수 있따.

Moving pods in and out of the scope of a ReplicationController

ReplicationController에 의해 만들어진 pod들은 이들과 전혀 묶일 수 없다. ReplicationController는 label selector를 사용하여 pod들과 매칭된다. 따라서 pod의 label을 변경하면 ReplicationController의 scope에 추가하거나 빠질 수 있다.

$ kubectl label pod kubia-z4z9n type=special
pod/kubia-z4z9n labeled

$ kc get po --show-labels
NAME          READY   STATUS    RESTARTS   AGE   LABELS
kubia-c7tpw   1/1     Running   0          11m   app=kubia
kubia-lc8hh   1/1     Running   0          12m   app=kubia
kubia-z4z9n   1/1     Running   0          14m   app=kubia,type=special

$ kubectl label pod kubia-z4z9n app=foo --overwrite
pod/kubia-z4z9n labeled

$ kubectl get pods -L app
NAME          READY   STATUS              RESTARTS   AGE   APP
kubia-c7tpw   1/1     Running             0          12m   kubia
kubia-lc8hh   1/1     Running             0          13m   kubia
kubia-wlzb4   0/1     ContainerCreating   0          3s    kubia
kubia-z4z9n   1/1     Running             0          15m   foo

Changing the pod template

ReplicationController의 pod template은 아무때나 변경이 가능하다. 이는 pod template이 변경 된 이후에 생성되는 pod에만 적용된다. 이전 pod를 수정하기 위해서는 기존 pod들을 지워서 ReplicationController가 이들을 대체하는 pod를 만들게 하여야한다.

예시로 kubia replicationcontroller를 수정해보자.

$ kubectl edit rc kubia

이는 ReplicationController의 YAML 정의를 열어준다. template.metadata에 새로운 라벨을 추가한 후 저장해보자.

  template:
    metadata:
      creationTimestamp: null
      labels:
        app: kubia
        newlabel: kubia  # 요걸 추가함

kubectl edit이 사용할 에디터를 변경하려면 다음 내용을 ~/.bashrc~/.zshrc에 추가해주자.

export KUBE_EDITOR="/usr/bin/vim"

Horizontally scaling pods

$ kubectl scale rc kubia --replicas=10
replicationcontroller/kubia scaled

kubectl scsle 옵션 대신 ReplicationController의 정의를 수정할 수도 있다.

$ kubectl edit rc kubia

replicas를 10으로 수정하고 확인해보자.

$ kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
kubia   10        10        0       47h

scale down도 동일하게 해주면 된다.

Deleting a ReplicationController

kubectl delete 명령어를 사용하여 ReplicationController를 제거하면 pod들도 같이 지워진다.그렇게 하지 않고 RC만 지울 수도 있음 (--cascade=false 옵션)

$ kubectl delete rc kubia --cascade=false
replicationcontroller "kubia" deleted