Skip to content

Files

Latest commit

8f59ea0 ยท Jun 25, 2024

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Jun 24, 2024
Jun 24, 2024
Jun 25, 2024

README.md

์œ ์—ฐํ•œ ์Šค์ผ€์ค„๋ง Part 2 (12์žฅ)

10. ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ์กฐํ•ฉํ•œ ํŒŒ๋“œ ์Šค์ผ€์ค„๋ง

๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ/๋…ธ๋“œ ์•ˆํ‹ฐ์–ดํ”ผ๋‹ˆํ‹ฐ/์ธํ„ฐํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ/์ธํ„ฐํŒŒ๋“œ ์•ˆํ‹ฐ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-complex-scheduling
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      ~~~
      preferredDuringSchedulingIgnoredDuringExecution:
      ~~~
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      ~~~
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      ~~~

11. TopologySpreadConstraints๋ฅผ ์‚ฌ์šฉํ•œ ํ† ํด๋กœ์ง€ ๊ท ํ˜•

  • ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ/๋ฆฌ์ „/์กด ๋“ฑ์˜ ํ† ํด๋กœ์ง€์— ๊ฑธ์ณ ๊ตฌ์ถ•
  • ํ† ํด๋กœ์ง€๋ฅผ ์˜์‹ํ•˜๊ณ  ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„์‚ฐ ๋ฐฐ์น˜ํ•˜๋Š” ์Šค์ผ€์ค„๋ง์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด TopologySpreadConstraints ๋„์ž…
๊ฐ™์€ ์กด์— ํ•œ ๊ฐœ ํŒŒ๋“œ๋ณด๋‹ค ๋งŽ์€ ํŽธ์ฐจ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์Šค์ผ€์ค„๋ง ์˜ˆ์ œ
topologySpreadConstraints:
  - topologyKey: topology.kubernetes.io/zone
    labelSelector:
      matchLabels:
        app: sample-app
    maxSkew: 1
    wehnUnsatisfiable: DoNotSchedule
๊ฐ™์€ ์กด์— ํ•œ ๊ฐœ ํŒŒ๋“œ/๊ฐ™์€ ํ˜ธ์ŠคํŠธ์— ๋‘ ๊ฐœ ํŒŒ๋“œ์˜ ํŽธ์ฐจ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์Šค์ผ€์ค„๋ง ์˜ˆ์ œ
topologySpreadConstraints:
  - topologyKey: kubernetes.io/hostname
    labelSelector:
      matchLabels:
        app: sample-app
    maxSkew: 2
    wehnUnsatisfiable: DoNotSchedule
  - topologyKey: topology.kubernetes.io/zone
    labelSelector:
      matchLabels:
        app: sample-app
    maxSkew: 1
    wehnUnsatisfiable: DoNotSchedule
whenUnsatisfiable

์กฐ๊ฑด์— ๋Œ€ํ•ด ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์˜ ๋™์ž‘ ์„ค์ •

  • DoNotSchedule(๊ธฐ๋ณธ๊ฐ’)
    • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ์Šค์ผ€์ค„๋ง x
  • ScheduleAnyway
    • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์•„๋„ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์Šค์ผ€์ค„๋ง

12. ํ…Œ์ธํŠธ์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜

๋…ธ๋“œ์— ๋Œ€ํ•œ taint๋ฅผ ์„ค์ •ํ•ด ๋‘๊ณ  ๊ทธ๊ฒƒ์„ toleration ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋“œ๋งŒ ์Šค์ผ€์ค„๋ง์„ ํ—ˆ๊ฐ€

  • ํŒŒ๋“œ๊ฐ€ ์ œ์‹œํ•˜๊ณ  ๋…ธ๋“œ๊ฐ€ ํ—ˆ๊ฐ€ํ•˜๋Š” ํ˜•ํƒœ
  • ๋Œ€์ƒ ๋…ธ๋“œ๋ฅผ ํŠน์ • ์šฉ๋„๋ฅผ ์œ„ํ•œ ์ „์šฉ ๋…ธ๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ex) ํ”„๋กœ๋•์…˜์šฉ ๋…ธ๋“œ์— ๋‹ค๋ฅธ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ํŒŒ๋“œ๋ฅผ ๋…ธ๋“œ์ƒ์—์„œ ์ถ•์ถœ ๊ฐ€๋Šฅ

12.1 ํ…Œ์ธํŠธ ๋ถ€์—ฌ

