본문 바로가기
Kubernetes (k8s)

[k8s] kubernetes Scheduling

by moveho 2023. 4. 5.

Manual Scheduling

원하는 node를 지정할 수 있음.

https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodename

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kube-01
  • nodeName 속성 추가
  • 생성 후 assign 은 불가 ⇒ 필요시 Binding object를 생성해(kind: Binding) api post 로 요청해야 함

Label & Selectors

  1. object 를 group화하고, 선택할 때 사용
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: App1
    function: Front-end
  • kubectl get pods --selector app=App1
  1. 서로 다른 object를 연결할 때 사용
apiVersion: apps/v1
kind: ReplicaSet
metadata:  # replicaset 자체의 labels
  name: simple-webapp
  labels:
    app: App1
    function: Front-end
spec:
  replicas: 3
  selector:
    matchLabels:  # replicaset 이 pod을 찾기위한 labels
      app: App1
    template:
      metadata:
        labels: # pod에 대한 labels
          app: App1
          function: Front-end
      spec: ...
  • 서비스가 pod을 찾는 방식도 마찬가지

Annotations

apiVersion: apps/v1
kind: ReplicaSet
metadata:  # replicaset 자체의 labels
  name: simple-webapp
  labels:
    app: App1
    function: Front-end
  annotations:
    buildversion: 1.34
  • 이름, 버전, 빌드 정보, contact 정보, email, integration목적으로 사용되는 것들 등등 ..

Taints and Tolerations

https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/

어떤 pod이 어떤 node에 할당될 것인지 scheduling에 대한 규제를 설정할 수 있음

taint 가 설정된 pod에 할당되려면 pod에 toleration이 설정되어야함

  • taint : 더럽히다, tolerate: 참다 ⇒ 더럽혀진 node에 가려면 참을 수 있어야한다는 의미
  • taint와 toleration 이 설정되었다고해서 무조건 맞게 할당되는 걸 보장하지는 않음

Taints

kubectl taint nodes node-name key=value:taint-effect

  • taint-effect : 이 taint를 tolerate하지 않는 pod에서 무슨 effect를 줄 것 인가
    • NoSchedule: 해당 taint에 toleration이 없으면 스케쥴되지 않음
    • PreferNoSchedule: 스케쥴되지 않도록 노력하겠지만 보장되지 않음
    • NoExecute: toleration이 없으면 스케쥴되지 않으며, 이미 존재하는 pod도 evict됨

Tolerations

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: nginx
    image: nginx:alpine
  tolerations:
  - key: "app"
    operator: "Equal"
    value: "blue"
    effect: "NoSchedule"

master node에 pod이 할당되지 않도록 하기위한 taint

taint 삭제

Node Selector

node selector

pod을 특정 node에 할당하기 위함

  • node에 label을 먼저 붙여야함
  • label이 large or medium 인 노드에 할당해라 ⇒ 이런 디테일한 operation 불가
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: data-processor
    image: data-processor
    nodeSelector:
      size: Large   # node label과 매치

노드에 label 할당

  • kubectl label nodes node01 size=Large

Node Affinity

https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/

노드 할당에 있어 구체적인 연산 가능

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: data-processor
    image: data-processor
    affinity:
      nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
            operator: In
            values:  # Meduim 또는 Large 노드에 할당
            - Large
            - Medium
        - matchExpressions:
          - key: size
            operator: NotIn
            values:  # Small이 아닌 노드에 할당
            - Small
        - matchExpressions:
          - key: size
            operator: Exists # value에 상관없이 size라는 label이 존재하면 할당

node affinity를 만족하는 노드가 없다면

  • requiredDuringSchedulingIgnoredDuringExecution: 매칭 안되면 스케쥴하지 않음
  • preferredDuringSchedulingIgnoredDuringExecution: 매칭 안되면 그냥 가능한 노드에 할당
  • IgnoredDuringExecution 의미는 이미 pod이 실행중인데 node의 label이 수정된다거나 해도, 기존 pod에 영향은 없음
    • RequiredDuringExecution 의 경우 실행중인 pod들이 evict됨

Resource Requirements & Limits

container에 대해 resource 요청/최대 제한을 지정할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: webapp
    image: webapp-color
    resources:
      requests:
        memory: "1Gi"
        cpu: 1
      limits:
        memory: "2Gi"
        cpu: 2

LimitRange

namespace 에 대하여 default로 limitRange를 걸 수 있다.

https://kubernetes.io/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container
  • LimitRange object를 생성하고, namespace에 대해 적용해 준다.
    • kubectl apply -f ./limit_range.yaml --namespace=default

Edit a Pod

아래 정보 말고는 edit으로 pod 정보를 수정할 수 없음

spec.containers[*].image

spec.initContainers[*].image

spec.activeDeadlineSeconds

spec.tolerations

→ 이 외의 정보를 수정하고 싶을 경우, 현재 pod의 정보를 뽑아서

kubectl get pod pod-name -o yaml > temp.yaml

→ 해당 yaml 을 수정하고, 다시 create/apply 로 띄운다.

Edit Deployments

deployment는 edit 으로 수정하는 것이 자유롭다.

  • kubectl edit deployment deployment-name

DaemonSets

daemonset은 모든 노드에 pod이 하나씩 돌도록 보장한다. 모든 노드에서 돌아야하는 cluster storage, log collector, node monitoring 같은 용도로 사용된다.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: monitoring-daemon
spec:
  selector:
    matchLabels:
      app: monitoring-agent
  template:
    metadata:
      labels:
        app: monitoring-agent
    spec:
      containers:
      - name: monitoring-agent
        image: monitoring-agent
  • 정의 자체는 replicaset, deployment와 유사하다.

Static Pods

kubelet daemon에 의해 직접 관리되는 pod으로, kubelet이 staticPodPath를 체크하여 생성/삭제된다.

static pod 정의 위치 찾는 법

  1. ps -ef | grep kubelet
  • -config 옵션을 통해 kubelet config path확인
  1. grep -i static /var/lib/kubelet/config.yaml
  • config file 내에서 manifest file 경로 확인
  • => staticPodPath: /etc/kubernetes/manifests

Multicontainer pod

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: nginx-container
    image: nginx:latest
    ports:
    - containerPort: 80
  - name: redis-container
    image: redis:latest
  - name: busybox-container
    image: busybox:latest
    command: ["/bin/sh", "-c", "echo Hello from Busybox! && sleep 3600"]

https://kubernetes.io/docs/tasks/extend-kubernetes/configure-multiple-schedulers/

'Kubernetes (k8s)' 카테고리의 다른 글

[k8s] Security  (2) 2023.04.10
[k8s] Cluster Maintenance  (0) 2023.04.08
[k8s] Application Lifecycle Management  (0) 2023.04.07
[k8s] Kubernetes Core Concept (쿠버네티스 핵심 개념)  (0) 2023.04.04
[k8s-Kubecolor] Colorize kubectl  (8) 2023.04.01

댓글