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