본문 바로가기

Container/Kubernetes

[K8S] ReplicaSet

ReplicaSet (RS)
- ReplicaController와 같은 역할(=Pod의 갯수 보장)을 하는 컨트롤러
- ReplicaController보다 풍부한 Selector 지원

 

# Self Healing

Kubernetes는 ReplicaSets 및 Replication Controller를 통해 Self Healing 응용프로그램을 지원한다.

Replication Controller 는 POD 내의 응용프로그램이 충돌할 때 자동으로 POD가 다시 생성되도록 도와준다.

응용프로그램의 replicas가 항상 충분히 실행될 수 있도록 도와준다.


selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key:tier, operator: In, values: [cache] }
    - {key: environment, operator: NotIn, values: [dev] }
    - {key: version, operator: In, value: ["2.1", "2.2"]}

matchLabels:
  key: value

연산자

* In : key와 value를 지정하여 key, value가 일치하는 Pod만 연결
* NotIn : key는 일치하고 value는 일치하지 않는 Pod에 연결
* Exists : key에 맞는 label의 pod를 연결 (존재하기만 하면 됨)
* DoesNotExist: : key와 다른 label의 Pod 연결

 

RC / RS 비교

 

[master ~]$ 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

[master ~]$ kubectl create -f rs-nginx.yaml 
replicaset.apps/rs-nginx created

# 3개 생성 확인
[master ~]$ kubectl get pods -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP         NODE    NOMINATED NODE   READINESS GATES
rs-nginx-kq9rj   1/1     Running   0          6s    10.5.1.4   node2   <none>           <none>
rs-nginx-m5c46   1/1     Running   0          6s    10.5.1.5   node2   <none>           <none>
rs-nginx-mgbjb   1/1     Running   0          6s    10.5.2.3   node3   <none>           <none>
[master ~]$ kubectl get pod --show-labels
NAME             READY   STATUS    RESTARTS   AGE   LABELS
rs-nginx-kq9rj   1/1     Running   0          11s   app=webui
rs-nginx-m5c46   1/1     Running   0          11s   app=webui
rs-nginx-mgbjb   1/1     Running   0          11s   app=webui


[master ~]$ kubectl get replicaset
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   3         3         3       55s
[master ~]$ kubectl get rs        
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   3         3         3       61s

# Pod 하나 삭제시
[master ~]$ kubectl delete pod rs-nginx-kq9rj
pod "rs-nginx-kq9rj" deleted

# 새로운 파드 생성 (= 총 갯수 유지)
[master ~]$ kubectl get pods      
NAME             READY   STATUS    RESTARTS   AGE
rs-nginx-m5c46   1/1     Running   0          113s
rs-nginx-mgbjb   1/1     Running   0          113s
rs-nginx-tqdgb   1/1     Running   0          6s

# Scale-out/down
[master ~]$ kubectl scale rs rs-nginx --replicas=2
replicaset.apps/rs-nginx scaled

 

# 컨트롤러를 지우면 연관된 Pod를 같이 지워버린다.
$ kubectl delete rs rs-nginx  

# Pod는 놔두고 RS만 지우기를 원할 때
[master ~]$ 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
[master ~]$ kubectl get rs
No resources found in default namespace.
[master ~]$ kubectl get pods --show-labels 
NAME             READY   STATUS    RESTARTS   AGE     LABELS
rs-nginx-m5c46   1/1     Running   0          6m26s   app=webui
rs-nginx-mgbjb   1/1     Running   0          6m26s   app=webui
# 아무도 컨트롤 하지 않는 단독 Pod로 바뀌었다.

 

 

[실습]

 

[master ~]$ cat > 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
        
[master ~]$ kubectl create -f rs-lab.yaml 
replicaset.apps/rs-mainui created

[master ~]$ kubectl get rs
NAME        DESIRED   CURRENT   READY   AGE
rs-mainui   2         2         2       52s

[master ~]$ kubectl get pods -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP         NODE    NOMINATED NODE   READINESS GATES
rs-mainui-b8wlp   1/1     Running   0          44s   10.5.2.5   node3   <none>           <none>
rs-mainui-tzltd   1/1     Running   0          44s   10.5.1.6   node2   <none>           <none>

[master ~]$ kubectl get pods --show-labels
NAME              READY   STATUS    RESTARTS   AGE   LABELS
rs-mainui-b8wlp   1/1     Running   0          60s   app=main,ver=2.2
rs-mainui-tzltd   1/1     Running   0          60s   app=main,ver=2.2

# 해당 httpd:2.2 컨테이너를 1개로 축소하려면
[master ~]$ kubectl scale rs rs-mainui --replicas=1
replicaset.apps/rs-mainui scaled

[master ~]$ kubectl get pods --show-labels
NAME              READY   STATUS    RESTARTS   AGE     LABELS
rs-mainui-tzltd   1/1     Running   0          2m32s   app=main,ver=2.2

 

  • yaml파일로 Scale 하기
# yaml 파일 수정 후
$ kubectl replace -f replicaset-definition.yml

# 또는
$ kubectl scale --replicas=6 -f replicaset-definition.yml

$ kubectl scale --replicas=6 replicaset myapp-replicaset
#                            --------type ---------------name

$ kubectl edit rs new-replica-set 
replicaset.apps/new-replica-set edited
반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] DaemonSet  (0) 2024.02.26
[K8S] Deployment - RollingUpdate  (0) 2024.02.21
[K8S] ReplicationController  (0) 2024.02.19
[K8S] Pod 환경 변수 설정  (0) 2024.02.19
[K8S] Pod Resource 할당  (0) 2024.02.19