ch4. Replication and other controllers: deploying managed pods
소챕터들
- 4.1 keeping pods healthy
- 4.2. introducing replicationcontrollers
- 4.3. using replicasets instead of replicationcontroller
- 4.4. running exactly one pod on each node with daemonset
- 4.5. running pods that perform a single completable task
- 4.6. scheduling jobs to run periodically or once in the future
4.2 Introducing replicationcontrollers
참고: 최신 Kubernetes 문서에 따르면
ReplicaSett을 구성하는Deployment가 현재 권장되는 설정 방법이라고 한다. 따라서 요번 장은 별로 정리하지 않음. 문서 참고.
ReplicationController는 세가지 필수적인 파트로 나뉨
- label selector
- replica count
- pod template
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 createdSeeing 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   fooChanging 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 scaledkubectl scsle 옵션 대신 ReplicationController의 정의를 수정할 수도 있다.
$ kubectl edit rc kubiareplicas를 10으로 수정하고 확인해보자.
$ kubectl get rc
NAME    DESIRED   CURRENT   READY   AGE
kubia   10        10        0       47hscale down도 동일하게 해주면 된다.
Deleting a ReplicationController
kubectl delete 명령어를 사용하여 ReplicationController를 제거하면 pod들도 같이 지워진다.그렇게 하지 않고 RC만 지울 수도 있음 (--cascade=false 옵션)
$ kubectl delete rc kubia --cascade=false
replicationcontroller "kubia" deleted