콤퓨우터/필기: KodeKloud CKA 강의

29-32. ReplicaSet과 Deployment

파란화면 2024. 5. 14. 22:22
반응형

ReplicationController는 구세대 기술로 ReplicaSet으로 대체되고있다

ReplicationController

  • ReplicationController/ReplicaSet은 쿠버네티스 클러스터 상에서 하나의 Pod에 대한 인스턴스 여려 개를 구동할 수 있게 하여 HA(High Availability)를 제공
  • 하나의 Pod만 존재하는 상황에서도 ReplicationController는 Pod 하나가 죽더라도 자동으로 Pod를 새로 만들어주므로, 쓸모가 있음
  • 단일 ReplicationController 아래에 여러 노드의 Pod이 있을 수 있음
apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp-rc
  labels:
    app: myapp
    type: front-end

spec: 
  template:
    # 여기에 탬플릿 - 즉 Replicated될 Pod의 definition 대부분을 복붙하면 된다
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: frontend
    spec:
      containers:
        - name: nginx-container
          image: nginx

  replicas: 3 # 레플리카의 수

똑같이 kubectl create / kubectl apply로 적용, kubectl get replicationcontroller로 확인
ReplicationController에 의해 돌아가고있는 레플리카 Pod들을 보려면 kubectl get pods로 확인 - 3개의 Pod가 있는 것을 확인가능

ReplicaSet

우선 Object definition 설정파일을 보자.

apiVersion: apps/v1  # apps/v1임에 주의
kind: ReplicaSet
metadata:
  name: myapp-rs
  labels:
    app: myapp
    type: front-end

spec: 
  template:
    # 여기에 탬플릿 - 즉 Replicated될 Pod의 definition 대부분을 복붙하면 된다
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: frontend
    spec:
      containers:
        - name: nginx-container
          image: nginx

  replicas: 3 # 레플리카의 수, 여기까지는 거의 똑같음
  selector: # ReplicaSet에 의해 생성되지 않은 Pod에 대해서도 관리하려면 여기에서 label 매칭 필요
    matchedLabels:
      type: frontend 

spec.selector 섹션의 존재가 ReplicationContainer와의 차이점 중 하나 - 어떤 Pod이 ReplicaSet 아래에 존재할것인가를 지정하는 섹션

  • 하지만 왜 존재하는가? spec.template 에 이미 Pod specification을 적어놨는데?
    • ReplicaSet은 그 외의 Pod도 관리하기때문이다
    • 만약 ReplicaSet의 생성전에 생성되었던 Pod의 label이 selector와 일치한다면, ReplicaSet은 그 Pod들도 Replica 생성시에 고려한다
      • 이 경우 matchedLabels 아래에 type: frontend가 있으므로 해당 type을 label 메타데이터로 가지고있는 Pod들이 해당

ReplicaSet의 역할은 Pod를 모니터하고, 이 중 하나가 fail하면 새로운 Pod를 Deploy하는 데에 있음
메타데이터 label 필터를 통해 해당 ReplicaSet이 모니터링해야 할 Pod를 선택

  • 하지만 그렇다고 ReplicaSet 설정의 spec > template: 부분을 날려버리면 안됨
    • 기존에 수동으로 올린 Pod은 언젠가 죽을 텐데, 이 경우 살려내야 할 것이기 때문

ReplicaSet의 설정을 바꾸려면?

예를들어 replicas: 6으로 바꾼다고 하면

  • kubectl replace -f 뭐시기.yml 하면 된다
  • kubectl scale --replicas=6 -f 뭐시기.yml
    • 이 경우에는 설정파일의 replicas 옵션이 업데이트되지 않는다
# kubectl scale --replicas=5 replicaset new-replica-set
replicaset.apps/new-replica-set scaled

Replica의 수를 줄이면

필요없는 만큼 알아서 죽는다

# kubectl scale --replicas=2 replicaset new-replica-set
replicaset.apps/new-replica-set scaled

# kubectl get pods
NAME                    READY   STATUS        RESTARTS   AGE
new-replica-set-cnckh   1/1     Running       0          109s
new-replica-set-j8757   1/1     Running       0          102s
new-replica-set-w6ctk   1/1     Terminating   0          39s
new-replica-set-49cht   1/1     Terminating   0          90s
new-replica-set-sddl8   1/1     Terminating   0          116s

