반응형
다음의 조건을 만족하는 deployment 를 클러스터에 배포해본다.
- Namespace : test-namespace
- Name : test-dp
- Labels : hello=world (pod에도 필요)
- Replicas : 3
- 다음의 2개 컨테이너를 포함
- Container1
- image : nginx:1.19.3
- Container2
- image : tomcat:9
- Container1
- Deployment 의 각 파드는 각 노드에 하나만 배포 (노드가 2개 있을 경우, 3개의 파드가 모두 구동되지 않고 2개의 파드만 구동되며, 노드가 추가 될 경우 해당 노드에 3번째 파드가 구동되게 구성)
Deployment 가 생성하는 파드가 같은 노드에 2개 이상 배포되는 경우를 방지하기 위하여 다음의 2가지 방법을 사용할 수 있다.
- PodAntiAffinity 를 사용
- TopologySpreadConstraints 를 사용
2가지 방법 모두 topologyKey 값이 필요하다. 이 값은 모든 노드에 일관되게 가지고 있는 레이블을 사용하여야 하며, 'kubectl describe node' 명령을 사용하여 노드에서 조회한다. 여기에서는 'kubernetes.io/hostname' 을 사용한다.
1. PodAntiAffinity 를 사용
파드간에 안티 어피니티를 부여하여 파드가 서로 같은 노드에 구동되지 않게 한다.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
hello: world
name: test-dp
namespace: test-namespace
spec:
replicas: 3
selector:
matchLabels:
hello: world
template:
metadata:
labels:
hello: world
spec:
containers:
- image: nginx:1.19.3
name: container1
- image: tomcat:9
name: container2
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: hello
operator: In
values:
- world
topologyKey: kubernetes.io/hostname
2. TopologySpreadConstraint 를 사용
topologySpreadConstraints 를 사용한다.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
hello: world
name: test-dp
namespace: test-namespace
spec:
replicas: 3
selector:
matchLabels:
hello: world
template:
metadata:
labels:
hello: world
spec:
containers:
- image: nginx:1.19.3
name: container1
- image: tomcat:9
name: container2
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
hello: world
이제 상단 2가지 방법 중 하나로 준비된 yaml 파일을 생성한 후에 결과를 확인한다.
### deployment 생성
kubectl apply -f deployment.yaml
### deployment 확인
kubectl get deploy -n test-namespace -l hello=world
NAME READY UP-TO-DATE AVAILABLE AGE
test-dp 2/3 3 2 1m12s
### pod 확인
kubectl get pod -n test-namespace -owide -l hello=world
NAME READY STATUS ... NODE
test-dp-dkejd8eiue-9ljpw 2/2 Running ... worker1
test-dp-dkejd8eiue-9kdds 0/2 Pending ... <none>
test-dp-dkejd8eiue-knv3f 2/2 Running ... worker2
'kubectl describe' 명령을 사용하여 Pending 상태인 파드의 이벤트를 조회하면 각각 podAntiAffinity, topologySpreadConstraints 와 관련된 이유로 파드가 스케쥴링 되지 않고 있음을 확인할 수 있다.
'소프트웨어 아키텍처 > Kubernetes' 카테고리의 다른 글
[Kubernetes] 1-14. 클러스터 정보 확인하기 (0) | 2022.05.06 |
---|---|
[Kubernetes] 1-13. 파드 내부 컨테이너 간의 볼륨 공유 (0) | 2022.05.06 |
[Kubernetes] 1-11. Daemonset 구동해보기 (0) | 2022.05.03 |
[Kubernetes] 1-10. RBAC 적용해보기 (0) | 2022.05.03 |
[Kubernetes] 1-09. Scheduler 역할 확인하기 (0) | 2022.05.03 |
댓글