인프런 커뮤니티 질문&답변

최민종님의 프로필 이미지

작성한 질문수

CloudNet@와 함께하는 Amazon EKS 기본 강의

[실습] 실습 기본 환경 구성

Karpenter 설정

24.09.04 14:19 작성

·

87

0

안녕하세요

EKS 강의를 완강한 후 궁금한 점이 있어 댓글을 남깁니다!

Karpenter 설정 시 사용하신 YAML 파일을 보니, 지금까지 원클릭에서 사용했던 addons 및 IAM 설정 등이 빠져 있는 부분이 있는 것 같습니다.

이전 방식과 동일하게 Karpenter YAML에도 addons 및 IAM을 추가한 전체 파일을 볼 수 있을까요?

공부한 내용을 참고하여 하나씩 다시 추가해볼 수는 있지만, 정확하게 설정한 것인지 확인할 수 있는 문서가 없어 이렇게 댓글을 남기게 되었습니다.

답변 2

0

최민종님의 프로필 이미지
최민종
질문자

2024. 09. 04. 15:49

자세하게 설명해 주셔서 감사합니다.

하지만 설명해주신 가이드만으로는 초보자 입장에서 응용하기가 어려운 것 같습니다.

좀 더 구체적으로 말씀드리자면 "5장 실습 "Karpenter 구성하기" 문서를 확인한 후 이미지로 전달해드린 부분을 어떻게 이어서 하면 좋을지 알려주실 수 있을까요?

만약 어렵다면 직접 인터넷을 찾아가면서 시도해보겠습니다.

다만 2달 동안 열심히 들은 강의 마무리가 아쉬워서 이렇게 문의드리게 되었습니다.

#수동 설치 방법

eksctl-myeks-addon-iamserviceaccount-kube-system-aws-load-balancer-controller: aws load balancer controller를 위한 IRSA를 정의한 스택

eksctl-myeks-addon-ebs-csi-driver: ebs-csi-driver를 정의한 스택

eksctl-myeks-addon-efs-csi-driver: efs-csi-driver를 정의한 스택

eksctl-myeks-addon-iamserviceaccount-kube-system-ebs-csi-controller-sa: ebs-csi-controller를 위한 IRSA를 정의한 스택

eksctl-myeks-addon-iamserviceaccount-kube-system-efs-csi-controller-sa: efs-csi-controller를 위한 IRSA를 정의한 스택

image.png

 

참고 - 5장 실습 Karpenter 구성하기

[1] https://cloudneta.github.io/cnaeblab/2023-05-19-CH5-3/

 

Ongja_CloudNet@님의 프로필 이미지
Ongja_CloudNet@
지식공유자

2024. 09. 04. 16:13

기존 Karpenter 테스트 환경의 CloudFormation으로 배포한 상황에서 eksctl 명령으로 클러스터를 배포하는데
이때 위에 언급한 Add-On을 추가하도록 구성하고 싶은 걸로 이해했습니다.

image.png

위 이미지의 eksctl create cluster로 구성하는 부분에서 파일 내용에 Add-On 생성 추가를 정의하고 실행하면 되겠네요.

 

요청하신 내용이 맞는지 확인 부탁드리며,

아무래도 직접 수정한 후 테스트를 해봐야 하니 완료되면 수정 내용 공유 드리겠습니다.

최민종님의 프로필 이미지
최민종
질문자

2024. 09. 04. 17:13

안녕하세요 제가 원하는 부분이 맞습니다.!

여러 방법이 있겠지만 지금까지 공부했던 방식 그대로 적용해볼 때 전달해주신 YAML 파일 포맷을 참고하는 것이 공부에 큰 도움이 될 것 같습니다.

강사님 감사합니다.

Ongja_CloudNet@님의 프로필 이미지
Ongja_CloudNet@
지식공유자

2024. 09. 04. 18:39

코드 수정 후 테스트 완료해서 공유드립니다. (테스트 구성에 실수가 있어서 시간 지체가 됐네요)

 

  1. 수정 사항