Key=Value:Effect ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ

  • Key์™€ Value๋Š” ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ์ง€์ •, ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉ
  • Effect:
    • PreferNoSchedule: ๊ฐ€๋Šฅํ•œ ํ•œ ์Šค์ผ€์ค„๋งํ•˜์ง€ ์•Š์Œ
    • NoSchedule: ์Šค์ผ€์ค„๋งํ•˜์ง€ ์•Š์Œ(์ด๋ฏธ ์Šค์ผ€์ค„๋ง๋œ ํŒŒ๋“œ๋Š” ์œ ์ง€)
    • NoExecute: ์‹คํ–‰์„ ํ—ˆ๊ฐ€ํ•˜์ง€ ์•Š์Œ(์ด๋ฏธ ์Šค์ผ€์ค„๋ง๋œ ํŒŒ๋“œ๋Š” ์ •์ง€)
  • kubectl taint ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉ
    • kubectl taint nodes {node-name} {key}={value}:{effect}

12.2 ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ง€์ •ํ•œ ํŒŒ๋“œ ๊ธฐ๋™

Key/Value/Effect๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ…Œ์ธํŠธ์—์„œ ๋ถ€์—ฌ๋œ Key/Value/Effect๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ํ—ˆ์šฉ

  • Key/Value/Effect ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฏธ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์™€์ผ๋“œ์นด๋“œ
  • spec.tolerations๋กœ ์ง€์ •
  • Key ์กฐ๊ฑด์‹ ์˜คํผ๋ ˆ์ดํ„ฐ ์ข…๋ฅ˜:
    • Equal: Key์™€ Value๊ฐ€ ๊ฐ™๋‹ค
    • Exists: Key๊ฐ€ ์กด์žฌํ•œ๋‹ค
  • PreferNoSchedule์˜ ๊ฒฝ์šฐ๋Š” ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ์Šค์ผ€์ค„๋ง๋˜์ง€๋งŒ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ด๋ ค๊ฐ
apiVersion: v1
kind: Pod
metadata:
  name: sample-tolerations
spec:
  containers:
    - name: nginx-container
      image: nginx:1.16
  tolerations:
    - key: "env"
      operator: "Equal"
      value: "prd"
      effect: "NoSchedule"
tolerations:
  - operator: "Exists"

Exists ์˜คํผ๋ ˆ์ดํ„ฐ๋งŒ ์ง€์ •ํ•˜๋ฉด ๋ชจ๋“  ์กฐ๊ฑด์— ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

12.3 NoExecute ์ผ์ • ์‹œ๊ฐ„ ํ—ˆ์šฉ

apiVersion: v1
kind: Pod
metadata:
  name: sample-tolerations-second
spec:
  containers:
    - name: nginx-container
      image: nginx:1.16
  tolerations:
    - key: "env"
      operator: "Equal"
      value: "prd"
      effect: "NoExecute"
      tolerationSeconds: 45

12.4 ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ธํŠธ์™€ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜

  • ๋…ธ๋“œ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ธํŠธ ๋ถ€์—ฌ ๊ฐ€๋Šฅ
  • ํŒŒ๋“œ์˜ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์€ ๋ชจ๋“  ํ…Œ์ธํŠธ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ—ˆ์šฉ

12.5 ์žฅ์•  ์‹œ ๋ถ€์—ฌ๋˜๋Š” ํ…Œ์ธํŠธ์™€ ์ถ•์ถœ

๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ NoExecute์˜ ํ…Œ์ธํŠธ๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋…ธ๋“œ ์žฅ์•  ์‹œ ์ž๋™์œผ๋กœ ํŒŒ๋“œ๋ฅผ ์ถ•์ถœํ•˜๋Š” ๊ธฐ๋Šฅ

Effect Key ๊ฐœ์š”
NoExecute node.kubernetes.io/not-ready ๋…ธ๋“œ ์ƒํƒœ๊ฐ€ Ready๊ฐ€ ์•„๋‹Œ ์ƒํƒœ(NotReady)
NoExecute node.kubernetes.io/unreachable ๋…ธ๋“œ์™€์˜ ๋„คํŠธ์›Œํฌ ์ ‘์†์ด ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(Unknown)
๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํŒŒ๋“œ๋ฅผ ๊ณ„์† ๊ธฐ๋™ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300

12.6 ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๋ถ€์—ฌํ•˜๋Š” ๊ทธ ์™ธ ํ…Œ์ธํŠธ

