[aws] EKS Implementation — 1. EKS cluster creation
Published in
11 min readAug 19, 2022
안녕하세요. AWS EKS를 구축해보며 보다 자세히 이해하기 위해 작성한 글입니다.
구성도
사전작업
1. AWSCLI 설치 및 Configure 설정
- 로컬환경에 AWS CLI를 설치합니다.
- AWS CLI를 사용해서 자격증명을 해야만 로컬에서 eks 클러스터로 접속이 가능합니다.
- 아래 링크에서 본인의 운영체제에 맞는 버전으로 다운로드합니다.
- docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2.html
- AWS 홈페이지에 접속하여 IAM 대시보드에 들어가 Access Key를 생성하면 엑셀로 다운 받을 수 있습니다.
1)계정 등록
$ aws configureAWS Access Key ID [None]: 다운받은 Access KeyAWS Secret Access Key [None]: 다운받은 Secret KeyDefault region name [None]: 자신이 속한 regionDefault output format [None]: json
2) 계정 확인
#아래 명령어를 입력하면 해당 계정으로 접근할 수 있는 bucket list 를 확인할 수 있습니다.$ aws s3 ls
3) 계정 추가 등록
- — profile “name”으로 계정을 추가할 수 있습니다.
$ aws configure —-profile "name"AWS Access Key ID [None]: 다운받은 Access KeyAWS Secret Access Key [None]: 다운받은 Secret KeyDefault region name [None]: 자신이 속한 regionDefault output format [None]: json
4) 현재 사용할 계정으로 변경
- 현재 default 계정은 첫 번째 입력한 계정입니다. 아래 명령어로 default 계정을 변경할 수 있습니다.
$ export AWS_DEFAULT_PROFILE="name"
2. Kubectl 설치
- 로컬에서 쿠버네티스 클러스터를 kubectl로 제어해야 하기때문에 kubectl의 설치가 필요합니다.
- 아래의 링크에서 환경에 맞게 쿠버네티스 버전을 다운받습니다.
- https://kubernetes.io/ko/docs/concepts/configuration/organize-cluster-access-kubeconfig/
1. EKS Cluster 생성
EKS IAM
- EKS Cluster를 Console상에서 조회하거나 API를 통해 작업을 하는 경우 EKS Cluster를 생성한 IAM User나 Role에 대해서만 권한을 가집니다.
- IAM User별 policy를 수정하거나 EKS ConfigMap에 권한을 추가하는 방법이 있지만 EKS Cluster에 연결 필요한 신규 사용자가 있는 경우 매번 동일한 작업이 이루어 져야 하기 때문에 하나의 Role을 통해 EKS Cluster를 관리하도록 설정했습니다.
- 관련 에러:https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-api-server-unauthorized-error/
1) EKS Cluster 생성
- IAM Role 생성 (Name : eksClusterRole-test)
- Trusted Relationship : EKS
- 적용 Policy : AmazonEKSClusterPolicy, AmazonEKSServicePolicy, AmazonEKSVPCResourceController
- 네트워크 설정
- EKS Service용 Subnet 지정
- API 서버 엔드포인트 액세스 : 퍼블릭 및 프라이빗 (0.0.0.0/0)
- Cluster용 Security Group 설정
- type : all traffic
- protocol : all
- port : all
- source : 172.16.10.0/27
- self traffic : VPC
- 클러스터 Security Group 자동 생성
2) kubectl config 설정
- 각 IAM User별로 Access Key 발급하여 설정 후 위에서 사용한 IAM Role을 통해 스위치 하도록 설정
- config 파일 생성 (./기타/kubectl_config 참고)
- config 설정 확인
$ kubectl config view
- config 설정
3) VPC CNI 확인
- EKS 내부의 VPC CNI 플러그인 버전 확인 (플러그인 버전이 1.5.3 아하인 경우 업데이트)
$ kubectl describe ds aws-node -n kube-system | grep Image | cut -d “/” -f 2amazon-k8s-cni-init:v1.10.1-eksbuild.1amazon-k8s-cni:v1.10.1-eksbuild.1
- VPC CNI 플러그인 설정 변경
— 사용자 지정 네트워크(AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG) 활성화
— ENIConfig 레이블(ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone) 추가
$ kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=truedaemonset.apps/aws-node env updated$ kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zonedaemonset.apps/aws-node env updated
- ENIConfig 사용자 지정 리소스 정의(CRD) 생성
- yaml 파일 적용
$ kubectl apply -f CustomResourceDefinition.yamlcustomresourcedefinition.apiextensions.k8s.io/eniconfigs.crd.k8s.amazonaws.com created$ kubectl get crdNAME CREATED ATeniconfigs.crd.k8s.amazonaws.com 2022-08-19T07:14:09Z
securitygrouppolicies.vpcresources.k8s.aws 2022-08-19T07:14:12Z
- ENIConfig 사용자 지정 리소스 정의(CRD) 생성
- yaml 파일 적용
$ kubectl apply -f ENIConfig.yamleniconfig.crd.k8s.amazonaws.com/ap-northeast-2a created
eniconfig.crd.k8s.amazonaws.com/ap-northeast-2c created$ kubectl get eniconfigNAME AGE
ap-northeast-2a 30s
ap-northeast-2c 29s
4) Node Group 생성
- Node Group 생성 시 사용할 Launch Template을 생성합니다.
- 참고) Launch Template의 인스턴스 spec 정의 시 EBS Storage에 대해 CMK암호화를 적용하는 경우 사용하는 CMK에 대해 Auto Scaling Group에 대한 Policy를 업데이트해야합니다.
- Node생성 시 사용하는 AMI는 Amazon EKS 최적화 AMI로 이를 이용해 EKS Cluster와 join 시 이미지에서 제공되는 /etc/eks/bootstrap.sh를 통해 Cluster와 join됩니다. 따라서 연결하려는 EKS Cluster에 대한 정보 입력이 필요합니다.
#!/bin/bashset -exB64_CLUSTER_CA=[EKS 세부 정보의 인증기관]API_SERVER_URL=[EKS 세부 정보의 API 서버 엔드포인트]/etc/eks/bootstrap.sh [EKS Cluster Name] — container-runtime ‘containerd’ — kubelet-extra-args ‘ — node-labels=eks.amazonaws.com/nodegroup-image=[AMI ID],eks.amazonaws.com/capacityType=ON_DEMAND,node-role=workload,env=aws-poc-workload-dev,type=managed’ — b64-cluster-ca $B64_CLUSTER_CA — apiserver-endpoint $API_SERVER_URL
- Node IAM을 생성하여 선택합니다.
- 미리 생성한 launch template을 선택합니다.
노드 그룹 생성 에러(docs)
노드 그룹 미생성 시, coredns 상태
#CoreDNS 서비스의 ClusterIP를 가져오려면 다음 명령을 실행합니다.
$kubectl get service kube-dns -n kube-systemNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.100.0.10 <none> 53/UDP,53/TCP 152m#DNS 엔드포인트가 노출되고 CoreDNS 포드를 가리키는지 확인하려면 다음 명령을 실행합니다.
$kubectl -n kube-system get endpoints kube-dnsNAME ENDPOINTS AGE
kube-dns <none> 152m#정상 출력
NAME ENDPOINTS AGE kube-dns 192.168.2.218:53,192.168.3.117:53,192.168.2.218:53 + 1 more... 90d
#엔드포인트 목록이 비어 있는 경우 CoreDNS 포드의 포드 상태를 확인합니다.
$ kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGE
coredns-556f6dffc4-h7drq 0/1 Pending 0 129m
coredns-556f6dffc4-kqldv 0/1 Pending 0 129m
→ Amazon EKS에서 포드 상태 문제를 해결하려면 어떻게 해야 하나요?
→ Pod가 보류 중 상태에 있음
→ 포드가 Amazon EKS의 다른 포드에 연결되지 않는 이유는 무엇입니까?
https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-pod-connections/