[이전 게시글]에서 작성한 코드가 버전 때문인지 제대로 작성되지 않았고,
eks-workshop으로 eks를 배포하려다가 eks module을 사용하여 배포해보고 싶어 배포하게 되었습니다.
Blue Print를 사용하지 않고, standard하게 구성하되, karpenter를 추가했습니다.
karpenter를 설명하고 이를 테스트해 보겠습니다.
파일 트리는 아래와 같으며, 전체 코드는 GitHub에 올려놓았습니다. (https://github.com/ssungz789/eks-self)
Karpenter
- Karpenter의 기본 동작 구조는 아래와 같습니다.
- 운영 부담 절감
- 신속한 Node 추가와 제거
- 자동 Node 롤링 (TTL)
- 다양한 인스턴스 타임을 쉽게 적용
- 빠른 버전 업데이트
- AWS 의존성을 제거함
- Auto scaling group 연계하지 않기 때문에 과정이 빠름
- 추가 Node가 Ready 상태가 되면 Karpenter가 kube scheduler를 대신해 pod에 node 바인딩 요청도 수행합니다.
- Karpenter 컴포넌트
- Karpenter Pod
- Controller: pod 상태를 감시하고 Node를 확장 및 축소하는 역할
- Webhook: provisioner CRD에 대한 유효성 검사 및 기본값을 지정
- Provisioner CRD
- Karpenter 에 의해 생성되는 Node와 Pod에 대한 제약조건을 지정하는 template
- Karpenter Pod
Karpenter 테스트를 위한 Provisioner 생성
이 Provisioner를 통해 Karpenter가 node 조건을 갖게되고,
노드 생성 시 AZS와 node Spec을 선언된 설정으로 생성합니다.
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: service
spec:
taints:
⦙ - key: service
⦙ ⦙ value: "true"
⦙ ⦙ effect: NoSchedule
labels:
⦙ nodeType: service-2023
requirements:
⦙ - key: "node.kubernetes.io/instance-type"
⦙ ⦙ operator: In
⦙ ⦙ values: ["t3.large","t3.xlarge"]
⦙ - key: "topology.kubernetes.io/zone"
⦙ ⦙ operator: In
⦙ ⦙ values: [ "ap-northeast-2a", "ap-northeast-2c" ]
⦙ - key: "karpenter.sh/capacity-type"
⦙ ⦙ operator: In
⦙ ⦙ values: ["on-demand"]
providerRef:
⦙ name: service-lt
ttlSecondsAfterEmpty: 30
ttlSecondsUntilExpired: 1209600
---
apiVersion: karpenter.k8s.aws/v1alpha1
kind: AWSNodeTemplate
metadata:
name: service-lt
spec:
subnetSelector:
⦙ karpenter.sh/discovery/ssungz-cluster: '*'
securityGroupSelector:
⦙ aws:eks:cluster-name: ssungz-cluster
tags:
⦙ karpenter.sh/discovery: ssungz-cluster
~
Deployment 테스트 코드
nginx를 간단하게 배포했으며, nodeSelector를 통해 생성된 node가 아닌 node에 생성되도록 지정하였습니다.
위 Provisioner 코드에 따라 해당되는 노드가 없기 때문에 Karpenter에서 신규 노드를 생성하고 스케줄링하게 됩니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-karpenter
spec:
replicas: 2
selector:
matchLabels:
type: karpenter-test
template:
metadata:
name: nginx-karpenter
labels:
type: karpenter-test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
nodeType: service-2023
tolerations:
- effect: "NoSchedule"
key: "service"
operator: "Equal"
value: "true"
위에 작성한 service provisioner를 배포하고, 테스트 Deployment 코드를 배포하면 아래와 같이 pending이 발생합니다.
test deploy yaml에 선언된 내용 중 nodeselector의 nodetype에 해당하는 노드가 없어 pending 상태가 된것이며,
이전에 선언한 service provisioner에 선언된 nodetype 라벨에 따라 Karpenter가 이를 관찰하고, 새로운 노드를 생성합니다.
node 생성이 완료되고 cluster에 join되면 karpenter에서 pending 상태의 pod를 해당 노드로 스케줄링 합니다.
만약 해당 deployment가 삭제될 경우 생성된 node는 karpenter에서 지속적으로 관찰하고 있다가, 해당되는 자원이 없을 경우 deprovisioner 되어 node를 삭제합니다.
'Cloud > Terraform' 카테고리의 다른 글
[T101] Terraform 101 Study 7주차 Opentofu (0) | 2024.08.03 |
---|---|
[T101] Terraform 101 Study 5주차 (Atlantis custom workflow) (1) | 2024.07.12 |
[T101] Terraform 101 Study 4주차 (0) | 2024.07.05 |
[T101] Terraform 101 Study 실습(5) - for (1) | 2024.07.03 |
[T101] Terraform 101 Study 실습(4) - data resource (0) | 2024.07.02 |