kubernetes
k8s 노드에 포드 할당
misankim
2023. 3. 7. 00:19
k8s 노드에 포드 할당
# 워커노드에 라벨 할당
kubectl get nodes
kubectl get nodes --show-labels
라벨 할당
kubectl label nodes <노드 이름> <레이블 키>=<레이블 값>
예시)
kubectl label nodes kubernetes-foo-node-1.c.a-robinson.internal disktype=ssd
# nodeSelector
특정 레이블을 가진 워커노드에만 포드를 배포
예시)
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
kubernetes.io/hostname: ip-172-20-10-11.ap-northeast-2.compute.internal
# nodeAffinity
특정 레이블
requiredDuringSchedulingIgnoredDuringExecution - 반드시 조건을 만족해야함
preferredDuringSchedulingIgnoredDuringExecution - 조건을 만족하는 워커노드에 우선적으로 포드를 배치하고 배치가 불가능하면 차순위 워커노드에 배치
예시)
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- ap-northeast-2a
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # weight: 1-100 조건을 복수로 설정할때 가중치
preference:
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- ap-northeast-2a
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
nodeSelector, nodeAffinity 둘 다 지정하면 둘 다 만족해야함
(참고) node taint
특정 노드에서 포드를 내보냄
노드에 taint 설정 추가
kubectl taint nodes my-test-cluster-worker-nqdp app=clickhouse:NoSchedule
taint 가 설정된 노드에 파드 스케쥴링
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
tolerations:
- key: "app"
operator: "Equal"
value: "clickhouse"
effect: "NoSchedule"
# podAffinity 와 podAntiAffinity
특정 레이블을 가진 포드가 있는 노드로 포드를 배치하거나,
특정 레이블을 가진 포드가 있는 노드를 피해서 포드를 배치,
예시)
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: failure-domain.beta.kubernetes.io/zone
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: failure-domain.beta.kubernetes.io/zone
containers:
- name: with-pod-affinity
image: k8s.gcr.io/pause:2.0
# 3개의 리플리카가 노드에 중복으로 배치되지 않도록 설정하는 배포 예
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
app: store
replicas: 3
template:
metadata:
labels:
app: store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine
# 3개의 리플리카가 노드에 중복으로 배치되지 않으면서 함께 동작하는 다른 포드가 있는 노드로 배치되도록 설정하는 배포 예
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
selector:
matchLabels:
app: web-store
replicas: 3
template:
metadata:
labels:
app: web-store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-store
topologyKey: "kubernetes.io/hostname"
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-app
image: nginx:1.16-alpine
# 노드 이름으로 포드 배치(안정적이지 않아 일반적으로 사용하지 않음)
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
nodeName: kube-01