๋งค์ฐ๋งค์ฐ๋งค์ฐ ์ค์!
Karpenter v0.32 ๋ฒ์ ๋ถํฐ ๋ฆฌ์์ค ์ด๋ฆ๋ค์ด ๋ณ๊ฒฝ๋์ด ์ฐธ๊ณ ๋ฐ๋๋๋ค. ๊ฐ๋ ์ ๋๊ฐ์ต๋๋ค.
(ex. Provisioners -> NodePools)
Karpenter ์ ๊ฐ๋ ์ ์๊ณ ์ถ๋ค๋ฉด ์ฌ๊ธฐ ์ฐธ๊ณ !
Karpenter ๋ฅผ ํ๋ฉด ํ์๋ก ์ ๋ง ์ ์ฉํ ์คํ์์ค์ธ๊ฑฐ ๊ฐ์์. ASG ๋ฅผ ๋์ด์ ํจ์ฌ ํจ์จ์ ์ด๊ณ ์ ๋์ ์ผ๋ก ๋ ธ๋์ ํ๋๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๊ฑฐ๋ ์.
์ค์ผ์ค๋ง ์์คํ ์ ๊ฐ๋ฐํ๊ณ ์๋๋ฐ, Karpenter ๊ฐ ์์๋ค๋ฉด ๋ง์ด ํ๋ค์์ ๊ฒ๋๋ค...
์ด๋ฒ ๊ธ์์๋ Karpenter ์ Deprovisioning ์ ๋ํด ์์๋ณด๋ ค๊ณ ํฉ๋๋ค. ๊ฐ์ฅ ํต์ฌ์ด๋ผ๊ณ ๋ณผ ์ ์์ฃ .
Deprovisioning ๊ด๋ จ ์ต์ ์ ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋ ์ ์์ด์.
- ttlSecondsAfterEmpty ์ ttlSecondsUntilExpired
- consolidation
์ด ์ต์ ๋ค์ ์ฌ์ฉํ๋ฉด ๊ฐ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋ ์ง ํ๋ฒ ๋ฐ๋ก ์์๋ณด๋๋ก ํ์ฃ .
๋ ์ธ ๋๋์ฝ๋~
ttlSecondsAfterEmpty ์ ttlSecondsUntilExpired
ttlSecondsAfterEmpty ์ ttlSecondsUntilExpired ๋ฅผ ์ฌ์ฉํ provisioner ์ ์ํ yaml ์ ๋๋ค.
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: aws-node-template
spec:
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 12Gi
volumeType: gp2
encrypted: false
securityGroupSelector:
Name: "eks"
subnetSelector:
karpenter.sh/discovery: eks
tags:
karpenter.sh/discovery: eks
---
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: provisioner
spec:
providerRef:
name: aws-node-template
requirements:
- key: "node.kubernetes.io/instance-type"
operator: In
values: [ "t3.small", "t3.medium" ]
- 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
ttlSecondsUntilExpired: 2592000 # 30 Days = 60 * 60 * 24 * 30 Seconds;
ttlSecondsAfterEmpty: 30
# ๋ชจ๋ ๋
ธ๋์ ์ ์ฉ๋๋ label
labels:
role: container-scheduler-system
provision: karpenter
kubernetes.io/arch: amd64
# ๋ชจ๋ ๋
ธ๋์ ์ ์ฉ๋๋ taints
taints:
- key: container-scheduler-system
value: "true"
effect: NoSchedule
- key: kubernetes.io/arch
value: "amd64"
effect: NoSchedule
- key: nvidia.com/gpu
value: "false"
effect: NoSchedule
์ ์ฝ๋๋ฅผ .limit.resources ์ cpu ์ memory ๋ฅผ ๊ฐ๊ฐ 100, 100Gi ๋ฅผ ์ฃผ์๋๋ฐ ์์ฑ๋ ๋ชจ๋ t3.small, t3.medium ์ cpu ์ memory ๋ฅผ ํฉ์น ๊ฐ์ ๋๋ค.
t3.medium ์ผ๋ก๋ง ๋ฐ์ ธ๋ณด์๋ฉด, t3.medium ์ 2 cpu, 4 memory ์ด๋ฏ๋ก ์ต๋ 25 ๊ฐ์ t3.medium ๊ฐ ์์ฑ๋ฉ๋๋ค.
limit ์ memory ๊ฐ 100Gi ์ด๊ธฐ ๋๋ฌธ์ด์ฃ .
ttlSecondsAfterEmpty ์ provisioner ๋ก ์์ฑ๋ ๋ ธ๋์ ๋ ์ด์ ํ๋๊ฐ ์์ผ๋ฉด (๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด) ์ง์ ๋ ์๊ฐ ํ์ ์๋์ผ๋ก ๋ ธ๋๋ฅผ ์ข ๋ฃ์ํต๋๋ค.
์ ์ฝ๋๋ผ๋ฉด 30์ด ๋ค์ ์๋ฌด ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก ์ข ๋ฃ๋์ง์.
์๋ ์ด๋ฏธ์ง๋ ์๋์ผ๋ก ์ข ๋ฃ๋๋ ๋ ธ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ํ๋ฅผ ๋ณด๋ฉด SchedulingDisabled ์ธ๋ฐ ์ด ๋ ธ๋๋ ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ํ๋๋ฅผ ์ค์ผ์ค๋ง ํ์ง ์๊ฒ ๋ค๋ ๊ฒ๋๋ค.
๊ทธ๋ฆฌ๊ณ EC2 ์ฝ์๋ฅผ ํ์ธํด๋ณด๋ฉด ์ญ์๋ ์ข ๋ฃ ์ค์ธ ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค.
30์ด๋ผ๊ณ ๋ ํ์ง๋ง ์ ํํ 30์ด ๋ค์ ์ข ๋ฃ๋์ง ์๊ณ 30~40์ด ๋ด์ ์ข ๋ฃ๋ฉ๋๋ค.
ttlSecondsUntilExpired ์ provisioner ๋ก ์์ฑ๋ ๋ ธ๋์ ๋ํด์ ์ง์ ๋ ์๊ฐ์ด ์ง๋๋ฉด ๋ ธ๋๋ฅผ ์ข ๋ฃํ๊ณ ๋ค์ ์๋กญ๊ฒ ์์ฑํฉ๋๋ค.
์ด๋ฐ ์ต์ ์ด ์ ํ์ํ๊ฑฐ์ง? ๋ผ๋ ์๊ฐ์ด ๋์ค ์๋ ์์ง๋ง, ์ค๋๋ ๋ ธ๋๋ฅผ ์๋ก์ด ๋ ธ๋๋ก ๊ต์ฒดํ๋ ค๋ ๊ฒ์ด ์ฃผ ๋ชฉ์ ์ ๋๋ค.
๊ตฌ ๋ฒ์ ์ ๋ ธ๋๋ฅผ ์ญ์ ํ๊ณ , ์๋ก์ด ๋ฒ์ ์ ๋ ธ๋๋ก ๊ต์ฒดํ๋ ๊ฒ์ด์ง์. ์ฆ, ๋ ธ๋๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ ค๊ณ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ ์ฝ๋๋ผ๋ฉด 30์ผ ๋ค์ ํด๋น ๋ ธ๋๋ ์ญ์ ๋๊ณ ์๋ก์ด ๋ฒ์ ์ ๋ ธ๋๊ฐ ๋ค์ ์์ฑ๋ ๊ฒ์ ๋๋ค.
๋ง์ฝ ์๋์ฒ๋ผ ttlSecondsUntilExpired ์ ๋ ๋๊ฒ ์ง์ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
ttlSecondsUntilExpired: 30
ttlSecondsAfterEmpty: 300
๋ณดํต ์ธ์คํด์ค๋ฅผ ํ๋ก๋น์ ๋ ๋๋๋ฐ 30์ด๋ณด๋ค๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค. ๋ฐ๋ผ์ ์์ ๊ฐ์ด ttlSecondsUntilExpired ์ ๋ฎ๊ฒ ์ค์ ํ๋ค๋ฉด, ์ ์์ ์ธ ๋ ธ๋๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ํ๋ก๋น์ ๋ ๋๋ ๊ณผ์ ์ค์ 30์ด(ttlSecondsUntilExpired์ ๊ฐ)๊ฐ ์ง๋๋ฒ๋ ค Karpenter ๊ฐ ์ข ๋ฃ์์ผ๋ฒ๋ฆฌ๊ณ ๋ ์๋ก์ด ๋ ธ๋๋ฅผ ํ๋ก๋น์ ๋ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฆ, ๋ฌดํ๋ฃจํ์ ๋น ์ ธ ๋ฒ๋ ค์!
์๋ ์ด๋ฏธ์ง์ฒ๋ผ ๋์์ ๋ ธ๋๋ฅผ ํ๋ก๋น์ ๋ํ๋ฉด์ ๋ํ๋ก๋น์ ๋ ์์ผ๋ฒ๋ฆฝ๋๋ค.
์ฒซ๋ฒ์งธ ์ค์ ๋ ธ๋๊ฐ ์์ฑ๋์์ง๋ง ๋ฐ๋ก ์ข ๋ฃ๋๊ณ , ๋๋ฒ์งธ ์ค์ ๋ ธ๋๊ฐ ์์ฑ๋๊ณ ์์ฃ .
๋ ธ๋์ ๋ฐฐํฌ๋ ํ๋ ๋ํ ๊ณ์ ์ญ์ ๋๊ณ ์์ฑ๋๋ ๊ฑธ ๋ฐ๋ณตํฉ๋๋ค.
EC2 ์ฝ์์ ํ์ธํด๋ณด๋ฉด ์ข ๋ฃ ์ค, ์คํ ์ค์ด ๊ณ์ํด์ ๋ฐ๋ณต๋ฉ๋๋ค.
ttlSecondsAfterEmpty ์ ttlSecondsUntilExpired ์ ์ด์ฉํ๋ฉด ํ์คํ ํด๋ฌ์คํฐ์ ๋น์ฉ์ ๋ฎ์ถ ์ ์์ด ๋ณด์ ๋๋ค.
ํ์ํ ๋๋ง ๋ ธ๋๋ฅผ ์ฌ์ฉํ๊ณ , ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก ์ข ๋ฃํด์ฃผ๊ธฐ ๋๋ฌธ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ ๊ตฌ ๋ฒ์ ์ ๋ ธ๋๋ ์๋์ผ๋ก ์๋ก์ด ๋ฒ์ ์ ๋ ธ๋๋ก ๊ต์ฒดํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง ttlSecondsAfterEmpty ์ ttlSecondsUntilExpired ๋ณด๋ค ๋น์ฉ์ ํจ์จ์ ์ผ๋ก ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ,
๊ทธ๊ฒ์ด ๋ฐ๋ก consolidation ์ ๋๋ค.
consolidation
consolidation์ ๋ ธ๋์ ๋ฆฌ์์ค ํ์ฉ๋๋ฅผ ๋์ด๊ณ ๋น์ฉ์ ์ ๊ฐํ๊ธฐ ์ํด ์์ ๋ถํ๋ฅผ ๋ค๋ฅธ ๋ ธ๋๋ก ์ด๋์ํค๋ ๊ธฐ๋ฅ์ ๋๋ค.
์๋ก์ด ์ธ์คํด์ค ํ์ ์ด๋ ์ฉ๋ ์ ํ์ผ๋ก ์ ํฉํ ๋ ธ๋๋ฅผ ์์ฑํ๊ณ , ๊ธฐ์กด์ ๋นํจ์จ์ ์ธ ๋ ธ๋์ ์๋ ํ๋๋ฅผ ์๋ก์ด ๋ ธ๋๋ก ์ฎ๊ธด ํ, ๊ธฐ์กด์ ๋ ธ๋๋ฅผ ์ญ์ ํฉ๋๋ค.
consolidation ๊ธฐ๋ฅ์ ํด๋ฌ์คํฐ์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ , ์คํ ์ธ์คํด์ค๋ ์จ๋๋งจ๋ ์ธ์คํด์ค์ ๊ฐ์ ๋ค์ํ ์ฉ๋ ์ ํ์ ํผํฉํ์ฌ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
์ ์ฉ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
...
consolidation:
enabled: true
...
consolidation๊ณผ ttlSecondsAfterEmpty๋ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ ๊ธฐ๋ฅ์ ์๋ก ๋ฐฐํ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ธ๋๋ฅผ ์ญ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. consolidation์ ์๋ก์ด ๋ ธ๋๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด์ ๋ ธ๋์ ์๋ ํ๋๋ฅผ ์ฎ๊ธด ํ์ ๋ ธ๋๋ฅผ ์ญ์ ํฉ๋๋ค.
๋ฐ๋ฉด์ ttlSecondsAfterEmpty์ ๋ ธ๋๊ฐ ๋น์ด์๋ ์ํ์์ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ฐ๋ก ๋ ธ๋๋ฅผ ์ญ์ ํฉ๋๋ค.
๋ฐ๋ผ์ consolidation๊ณผ ttlSecondsAfterEmpty์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. karpenter๋ provisioner ๋จ์๋ก consolidation๊ณผ ttlSecondsAfterEmpty ์ค ํ๋๋ง ์ค์ ํ ์ ์๋๋ก ์ ํํ๊ณ ์์ต๋๋ค.
consolidation ์ ํ๋ฒ ์ค์ต์ ํด๋ณด์ฃ !
consolidation ์ค์ต
์ค์ต์ ์ฌ์ฉํ deployment.yaml ์ ๋๋ค.
apiVersion: apps/v1
kind: Deployment
metadata:
name: inflate
spec:
replicas: 5
selector:
matchLabels:
app: inflate
template:
metadata:
labels:
app: inflate
spec:
terminationGracePeriodSeconds: 0
containers:
- name: inflate
image: public.ecr.aws/eks-distro/kubernetes/pause:3.7
resources:
requests:
cpu: 500m
memory: 500Mi
limits:
cpu: 500m
memory: 500Mi
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- 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
- key: node.kubernetes.io/instance-type
operator: In
values:
- t3.small
- t3.medium
tolerations:
- effect: NoSchedule
key: container-scheduler-system
value: "true"
- effect: NoSchedule
key: kubernetes.io/arch
value: amd64
- effect: NoSchedule
key: nvidia.com/gpu
value: "false"
.spec.resources.requests ์ cpu, memory ๋ฅผ ๊ฐ๊ฐ 500m, 500Mi ๋ก ์ฃผ์ด์ ๋ฏธ๋ฆฌ ๋ ธ๋์ ๋ฆฌ์์ค๋ฅผ ์์ฝํด๋์์ต๋๋ค.
์ด๋ก์จ Karpenter ๋ ๋ ธ๋๊ฐ ๊ฝ ์ฐผ๋ค๋ ๊ฑธ ์ ์ ์๊ณ , ์ถ๊ฐ๋ก ์๋กญ๊ฒ ๋ ธ๋๋ฅผ ์์ฑํ ์ ์์ฃ .
replica ๋ฅผ 5 ๋ก ์ง์ ํ๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ฆฌ์์ค๋ ์ด 2500m CPU, 2.5Gi Memory ์ ๋๋ค.
๋งจ ์ฒ์ provisioner.yaml ๋๋ก๋ผ๋ฉด, t3.small ์ด 2๊ฐ ์์ฑ๋ ๊ฒ์ ๋๋ค.
t3.small ์ memory ๋ ์ต๋ 2G ์ด๋ฏ๋ก t3.small 2๊ฐ๋ก ์ถฉ๋ถํ ์ปค๋ฒ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ผ ๋ง์ฝ provisioner.yaml ์ ์๋์ ๊ฐ์ด ์์ ํ๊ณ replica ๋ฅผ 10๊ฐ๋ก ๋๋ฆฌ๋ฉด ์ด๋จ๊น์?
(t3.small, t3.medium ์ ์ง์ ํ๋ ๊ฒ์ด ์๋๊ณ t ๋ก ์์ํ๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ฐ๋ฅํจ)
requirements:
# - key: "node.kubernetes.io/instance-type"
# operator: In
# values: [ "t3.small", "t3.medium" ]
- key: "karpenter.k8s.aws/instance-category"
operator: In
values: ["t"]
์ด 5G CPU, 5Gi Memory ๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ t ์ ํ์ ์ธ์คํด์ค๋ ์๋์ ๊ฐ์ฃ .
๊ฒฐ๊ณผ๊ฐ์ ๋จผ์ ๋ณด์ฌ๋๋ฆฌ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
t3.small ์ 2 cpu, 2 memory
t3a.medium ์ 2 cpu, 4 memory
t3a.xlarge ์ 4 cpu, 16 memory
์ด 8 cpu, 22 memory ๊ฐ ์์ฑ๋ฉ๋๋ค.
์ด? ์ด์ํฉ๋๋ค. ๋ถ๋ช ํ์ํ ๋ฆฌ์์ค๋ 5G CPU, 5Gi Memory ์ ๋๋ค. ๊ทธ๋ผ ์ Karpenter ๋ฅผ ์์ ๊ฐ์ด ์์ฑ์ ํ์๊น์?
์ด์ ๋ ๊ฐ ๋ ธ๋๋ค์๋ ํด๋น deployment pod ๋ง ์คํ๋๊ณ ์๋ ๊ฒ์ด ์๋๋๋ค. aws controller, ebs-csi, prometheus ๋ฑ ๋ฐ๋ชฌ์ ์ด ๋์ด์ ธ์์ฃ . ๊ทธ๋์ ๋ฐ๋ชฌ์ ์ ์ ์ธํ ๋๋จธ์ง ๋ฆฌ์์ค๋ก ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ํ์ํ ๋ฆฌ์์ค๋ณด๋ค ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง ๋ ธ๋๋ค์ด ์์ฑ๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฆฌ๊ณ t3.small, t3a.medium, t3a.xlarge ๊ฐ ๋น์ฉ๋ฉด์์ ๊ฐ์ฅ ํจ์จ์ ์ด๋ผ๊ณ Karpenter ๊ฐ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฌ์ต๋๋ค.
Karpenter ๋ ์ด๋ป๊ฒ ๋์ ์ผ๋ก ๋ ธ๋๋ฅผ ์์ฑํ๊ณ ์ด ๋ ธ๋๊ฐ ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ ์ ์์๊น์?
๋ฐ๋ก EC2 Fleet ์ด๋ผ๋ ๊ธฐ๋ฅ ๋๋ถ์ด์ฃ . ์ด๋ EC2 ์์ ๊ฐ๋ฐํ ๊ธฐ๋ฅ์ผ๋ก ํ์ํ ๋ฆฌ์์ค์ ๋ํด ์ต์ ์ ํจ์จ์ฑ์ ๊ณ์ฐํด์ค๋๋ค.
EC2 Fleet ์ด ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ ์ฐธ๊ณ !
Karpenter ์ Fleet ์ด ๊ถ๊ธํ๋ค๋ฉด ์ฌ๊ธฐ ์ฐธ๊ณ !
์ค๋์ Karpenter ์ Deprovisioning ์ต์ ์ ๋ํด ์์๋ดค์ต๋๋ค. Karpenter ๋ฅผ ์ด์ฉํ๋ฉด ๊ตณ์ด ASG ๋ฅผ ์ธ ํ์๊ฐ ์์ด์ง๋ฉด ๋น์ฉ์ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ํ ์ ์์ฃ .
๋ ์์ธํ ์ ๋ณด๊ฐ ์๊ณ ์ถ๋ค๋ฉด Karpenter ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋๋๋ค :)
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!
'DevOps > Karpenter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Karpenter] NVIDIA GPU ๊ฐ ์ฌ๋ผ์ง์ง ์์์! (0) | 2023.06.19 |
---|---|
[Karpenter] ๋ ธ๋๋ฅผ ์ค์๋ค๊ฐ ๋๋ ธ๋ค๊ฐ ํฉ์ณค๋ค๊ฐ ์์ด๋ค๊ฐ ~ (2) | 2023.03.19 |