여기 코드블록이 불편해서 github 링크로 eksctl 생성에 대한 수정 설정 공유드립니다.

https://github.com/cloudneta/cnaeblab/blob/master/_data/karpenter_eksctl.yaml

코드 상에 주석으로 표현해 두었는데요.

1) addons 추가

  • 기본 생성되는 addon 외에 ebs-csi-driver와 efs-csi-driver를 설치했습니다.

2) iam serviceAccounts 추가

  • ebs-csi-driver와 efs-csi-driver는 대상 서비스 사용에 대한 인증/인가를 위해 IRSA 설정이 필요합니다. 그래서 추가했고 AWS에서 제공하는 IAM Policy와 매핑했습니다.

  • eksctl로 생성되는 addon은 아니지만 aws-loadbalancer-controller도 IRSA 설정이 필요해서 추가했습니다.

 

  1. 결과 확인

1) CloudFormation 스택 확인

image.png

위 이미지와 같이 스택들이 생성되고 자원이 생성됩니다.

 

2) 설치된 addon 확인

eksctl get addon --cluster $CLUSTER_NAME

--
2024-09-04 18:29:33 [ℹ]  Kubernetes version "1.26" in use by cluster "myeks2"
2024-09-04 18:29:33 [ℹ]  getting all addons
2024-09-04 18:29:35 [ℹ]  to see issues for an addon run `eksctl get addon --name <addon-name> --cluster <cluster-name>`
NAME			VERSION			STATUS	ISSUES	IAMROLE												UPDATE AVAILABLE	CONFIGURATION VALUES	POD IDENTITY ASSOCIATION ROLES
aws-ebs-csi-driver	v1.34.0-eksbuild.1	ACTIVE	0	arn:aws:iam::891377396078:role/eksctl-myeks2-addon-aws-ebs-csi-driver-Role1-mi0BVO4lDkiL
aws-efs-csi-driver	v2.0.7-eksbuild.1	ACTIVE	0	arn:aws:iam::891377396078:role/eksctl-myeks2-addon-aws-efs-csi-driver-Role1-yd4G1PRRuvI5
coredns			v1.9.3-eksbuild.17	ACTIVE	0
kube-proxy		v1.26.15-eksbuild.5	ACTIVE	0
vpc-cni			v1.18.3-eksbuild.2	ACTIVE	0	arn:aws:iam::891377396078:role/eksctl-myeks2-addon-vpc-cni-Role1-4s4lgGoTAQ9K

대상 addon이 추가됐고 IRSA로 인증/인가 수행

 

결론적으로 Amazon EKS Cluster를 생성할 때 eksctl 명령으로 대상 자원을 생성하는데 이때 필요한 옵션을 정의해서 환경을 구성했습니다.

 

eksctl 명령은 굉장히 다양한 옵션을 제공하고 있어서 필요한 사항은 공식 홈페이지에 접근하면 상세히 알려줄 것입니다.

필요한 사항이 있으면 커스터마이징 해보시고 혹시나 안되는 부분이 있으면 추가 질문주세요.

 

감사합니다.

Ongja_CloudNet@님의 프로필 이미지
Ongja_CloudNet@
지식공유자

2024. 09. 04. 18:45

아~ 추가로 EKS Hands-On 페이지에 "5장 실습 Karpenter 구성하기"에는 별도로 aws-loadbalancer-controller 생성 단계가 없습니다. (활용하지 않아 생성 자체를 안함)

 

앞서 eksctl 명령으로 aws-loadbalancer-controller의 IRSA만 설치한 상태이니 필요하다면 별도로 설치가 필요합니다.

 

다른 실습에서 기본 환경 구성으로 아래와 같이 aws-loadbalancer-controller를 설치하고 있으니 참고하세요.

helm repo add eks https://aws.github.io/eks-charts

helm repo update

helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=$CLUSTER_NAME \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller
최민종님의 프로필 이미지
최민종
질문자

2024. 09. 05. 08:59

강사님 자세하게 설명해 주셔서 정말 감사합니다.

