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들이 해당
- 이 경우 matchedLabels 아래에
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 ...
'콤퓨우터 > 필기: KodeKloud CKA 강의' 카테고리의 다른 글
44. Imperative v. Declarative (0) | 2024.05.14 |
---|---|
41. Namespaces (0) | 2024.05.14 |
36. Services (0) | 2024.05.14 |
22. Pods with YAML (0) | 2024.05.14 |
16-20. kube-apiserver, kube-controller-manager, kube-scheduler, kubelet, kube-proxy (0) | 2024.05.14 |