Karpenter ๋ AWS ์์ ์งํ ์ค์ธ ์คํ ์์ค ํ๋ก์ ํธ๋ก ์ฟ ๋ฒ๋คํฐ์ค์์ AWS ASG ๋ณด๋ค ํ ์ฐจ์ ๋์ ์์ค์ ์ค์ผ์ผ๋ง์ ์ ๊ณตํด์ค๋๋ค. Karpenter ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ !
Karpenter ๋ฅผ ์ด์ฉํ๋ฉด CPU ์ธ์คํด์ค ๋ฟ๋ง ์๋๋ผ GPU ์ธ์คํด์ค ๋ํ ์ ๋ง์ ๋ง ์ ๋์ ์ผ๋ก ํ๋ก๋น์ ๋ ํ ์ ์์ต๋๋ค. Karpenter ๋ฅผ ์ฐ๋ฉด ์ธ ์๋ก "์ ์ด๊ฑฐ ์ง์ง ์งฑ์ธ๋ฐ?" ๋ผ๋ ์๊ฐ์ด ๋ง์ด ๋ญ๋๋ค. ์์ฃผ ์ ์ฉํ ํ๋ก์ ํธ์ธ๊ฑฐ ๊ฐ์์.
CPU ์ธ์คํด์ค ๊ฐ์ ๊ฒฝ์ฐ์๋ Karpenter ๋ง ์ค์นํ๋ฉด ํ๋ก๋น์ ๋, ๋ํ๋ก๋น์ ๋ ๋ชจ๋ ์ ๋์ํฉ๋๋ค. ํ์ง๋ง GPU ์ธ์คํด์ค ๊ฒฝ์ฐ ํ๋ก๋น์ ๋์ ์๋์ง๋ง, ๋ํ๋ก๋น์ ๋์ ๋์ํ์ง ์์์.
์ฒ์์๋ ์์ง ๋ฉ์ด์ ๋ฒ์ ์ด๋ผ์ GPU ๊ด๋ จํ ๊ธฐ๋ฅ์ด ๊ฐ๋ฐ์ด ์๋ ์ค ์์์ง๋ง... ์ ์ ์ฐฉ๊ฐ์ด์์ฃ .
๊ทธ๋ผ ์ด๋ป๊ฒ Karpenter ๋ฅผ ์ด์ฉํด์ GPU ์ธ์คํด์ค๋ฅผ ๋ํ๋ก๋น์ ๋ ํ๋์ง ์์๋ณด๋๋ก ํ์ฃ !
๋ ์ธ ๋๋์ฝ๋~!
Github ์์ ์ด์ ํ์ธ!
์ ๊ฐ์ ์ฌ๋์ด ์ ์ธ๊ณ์ ํ๋ช ์ฏค์ ์์ ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ง ์ด๋ฏธ Karpenter Repo ์ Issus ๋ฅผ ๋ฐํํ์ ๊ฑฐ์์. ๊ทธ๋ฌ๋ ํ๋ฒ ์ฐพ์๋ณด์ฃ !
(Karpenter Repo ๋ ์ฌ๊ธฐ!)
๊ธ ์์ฑ ๊ธฐ์ค์ผ๋ก v0.28.0 ์ด ๊ฐ์ฅ ์ต์ ๋ฒ์
gpu ๋ผ๋ ํค์๋๋ก ๊ฒ์ํด๋ดค๋๋ฐ ๋คํํ ์ฐ๊ด๋ ์ด์๋ค์ด ๊ฝค ์๊ตฐ์!
์ด๋ค ์ค Karpenter not deprovisioning and deleting customized gpu node #3862 ๋ผ๋ ์ด์๋ฅผ ํ์ธํด๋ณด์ฃ .
์ํ! ์ฟ ๋ฒ๋คํฐ์ค์ ๋๋ฐ์ด์ค ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ผ๊ณ ํ๋ ๊ตฐ์.
์๊ฐํด๋ณด๋ ์์ ์ ์ฟ ๋ฒ๋คํฐ์ค์์ ์ด์ ๊ด๋ จํ ๋ฌธ์๋ฅผ ๋ณธ๊ฑฐ ๊ฐ์์.
์ฟ ๋ฒ๋คํฐ์ค๋ ๋๋ฐ์ด์ค ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ AMD ๋ฐ NVIDIA GPU(๊ทธ๋ํฝ ํ๋ก์ธ์ฑ ์ ๋)๋ฅผ ์ฌ๋ฌ ๋ ธ๋๋ค์ ๊ฑธ์ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ์์ ์ ์ธ ์ง์์ ํฌํจํ๋ค.
๋ํ Karpenter ๋ฌธ์์๋ ์๋์ ๊ฐ์ ๋ด์ฉ์ ๋ฐ๊ฒฌํ ์ ์์ด์.
GPU ๋ ธ๋๋ฅผ ํ๋ก๋น์ ๋ํ๋ ๊ฒฝ์ฐ ํด๋น ๋ ธ๋์ ์ ์ ํ GPU ์ฅ์น ํ๋ฌ๊ทธ์ธ ๋ฐ๋ชฌ์ ์ ๋ฐฐํฌํด์ผ ํฉ๋๋ค.
daemonset์ด ์คํ๋์ง ์์ผ๋ฉด Karpenter๋ ํด๋น ๋ ธ๋๋ฅผ ์ด๊ธฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ง ์์ต๋๋ค.
์ด์ ์์ธ์ ์์์ต๋๋ค. ์๋น๋์ GPU ๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ ์๋น๋์ ๋๋ฐ์ด์ค ํ๊ทธ๋ฌ์ธ์ ์ค์นํ์ง ์์ Karpenter ๊ฐ ์ด๋ฅผ ์ด๊ธฐํํ๋ค๊ณ ์ธ์ํ์ง ๋ชปํ๊ณ ์์ด์ ๊ทธ๋ฌ๋ ๊ฒ๋๋ค.
๊ทธ๋ผ ์ด์ ํ๋ฒ ์๋น๋์ ๋๋ฐ์ด์ค ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ณ ํ ์คํธํด๋ณด์ฃ !
NVIDIA / k8s-device-plugin ์ค์น
์ค์น ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์ ์ ๊ฐ์ด๋๋์ด ์์ต๋๋ค.
Helm Repo ๋ฅผ ๋ฑ๋กํ๊ณ ์ ๋ฐ์ดํธํฉ๋๋ค.
$ helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
$ helm repo update
Helm CLI ๋ฅผ ํตํด ์ค์นํด์ค๋๋ค.
helm upgrade -i nvdp nvdp/nvidia-device-plugin \
--namespace nvidia-device-plugin \
--create-namespace \
--version 0.14.0
๋๋ฐ์ด์ค ํ๋ฌ๊ทธ์ธ์ ๋ฐ๋ชฌ์ ์ผ๋ก ์ค์น๋๊ธฐ ๋๋ฌธ์ GPU ๊ฐ ์๋ CPU ์ธ์คํด์ค์๋ ์ค์นํ๋ ค๊ณ ์๋ํ๋๋ฐ.. ๋น์ฐํ ๋ค Error ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ NodeAffinity ์ Taints, Toleralations ๋ฅผ ์ด์ฉํด ์ํ๋ GPU ์๋ง ๋ฐฐํฌ๋ ์ ์๋๋ก ํฉ๋๋ค.
values.yaml ์ ๋ค์ด๋ก๋ ๋ฐ๊ณ ์ปค์คํ ํ๋ฉด ๋ฉ๋๋ค.
์ ๋ ์๋์ ๊ฐ์ ์ต์ ์ ์ถ๊ฐํด์ฃผ์์ต๋๋ค.
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions: # OR
- key: "node.kubernetes.io/instance-type"
operator: In
values: [ "g4dn.xlarge" ]
- key: "karpenter.k8s.aws/instance-family"
operator: In
values: ["g4dn"]
- key: "topology.kubernetes.io/zone"
operator: In
values: [ "ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c", "ap-northeast-2d" ]
- key: "karpenter.sh/capacity-type"
operator: In
values: [ "on-demand"]
- key: "kubernetes.io/arch"
operator: In
values: [ "amd64" ]
tolerations:
- key: kubernetes.io/arch
value: "amd64"
effect: NoSchedule
- key: nvidia.com/gpu
value: "true"
effect: NoSchedule
๊ทธ๋ฆฌ๊ณ karpenter-provisioner.yaml ๋ ๋ฐฐํฌํด์ฃผ๊ณ , GPU ๊ธฐ๋ฐ์ ํ๋๋ฅผ ์์ฑํด์ค๋๋ค.
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: gpu-instance-aws-node-template
spec:
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 40Gi
volumeType: gp2
encrypted: false
securityGroupSelector:
Name: "eks-cluster-sg"
kubernetes.io/cluster/csg-sd-dev-eks: owned
subnetSelector:
karpenter.sh/discovery: eks
tags:
karpenter.sh/discovery: eks
---
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: gpu-instance-karpenter-provisioner
spec:
providerRef:
name: gpu-instance-aws-node-template
requirements:
- key: "node.kubernetes.io/instance-type"
operator: In
values: [ "g4dn.xlarge" ]
- key: "karpenter.k8s.aws/instance-family"
operator: In
values: ["g4dn"]
- key: "topology.kubernetes.io/zone"
operator: In
values: [ "ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c", "ap-northeast-2d" ]
- key: "karpenter.sh/capacity-type"
operator: In
values: [ "on-demand"]
- key: "kubernetes.io/arch"
operator: In
values: [ "amd64" ]
limits:
resources:
cpu: "100"
memory: 100Gi
nvidia.com/gpu: 100
consolidation:
enabled: true
# ๋ชจ๋ ๋
ธ๋์ ์ ์ฉ๋๋ label
labels:
provision: karpenter
# ๋ชจ๋ ๋
ธ๋์ ์ ์ฉ๋๋ taints
taints:
- key: kubernetes.io/arch
value: "amd64"
effect: NoSchedule
- key: nvidia.com/gpu
value: "true"
effect: NoSchedule
์ดํ EC2 ์ ์์ฑ๋ GPU ์ธ์คํด์ค๋ฅผ ํ์ธํ ์ ์๊ณ ,
Pod ๋ฅผ ์ญ์ ํ๋ฉด Karpenter ๋ GPU ์ธ์คํด์ค์ ์ด๋ค ์์๋ ์ฌ์ฉ๋๊ณ ์์ง ์๋ค๊ณ ํ๋จํ์ฌ, ์ธ์คํด์ค๋ฅผ ๋ํ๋ก๋น์ ๋ ํด์ค๋๋ค!
์ค๋์ ์ด๋ ๊ฒ Karpenter ๋ก ํ๋ก๋น์ ๋ํ GPU ์ธ์คํด์ค๊ฐ ์ ๋ํ๋ก๋น์ ๋์ ์๋๋ ์ง์ ๋ํด์ ์์๋ดค์ต๋๋ค.
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!
'DevOps > Karpenter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Karpenter] ๋ ธ๋์ Deprovisioning ์ ์ข ๋ ์๋ฆ๋ต๊ฒ~ (0) | 2023.05.17 |
---|---|
[Karpenter] ๋ ธ๋๋ฅผ ์ค์๋ค๊ฐ ๋๋ ธ๋ค๊ฐ ํฉ์ณค๋ค๊ฐ ์์ด๋ค๊ฐ ~ (2) | 2023.03.19 |