실습

controlplane ~ ➜  kubectl get replicasets
NAME              DESIRED   CURRENT   READY   AGE
new-replica-set   4         4         0       69s

이러면 이름이 new-replica-set인 ReplicaSet이 1개 있는것이다

  • 해당 ReplicaSet은 4개의 Pod으로 구성
controlplane ~ ➜  kubectl describe replicasets
Name:         new-replica-set
Namespace:    default
Selector:     name=busybox-pod
Labels:       <none>
Annotations:  <none>
Replicas:     4 current / 4 desired
Pods Status:  0 Running / 4 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  name=busybox-pod
  Containers:
   busybox-container:
    Image:      busybox777
    Port:       <none>
    Host Port:  <none>
    Command:
      sh
      -c
      echo Hello Kubernetes! && sleep 3600
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  2m55s  replicaset-controller  Created pod: new-replica-set-c86nb
  Normal  SuccessfulCreate  2m55s  replicaset-controller  Created pod: new-replica-set-gtk68
  Normal  SuccessfulCreate  2m55s  replicaset-controller  Created pod: new-replica-set-jdzqn
  Normal  SuccessfulCreate  2m55s  replicaset-controller  Created pod: new-replica-set-zqsbv

이 ReplicaSet은 READY되고 있지 않는데...

controlplane ~ ➜  kubectl get pods
NAME                    READY   STATUS             RESTARTS   AGE
new-replica-set-c86nb   0/1     ImagePullBackOff   0          3m41s
new-replica-set-gtk68   0/1     ImagePullBackOff   0          3m41s
new-replica-set-jdzqn   0/1     ImagePullBackOff   0          3m41s
new-replica-set-zqsbv   0/1     ImagePullBackOff   0          3m41s

그 이유는 busybox777이라는 이름의 image가 없기때문이다

Pod 중 하나를 삭제해보기

controlplane ~ ✖ kubectl delete pod new-replica-set-c86nb
pod "new-replica-set-c86nb" deleted
controlplane ~ ➜  kubectl get pods
NAME                    READY   STATUS             RESTARTS   AGE
new-replica-set-gtk68   0/1     ImagePullBackOff   0          5m49s
new-replica-set-jdzqn   0/1     ImagePullBackOff   0          5m49s
new-replica-set-zqsbv   0/1     ImagePullBackOff   0          5m49s
new-replica-set-ncsgr   0/1     ImagePullBackOff   0          27s

없애자마자 ReplicaSet에서 새 Pod을 만들어냈다 (27s ago)

controlplane ~ ➜  kubectl create -f /root/replicaset-definition-2.yaml 
The ReplicaSet "replicaset-2" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"tier":"nginx"}: `selector` does not match template `labels`

이유:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-2
spec:
  replicas: 2
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend //여기가 잘못됐었음
    spec:
      containers:
      - name: nginx
        image: nginx

Deployment

ReplicaSet(와 그 아래에 있는 여러 Pod) 개념을 추상화하여놓은것

Depolyment의 장점

  • Rolling Updates (떠 있는 여러 포드를 순차 업데이트)
  • Rollback
  • pause / resume

Deplyoment 설정 파일은 ReplicaSet 설정파일과 매우 비슷하다

apiVersion: apps/v1  # apps/v1임에 주의
kind: Deployment
metadata:
  name: myapp-dep
  labels:
    app: myapp
    type: front-end

spec: 
  template:
    metadata:
      name: myapp-pod
      labels:
        app: myapp
        type: frontend
    spec:
      containers:
      - name: nginx-container
        image: nginx

  replicas: 3
  selector:
    matchedLabels:
      type: frontend

이러한 설정의 Deployment를 돌리면 다음과 같은 결과를 얻을수있다

# kubectl create -f aaa.yml
deployment "myapp-dep" created

# kubectl get deployments
NAME       DESIRED ...
myapp-dep  3       ...

# kubectl get replicaset
NAME                       DESIRED ...
myapp-deployment-asdfbsdf  3       ...

# kubectl get pods
NAME                                 READY ...
myapp-deployment-asdfbsdf-csdfdsdf   1/1   ...
myapp-deployment-asdfbsdf-esdffsdf   1/1   ...
myapp-deployment-asdfbsdf-gsdfhsdf   1/1   ...
반응형