kubernetes

[따배쿠] Controller - Replicaset

bbiyak2da 2024. 12. 4. 15:10

Replicaset

  • ReplicaSet은 지정된 수의 Pod 복제본이 항상 실행되도록 보장하는 컨트롤러
  • Pod가 실패하거나 삭제되면, ReplicaSet은 자동으로 새로운 Pod를 생성하여 원하는 상태를 유지
  • ReplicationController와 같은 역할을 하는 컨트롤러
  • ReplicationController보다 풍부한 selector 정의 가능
selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: NotIn, values; [dev]
  • matchLabels
    • key: Value
  • matchExpressions 연산자
    • In : key와 values를 지정하여 key, value가 일치하는 Pod만 연결
    • NotIn : key는 일치하고 value는 일치하지 않는 Pod에 연결
    • Exists: key에 맞는 label의 pod를 연결
    • DoesNotExist : key와 다른 label의 pod를 연결
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-exam1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
    matchExpressions:
    - {key: ver, operator: In, value:["2.1","2.2"]}
  temp..

 

label은 app = webui고, version은 2.1 혹은 2.2인 pod 3개를 배포해줘

 

 

apiVersion, kind, selector의 차이 (ReplicaionController와 비교)

 

예시

 

# rs-nginx.yaml 파일 작성

root@master:~/Getting-Start-Kubernetes/6# 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

 

# 생성 및 확인

root@master:~/Getting-Start-Kubernetes/6# kubectl create -f rs-nginx.yaml
replicaset.apps/rs-nginx created
root@master:~/Getting-Start-Kubernetes/6# kubectl get pod --show-labels
NAME             READY   STATUS    RESTARTS        AGE     LABELS
mydb-node1       1/1     Running   1 (6h15m ago)   5m45s   <none>
rs-nginx-7cjj2   1/1     Running   0               2m44s   app=webui
rs-nginx-dwpgc   1/1     Running   0               2m44s   app=webui
rs-nginx-pc6jc   1/1     Running   0               2m44s   app=webui
root@master:~/Getting-Start-Kubernetes/6# kubectl get replicaset
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   3         3         3       4m31s
root@master:~/Getting-Start-Kubernetes/6# kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
rs-nginx   3         3         3       4m41s

 

# pod 1개 임의로 삭제 후 확인

root@master:~/Getting-Start-Kubernetes/6# kubectl delete pod rs-nginx-7cjj2
pod "rs-nginx-7cjj2" deleted
root@master:~/Getting-Start-Kubernetes/6# kubectl get pod
NAME             READY   STATUS    RESTARTS        AGE
mydb-node1       1/1     Running   1 (6h19m ago)   9m29s
rs-nginx-dwpgc   1/1     Running   0               6m28s
rs-nginx-jjpzh   1/1     Running   0               22s
rs-nginx-pc6jc   1/1     Running   0               6m28s

 

pod 삭제와 동시에 자동으로 생성되는 것을 확인 가능하다.

 

# kubectl scale ~ 명령어로 replicaset 갯수 조정

root@master:~/Getting-Start-Kubernetes/6# kubectl scale rs rs-nginx --replicas=2
replicaset.apps/rs-nginx scaled
root@master:~/Getting-Start-Kubernetes/6# kubectl get pod
NAME             READY   STATUS    RESTARTS        AGE
mydb-node1       1/1     Running   1 (6h21m ago)   11m
rs-nginx-dwpgc   1/1     Running   0               8m34s
rs-nginx-pc6jc   1/1     Running   0               8m34s

 

2개로 조정했더니, pod가 자동으로 삭제됐다.

 

# 번외. --cascade = false 옵션으로 controller만 삭제하고 pod는 남겨두기 (연쇄 삭제 기능 비활성화)

root@master:~/Getting-Start-Kubernetes/6# 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

 

원래 controller를 지우면, controller가 관리하고 있는 pod도 자동으로 삭제가 되지만

controller만 삭제하고 pod는 남겨두고 싶으면 --cascade = false 옵션으로 가능

 

root@master:~/Getting-Start-Kubernetes/6# kubectl get rs
No resources found in default namespace.
root@master:~/Getting-Start-Kubernetes/6# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS        AGE   LABELS
rs-nginx-dwpgc   1/1     Running   0               13m   app=webui
rs-nginx-pc6jc   1/1     Running   0               13m   app=webui

 

replicaset은 삭제가 되었지만, 그에 종속된 pod는 그대로 남아있는 것을 확인 가능

아무도 control하지 않는 단독 pod가 되었다.

 

# 번외2. 

 

root@master:~/Getting-Start-Kubernetes/6# vi rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3
  selector:
    app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14

 

현재 replicaset이 삭제된 단독 pod 2개 (label이 app=webui)가 남아있는 상태인데,

여기서 replicationcontroller를 통해 pod(label이 app=webui)를 배포해보자

 

root@master:~/Getting-Start-Kubernetes/6# kubectl create -f rc-nginx.yaml
replicationcontroller/rc-nginx created
root@master:~/Getting-Start-Kubernetes/6# kubectl get pods --show-labels
NAME             READY   STATUS    RESTARTS        AGE   LABELS
rc-nginx-8hdwb   1/1     Running   0               5s    app=webui
rs-nginx-dwpgc   1/1     Running   0               16m   app=webui
rs-nginx-pc6jc   1/1     Running   0               16m   app=webui

 

pod가 1개 더 추가된 것을 알 수 있고

재밌는 사실은 기존에 단독 pod였던 2개 모두 replicationcontroller에 종속된다.

따라서 replicationcontroller가 해당 pod들을 다 관리한다.

 

label selector을 가지고 구분하기 때문 !!

label은 매우매우 중요하다 ~~

 

퀴즈

  • 다음의 조건으로 ReplicaSet을 사용하는 rc-lab.yaml 파일을 생성하고, 동작시킵니다.
    • labels (name : apache, app:main, rel:stable)을 가지는 httpd:2.2 버전의 Pod를 2개 운영합니다.
      • rs name : rs-mainui
      • container : httpd:2.2
    • 현재 디렉토리에 rs-lab.yaml 파일이 생성되어야 하고, 애플리케이션 동작은 파일을 이용해 실행합니다.
root@master:~/Getting-Start-Kubernetes/6# vi 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
root@master:~/Getting-Start-Kubernetes/6# kubectl create -f rs-lab.yaml
replicaset.apps/rs-mainui created
  • 동작되는 http:2.2 버전의 컨테이너를 1개로 축소하는 명령을 적고 실행하세요.
root@master:~/Getting-Start-Kubernetes/6# kubectl scale rs rs-mainui --replicas=1
replicaset.apps/rs-mainui scaled
root@master:~/Getting-Start-Kubernetes/6# kubectl get pods
NAME              READY   STATUS    RESTARTS   AGE
rs-mainui-c4kv2   1/1     Running   0          4m41s

참고 영상

https://www.youtube.com/watch?v=78QmQdjovCc