[Udemy] ReplicaSet
ReplicaSet
- ReplicaSet은 지정된 수의 Pod 복제본이 항상 실행되도록 보장하는 컨트롤러
- Pod가 실패하거나 삭제되면, ReplicaSet은 자동으로 새로운 Pod를 생성하여 원하는 상태를 유지
- ReplicaSet을 사용하여 여러 개의 파드 복제본을 관리할 때, 서비스(Service)를 활용하여 이러한 파드에 대한 로드 밸런싱을 제공
ReplicaSet 생성
# replicaset-demo.yml 파일 작성
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-helloworld-rs
labels:
app: my-helloworld
spec:
replicas: 6
selector:
matchLabels:
app: my-helloworld
template:
metadata:
labels:
app: my-helloworld
spec:
containers:
- name: my-helloworld-app
image: stacksimplify/kube-helloworld:1.0.0
# replicaset 생성
kubectl create -f replicaset-demo.yml
replicaset.apps/my-helloworld-rs created
# replicaset 확인
kubectl get rs
NAME DESIRED CURRENT READY AGE
my-helloworld-rs 6 6 6 2m4s
kubectl describe rs
Name: my-helloworld-rs
Namespace: default
Selector: app=my-helloworld
Labels: app=my-helloworld
Annotations: <none>
Replicas: 6 current / 6 desired
Pods Status: 6 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=my-helloworld
Containers:
my-helloworld-app:
Image: stacksimplify/kube-helloworld:1.0.0
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m41s replicaset-controller Created pod: my-helloworld-rs-kkklm
Normal SuccessfulCreate 3m41s replicaset-controller Created pod: my-helloworld-rs-tmbcr
Normal SuccessfulCreate 3m41s replicaset-controller Created pod: my-helloworld-rs-r55cx
Normal SuccessfulCreate 3m41s replicaset-controller Created pod: my-helloworld-rs-28v29
Normal SuccessfulCreate 3m41s replicaset-controller Created pod: my-helloworld-rs-wlx6b
Normal SuccessfulCreate 3m41s replicaset-controller Created pod: my-helloworld-rs-zzznq
replicaset을 6으로 지정하여, pod 6개를 확인할 수 있다
# pod 확인
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-helloworld-rs-28v29 1/1 Running 0 13m
my-helloworld-rs-kkklm 1/1 Running 0 13m
my-helloworld-rs-r55cx 1/1 Running 0 13m
my-helloworld-rs-tmbcr 1/1 Running 0 13m
my-helloworld-rs-wlx6b 1/1 Running 0 13m
my-helloworld-rs-zzznq 1/1 Running 0 13m
ReplicaSet을 Service를 통해 노출
# replicaset을 Service를 통해 노출
# Expose ReplicaSet as a Service
kubectl expose rs <ReplicaSet-Name> --type=LoadBalancer --port=80 --target-port=8080 --name=<Service-Name-To-Be-Created>
kubectl expose rs my-helloworld-rs --type=LoadBalancer --port=80 --target-port=8080 --name=my-helloworld-rs-service
# Get Service Info
kubectl get service
kubectl get svc
# Service의 External IP를 통해, Pod 내 애플리케이션 접근
http://<External-IP-from-get-service-output>/hello
replicaset을 통해 6개의 pod가 생성되었고,
expose 명령어를 통해 Load Balancer(service)를 생성하여서
service의 외부 IP를 통해 접근 시, pod가 로드밸런싱 되는 것을 확인 가능
ReplicaSet의 High Availability
# pod 삭제
kubectl get pods
---
NAME READY STATUS RESTARTS AGE
my-helloworld-rs-28v29 1/1 Running 0 17m
my-helloworld-rs-kkklm 1/1 Running 0 17m
my-helloworld-rs-r55cx 1/1 Running 0 17m
my-helloworld-rs-tmbcr 1/1 Running 0 17m
my-helloworld-rs-wlx6b 1/1 Running 0 17m
my-helloworld-rs-zzznq 1/1 Running 0 17m
여기서 한 개의 pod를 삭제해보자
kubectl delete pod my-helloworld-rs-28v29
pod "my-helloworld-rs-28v29" deleted
# pod 확인
kubectl get pods
---
NAME READY STATUS RESTARTS AGE
my-helloworld-rs-kkklm 1/1 Running 0 17m
my-helloworld-rs-q7gpp 1/1 Running 0 6s
my-helloworld-rs-r55cx 1/1 Running 0 17m
my-helloworld-rs-tmbcr 1/1 Running 0 17m
my-helloworld-rs-wlx6b 1/1 Running 0 17m
my-helloworld-rs-zzznq 1/1 Running 0 17m
PS C:\Users\serahp\azure-aks-kubernetes-masterclass\03-Kubernetes-Fun
28v29가 삭제 되고, q7gpp라는 새로운 pod가 생성되어 파드 수가 6개로 유지되는 것을 확인 가능
이는 replicaset의 High Availability 기능 때문이다.
ReplicaSet의 Scalability
# replicaset-demo.yaml 파일 수정
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-helloworld-rs
labels:
app: my-helloworld
spec:
replicas: 3
selector:
matchLabels:
app: my-helloworld
template:
metadata:
labels:
app: my-helloworld
spec:
containers:
- name: my-helloworld-app
image: stacksimplify/kube-helloworld:1.0.0
replicas를 6 -> 3으로 수정해보자
# replicaset 수정
kubectl replace -f replicaset-demo.yml
replicaset.apps/my-helloworld-rs replaced
# replicaset 및 pod 확인
kubectl get rs
NAME DESIRED CURRENT READY AGE
my-helloworld-rs 3 3 3 28m
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-helloworld-rs-r55cx 1/1 Running 0 26m 10.224.0.70 aks-agentpool-29221675-vmss000000 <none> <none>
my-helloworld-rs-tmbcr 1/1 Running 0 26m 10.224.0.149 aks-agentpool-29221675-vmss000001 <none> <none>
my-helloworld-rs-wlx6b 1/1 Running 0 26m 10.224.0.95 aks-agentpool-29221675-vmss000000 <none> <none>
pod 수가 3으로 자동적으로 조정된 것을 볼 수 있다.
# clean
kubectl get rs
NAME DESIRED CURRENT READY AGE
my-helloworld-rs 3 3 3 28m
kubectl delete rs my-helloworld-rs
replicaset.apps "my-helloworld-rs" delete
[참고 영상]
Udemy - Azure Kubernetes Service with Azure DevOps and Terraform
섹션 4 : Kubernetes Fundamentals with kubectl - Imperative Approach
25. Step-12 : Introduction ot Kubernetes Deployments
[참고 문서]