[따배쿠] Controller - Replicaset
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 파일이 생성되어야 하고, 애플리케이션 동작은 파일을 이용해 실행합니다.
- labels (name : apache, app:main, rel:stable)을 가지는 httpd:2.2 버전의 Pod를 2개 운영합니다.
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