Openshift / Kubernetes 파드 (Pod) 스케쥴링 - Affinity 옵션
Replicas 또는 ReplicaSet 구성후 운영중인 Pod 가 삭제될때, 가용성을 따져보아 다른 worker node 로 재생성되기도 하는데, 여기에서는 Affinity 기능을 이용해 같은 worker node 로 재생성 되도록 하는 방법을 알아봅니다. Affinity 는 worker node 에 Pod 를 배치할때 사용하는 옵션입니다.
우선 노드 선택이 가능하도록 노드에 라벨을 추가하여, 키와 값을 입력합니다.
현재 아래와 같이 worker node 가 두개 있는데, 이 노드에 키와 값을 입력해주겠습니다.
# oc get nodes
NAME STATUS ROLES AGE VERSION
master01.az1.sysdocu.kr Ready control-plane,master 43d v1.25.4+77bec7a
master02.az1.sysdocu.kr Ready control-plane,master 43d v1.25.4+77bec7a
master03.az1.sysdocu.kr Ready control-plane,master 43d v1.25.4+77bec7a
worker01.az1.sysdocu.kr Ready worker 42d v1.25.4+77bec7a
worker02.az1.sysdocu.kr Ready worker 42d v1.25.4+77bec7a
# oc label nodes worker01.az1.sysdocu.kr choice=ALL choicesub=wnode1
node/worker01.az1.sysdocu.kr labeled
- Group 용도로 'choice:ALL' 생성
- 노드 전용으로 'choicesub:wnode1' 생성
# oc label nodes worker02.az1.sysdocu.kr choice=ALL choicesub=wnode2
node/worker02.az1.sysdocu.kr labeled
- Group 용도로 'choice:ALL' 생성
- 노드 전용으로 'choicesub:wnode2' 생성
* 참고
라벨 삭제 방법입니다. 라벨명 (예: choicesub) 뒤에 - 를 꼭 붙여야 삭제됩니다.
# oc label node <노드명> <라벨명>-
설정된 상태를 확인합니다.
# oc get node -L choice,choicesub
NAME STATUS ROLES AGE VERSION CHOICE CHOICESUB
master01.az1.sysdocu.kr Ready control-plane,master 49d v1.25.4+77bec7a
master02.az1.sysdocu.kr Ready control-plane,master 49d v1.25.4+77bec7a
master03.az1.sysdocu.kr Ready control-plane,master 49d v1.25.4+77bec7a
worker01.az1.sysdocu.kr Ready worker 49d v1.25.4+77bec7a ALL wnode1
worker02.az1.sysdocu.kr Ready worker 49d v1.25.4+77bec7a ALL wnode2
아래와 같이 Deployment yaml 파일을 작성 합니다.
# vi deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: app spec: replicas: 1 selector: matchLabels: app: app template: metadata: labels: app: app spec: securityContext: seccompProfile: type: RuntimeDefault containers: - name: app image: default-route-openshift-image-registry.apps.az1.sysdocu.kr:5000/project412/python ports: - containerPort: 80 protocol: TCP securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] runAsNonRoot: true imagePullSecrets: - name: sysdocu # affinity 사용 옵션 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: # 특정 Label 의 node 에 Pod 를 생성 - key: choicesub operator: In values: - wnode1 |
Affinity 는 Node Affinity 와 Pod Affinity 가 있는데, 어느것을 기준으로 하는지에 따라 다릅니다.
- Node Affinity : 생성된 Pod 를 특정 worker node 에서 가동
- Pod Affinity : Replicas 로 생성된 동일한 Pod 를 같은 worker node 에서 가동
- Pod AntiAffinity : Replicas 로 생성된 동일한 Pod 를 다른 worker node 에서 가동
operator 는 Node Affinity 규칙에 사용되는 연산자를 지정하는 필드입니다.
- In : 특정 키 (key) 의 값을 포함하는 경우에 매치. 즉, 값 (values) 이 키에 포함되어 있는 경우 해당 노드에 Pod 를 생성
- Exists : 특정 키 (key) 가 존재하는 경우에 매치. 값 (values) 에 관계없이 키가 존재하면 해당 노드에 Pod 를 생성
- Gt (Greater than) : 특정 키 (key) 의 값이 지정한 값 (values) 보다 큰 경우에 매치. 주로 숫자 값을 비교할 때 사용
- Lt (Less than) : 특정 키 (key) 의 값이 지정한 값 (values) 보다 작은 경우에 매치. 역시 숫자 값을 비교할 때 사용
- NotIn : 특정 키 (key) 의 값을 포함하지 않는 경우에 매치. 값 (values) 이 키에 포함되지 않은 경우 해당 노드에 Pod 를 생성
- DoesNotExist : 특정 키 (key) 가 존재하지 않는 경우에 매치. 값 (values) 에 관계없이 키가 존재하지 않으면 해당 노드에 Pod 를 생성
작성한 yaml 파일을 적용하여 Pod 를 생성합니다.
참고로, Kubernetes 사용자는 아래 oc 명령대신 kuberctl 을 사용하면 됩니다.
# oc apply -f deployment.yaml
Pod 가 어느 worker node 에 생성되었는지 확인합니다.
# oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
app-5f86cc794b-656dg 1/1 Running 0 27s 10.131.0.13 worker01.az1.sysdocu.kr <none> <none>
Affinity 옵션값의 노드 라벨을 다른 노드로 변경하고, apply 명령으로 적용하면 곧바로 기존 Pod 는 삭제되고, 지정한 노드에 Pod 가 생성됩니다.
원래 Pod 는 스케쥴링 되는 노드 (worker node) 의 가용성 체크 뒤, Round-Robin 방식으로 분배 생성되지만 Affinity 적용 후에는 지정한 노드로만 생성되는것을 확인 할 수 있습니다.
노드를 변경하고 (wnode1 -> wnode2)
# sed -i 's/wnode1/wnode2/' deployment.yaml
적용합니다.
# oc apply -f deployment.yaml
Pod 상태를 확인해보면 지정한 노드에 Pod 가 생성되어진 것을 볼 수 있습니다.
# oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
app-54f888586f-xbmlj 1/1 Running 0 11s 10.128.3.242 worker02.az1.sysdocu.kr <none> <none>
app-5f86cc794b-656dg 1/1 Terminating 0 12m 10.131.0.13 worker01.az1.sysdocu.kr <none> <none>
'리눅스 > OpenShift' 카테고리의 다른 글
oc get co/dns 실행 에러 DNS "default" reports Progressing=True: "Have 4 available DNS pods, want 5." (0) | 2023.06.30 |
---|---|
Openshift / Kubernetes 컨테이너 권한 설정하기 (0) | 2023.06.20 |
Openshift 4.12.0 PV, PVC (GlusterFS) 를 이용한 Volume 추가 (0) | 2023.06.08 |
[Openshift] 웹 UI 대시보드 Grafana 설치 (2) | 2023.05.26 |
[OC & Kubernetes] Kubernetes 관리도구 helm 3.12 설치하기 (0) | 2023.05.19 |