이 강의를 들을 수 있었던 것이 큰 행운이었던 것 같습니다. 마무리도 잘할 수 있을 것 같아요.

실습하면서 궁금한 점이 생기면 댓글로 질문드리겠습니다.

Ongja_CloudNet@님의 프로필 이미지
Ongja_CloudNet@
지식공유자

2024. 09. 05. 10:07

넵~ 얼마든지요 :)

감사합니다.

최민종님의 프로필 이미지
최민종
질문자

2024. 09. 05. 11:22

안녕하세요 강사님

테스트를 진행해보고 있는데요

이미지와 같이 서비스 계정의 IAM 역할(IRSA)이 설정되지 않는다고 표시됩니다.

혹시 변경해야 할 부분이 있을까요?

image.png
eksctl create cluster -f - <<EOF
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: ${CLUSTER_NAME}
  region: ${AWS_DEFAULT_REGION}
  version: "1.28"
  tags:
    karpenter.sh/discovery: ${CLUSTER_NAME}
  
### Create Addons ###
addons:
- name: vpc-cni
  version: latest
  attachPolicyARNs:
    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
- name: kube-proxy
  version: latest
- name: coredns
  version: latest
- name: aws-ebs-csi-driver
  wellKnownPolicies:
    ebsCSIController: true
- name: aws-efs-csi-driver
  wellKnownPolicies:
    efsCSIController: true
######
 
iam:
  withOIDC: true
  serviceAccounts:
  ### Added ServiceAccount ###
  - metadata:
      name: aws-load-balancer-controller
      namespace: kube-system
    wellKnownPolicies:
      awsLoadBalancerController: true
  - metadata:
      name: ebs-csi-controller-sa
      namespace: kube-system
    wellKnownPolicies:
      efsCSIController: true
  - metadata:
      name: efs-csi-controller-sa
      namespace: kube-system
    wellKnownPolicies:
      efsCSIController: true
  ######
  - metadata:
      name: karpenter
      namespace: karpenter
    roleName: ${CLUSTER_NAME}-karpenter
    attachPolicyARNs:
    - arn:aws:iam::${AWS_ACCOUNT_ID}:policy/KarpenterControllerPolicy-${CLUSTER_NAME}
    roleOnly: true
  
iamIdentityMappings:
- arn: "arn:aws:iam::${AWS_ACCOUNT_ID}:role/KarpenterNodeRole-${CLUSTER_NAME}"
  username: system:node:{{EC2PrivateDNSName}}
  groups:
  - system:bootstrappers
  - system:nodes
  
managedNodeGroups:
- instanceType: m5.large
  amiFamily: AmazonLinux2
  name: ${CLUSTER_NAME}-ng
  desiredCapacity: 2
  minSize: 1
  maxSize: 10
  iam:
    withAddonPolicies:
      externalDNS: true
EOF

Ongja_CloudNet@님의 프로필 이미지
Ongja_CloudNet@
지식공유자

2024. 09. 05. 11:27

kube-proxy나 coreDNS는 IRSA를 구성하지 않습니다.

 

IRSA를 구성한다는 것은 AWS 자원에 대한 인증/인가를 통해 사용 권한을 부여하는 것인데요.

kube-proxy와 coreDNS는 AWS 자원에 대한 접근은 아니죠.

 

VPC-CNI, EBS CSI, EFS CSI는 모두 AWS 자원을 활용한 서비스이니 IRSA가 필요한 것이고요.

최민종님의 프로필 이미지
최민종
질문자

2024. 09. 05. 13:19

안녕하세요 강사님

자세히 설명해 주셔서 감사합니다.

EKS 구성할때 자연스럽게 원클릭으로 배포 하면서 kube-proxy와 coreDNS는 이해를 제대로 하지 못했던 것 같습니다.

이번 기회에 잘 정리할 수 있게 되어 다행입니다. 다시 한번 설명해 주셔서 감사합니다!

0

Ongja_CloudNet@님의 프로필 이미지
Ongja_CloudNet@
지식공유자