๋…ธ๋“œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ
Effect Key ๊ฐœ์š”
NoExecute node.kubernetes.io/memory-pressure ๋…ธ๋“œ์— ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ
NoExecute node.kubernetes.io/disk-pressure ๋…ธ๋“œ์— ๋””์Šคํฌ ๋ถ€์กฑ
NoExecute node.kubernetes.io/pid-pressure ๋…ธ๋“œ์— PID ๊ณ ๊ฐˆ
NoExecute node.kubernetes.io/network-unavailable ๋…ธ๋“œ์˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Œ
NoExecute node.kubernetes.io/unschedulable kubectl cordon์— ์˜ํ•ด ์Šค์ผ€์ค„๋ง์—์„œ ์ œ์™ธ๋จ
ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์‚ญ์ œ๋  ๋•Œ
Effect Key ๊ฐœ์š”
NoExecute node.cloudprovider.kubernetes.io/uninitialized ํด๋ผ์šฐ๋“œ ํ”„๋กœ๋ฐ”์ด๋”์— ์˜ํ•ด ๋…ธ๋“œ๋ฅผ ์ฒ˜์Œ ๊ธฐ๋™ํ•  ๋•Œ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์„ ๋Œ€๊ธฐ
NoExecute node.cloudprovider.kubernetes.io/shutdown ํด๋ผ์šฐ๋“œ ํ”„๋กœ๋ฐ”์ด๋”์— ์˜ํ•ด ๋…ธ๋“œ๋ฅผ ์ •์ง€ํ•  ๋•Œ ์ „์ฒ˜๋ฆฌ

13. PriorityClass๋ฅผ ์ด์šฉํ•œ ํŒŒ๋“œ ์šฐ์„ ์ˆœ์œ„์™€ ์ถ•์ถœ

  • ์—ฌ๋Ÿฌ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง ๋Œ€๊ธฐ ์ƒํƒœ์ผ ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ์Šค์ผ€์ค„๋ง ์ˆœ์„œ ์ •๋ ฌ
  • ๋ฆฌ์†Œ์Šค์˜ ํ•œ๊ณ„๊นŒ์ง€ ์Šค์ผ€์ค„๋ง๋œ ์ƒํƒœ์—์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋” ๋†’์€ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ธฐ์กด ํŒŒ๋“œ ์ถ•์ถœ ๊ฐ€๋Šฅ

13.1 PriorityClass ์ƒ์„ฑ

  • ์šฐ์„ ์ˆœ์œ„(value)์™€ ์„ค๋ช…(description)์œผ๋กœ ๊ตฌ์„ฑ
  • ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๋จผ์ € ๊ธฐ๋™ ์ƒํƒœ ์œ ์ง€
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: sample-priority-class
value: 100
globalDefault: false
description: "used for serviceA only"
apiVersion: v1
kind: Pod
metadata:
  name: sample-high-priority
spec:
  containers:
    - name: nginx-container
      image: nginx:1.16
  priorityClassName: sample-priority-class
๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ํŒŒ๋“œ์— ์˜ํ•ด ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํŒŒ๋“œ๋ฅผ ์ถ•์ถœ

์ธํ„ฐํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์šฐ์„ ์ˆœ์œ„ ์กฐํ•ฉ์— ๋”ฐ๋ฅธ ๋ฌธ์ œ

13.2 ์šฐ์„ ์ˆœ์œ„ ์ถ•์ถœ ๋น„ํ™œ์„ฑํ™”

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: sample-priority-class-preemption-policy
value: 100
globalDefault: false
description: "used for serviceA only"
preemptionPolicy: Never
  • preemptionPolicy๋ฅผ Never๋กœ ์„ค์ •
  • ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ์Šค์ผ€์ค„๋ง
  • ์ถ•์ถœ x

13.3 PriorityClass์™€ PodDisruptionBudget์˜ ๊ฒฝํ•ฉ

PriorityClass์— ์˜ํ•œ ์ถ•์ถœ ์ฒ˜๋ฆฌ๋Š” PodDisruptionBudget์„ ๊ณ ๋ คํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ํ•˜์ง€๋งŒ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๊ฐ•์ œ๋กœ ์ถ•์ถœํ•˜๋ฏ€๋กœ ์—„๋ฐ€ํ•˜๊ฒŒ๋Š” ๋ณด์žฅ x

14. ๊ธฐํƒ€ ์Šค์ผ€์ค„๋ง

์ปค์Šคํ…€ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ๋“œ ์˜ˆ์ œ
apiVersion: v1
kind: Pod
metadata:
  name: sample-custom-scheduler
spec:
  schedulerName: custom-scheduler
  containers:
    - name: nginx-container
      image: nginx:1.16
ํŠน์ • ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์Šค์ผ€์ค„๋งํ•˜๋Š” ํŒŒ๋“œ ์˜ˆ์ œ
apiVersion: v1
kind: Pod
metadata:
  name: sample-nodespecific-scheduler
spec:
  nodeName: gke-k8s-default-pool-be722c17-7ij3
  containers:
    - name: nginx-container
      image: nginx:1.16