일반적으로는 스케쥴러가 알아서 합리적인 nodes에 pods를 위치시키는데, 직접 node를 지정할 수 도 있다.
nodeSelector
순서
- node 에 label을 붙인다. kubectl label nodes
= - pod configuration에 nodeSelector field 를 추가한다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
Node affinity
- requiredDuringSchedulingIgnoredDuringExecution : hard, 무조건 해당 조건의 노드에서 실행
- preferredDuringSchedulingIgnoredDuringExecution : soft, 조건에서 실행하나 불가능하면 다른곳에서도 가능
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
Inter-pod affinity and anti-affinity 이미 실행중인 pods의 label들을 기준으로 스케쥴
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: topology.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: topology.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: k8s.gcr.io/pause:2.0
ex) security key를 갖고 S1 값을 갖는 라벨로 돌아가는 pod가 적어도 하나 이상 돌고 있는 zone. 더 정확히 말하면 node가 topology.kubernetes.io/zone key를 갖고 …
anti-affinity rule은 security key를 갖고 S2 값을 갖는것.
topologyKey는 라벨 키 인데 보안과 퍼포먼스 이유로 제약이 있다.
- requiredDuringSchedulingIgnoredDuringExecution 와 preferredDuringSchedulingIgnoredDuringExecution에 비어있는 topologyKey는 허용되지 않는다.
- anti-affinity도 마찬가지
- requiredDuringSchedulingIgnoredDuringExecution pod anti-affinity에서 topologykey를 kubernetes.io/hostname로 제한하기 위해 LimitPodHardAntiAffinityTopology가 나왔다. 사용자 지정 topology를 사용하려면 admission controller를 수정하거나 비활성화해야한다.
nodeName 가장 간단한 node 제한법
몇가지 제한사항이 있다.
- 지정된 node 이름이 없다면 pod가 실행되지 않는다. 자동 삭제
- node 에 자원할당이 불가하면 OutOfmemory or OutOfcpu 에러를 낸다.
- cloud 환경의 node names은 예측하거나 안정적이지 못하다.
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeName: kube-01
출처
https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/