2024. 09. 04. 15:34

안녕하세요. CloudNet@ 팀입니다.

 

일단 말씀하신대로 Karpenter 실습은 기존 원클릭 배포와 다르게 기본 인프라 구성 후 eksctl 명령으로 EKS Cluster를 배포하고 있습니다.

아무래도 Karpenter에 의해 노드에 구성된 자원을 컨트롤 하기 위해 구성된 다양한 Add-On이나 자원이 방해가 되기 때문이죠.

뭐 방해라기 보단 원하는 형태로 컨트롤하기 힘들어 실습 환경을 위해 최소화한 부분입니다.

 

질문 내용 중에서 “Karpenter YAML에도 addons 및 IAM을 추가한 전체 파일을 볼 수 있을까요?”라고 하셨는데…

 

기존 원클릭 배포에서 Karpenter 구성을 위한 설정을 포함한 CloudFormation 파일을 말씀하시는 걸까요?

공교롭게… 그렇게 구성된 CloudFormation 파일은 없습니다.

 

 

기존 원클릭 배포 후 Karpenter 설정을 위한 tag 구성, ServiceAccount 설정, IAM 설정을 수동으로 하는 것을 권장합니다.

 

그래도 기존 원클릭 배포 파일 기준으로 가이드를 드려보자면…

 

1. EKS Cluster에 Tag 추가

karpenter.sh/discovery: ${CLUSTER_NAME}

tags 정보가 필요합니다.

CloudFormation의 EC2 UserData 영역에서 tags 옵션을 추가합니다.

 

[수정 전]

image.png

 

[수정 후]

--tags karpenter.sh/discovery: ${ClusterBaseName} 옵션 추가

 

 

  1. Karpenter Service Account 추가 ($ 하나 제거)

iam:
  withOIDC: true
  serviceAccounts:
  - metadata:
      name: karpenter
      namespace: karpenter
    roleName: $${CLUSTER_NAME}-karpenter
    attachPolicyARNs:
    - arn:aws:iam::$${AWS_ACCOUNT_ID}:policy/KarpenterControllerPolicy-$${CLUSTER_NAME}
    roleOnly: true

 

CloudFormation의 EC2 UserData 영역에서 SA 내용을 추가합니다.

[수정 전]

image.png

 

[수정 후] ($ 하나 제거)

- metadata:
    name: karpenter
    namespace: karpenter
  roleName: $${ClusterBaseName}-karpenter
  attachPolicyARNs:
  - arn:aws:iam::$${ACCOUNT_ID}:policy/KarpenterControllerPolicy-$${ClusterBaseName}
  roleOnly: true

irsa.yaml 영역에 내용 추가

 

  1. IamIdentityMapping 추가 ($ 하나 제거)

iamIdentityMappings:
- arn: "arn:aws:iam::$${AWS_ACCOUNT_ID}:role/KarpenterNodeRole-$${CLUSTER_NAME}"
  username: system:node:{{EC2PrivateDNSName}}
  groups:
  - system:bootstrappers
  - system:nodes

 

[수정 후] ($ 하나 제거)

cat <<EOT > iamIdentityMappings.yaml
iamIdentityMappings:
- arn: "arn:aws:iam::$${ACCOUNT_ID}:role/KarpenterNodeRole-$${ClusterBaseName}"
  username: system:node:{{EC2PrivateDNSName}}
  groups:
  - system:bootstrappers
  - system:nodes
EOT

sed -i -n -e '/iamIdentityMappings:/r iamIdentityMappings.yaml' -e '1,$p' myeks.yaml


iamIdentityMappings.yaml 파일을 만들고 myeks.yaml에 내용을 주입합니다.

 

 

아무래도 직접 작업한 것이 아니라 코드를 보면서 생각한 부분을 가이드한 것이라 변수 호출이 올바르게 되고 동작할 지 확신할 순 없네요.

명기된 내용이 정답은 아니며 가이드 용도로 참고해서 파일을 작성해 보시면 좋을 것 같네요.

 

감사합니다.