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 selector5
번은 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