eksctl 명령을 이용해서 AWS EKS 생성하기 1. Bastion 호스트 준비 배스천 호스트(Bastion Host)란 침입 차단 소프트웨어가 설치되어 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 수행하는 호스트를 뜻함. 참고 : https://aws.amazon.com/ko/quickstart/architecture/linux-bastion/ https://blog.naver.com/pentamkt/221034903499 방법1: AWS EC2 instance를 생성해서 Bastion Server로 사용 방법2: 윈도우 10에서 WSL, Ubuntu를 사용 1) WSL 설치 PowerShell을 관리자 권한으로 실행 아래 명령어를 입력한 후 엔터 > Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 설치후에 시스템 리부팅 진행 2) 마이크로 소프트 스토어에서 "Ubuntu" 설치 후 실행해서 계정생성-> root 계정 패스워드 설정 Enter new UNIX username: ubuntu New password: XXXX Retype new password: XXXX passwd: password updated successfully ubuntu $ 2. Bastion Host(ubuntu Linux)에 AWS CLI 관리툴인 aws 참고: https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2-linux.html $ sudo apt-get install -y unzip $ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" $ unzip awscliv2.zip $ sudo ./aws/install You can now run: /usr/local/bin/aws --version $ aws --version aws-cli/2.7.11 Python/3.9.11 Linux/5.13.0-1029-aws exe/x86_64.ubuntu.20 prompt/off 3. Bastion Host(ubuntu Linux)에 EKS설치/운영 툴인 eksctl 설치 참고: https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/eksctl.html ARCH=amd64 PLATFORM=$(uname -s)_$ARCH curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz" # (Optional) Verify checksum curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_checksums.txt" | grep $PLATFORM | sha256sum --check tar -xzf eksctl_$PLATFORM.tar.gz -C /tmp && rm eksctl_$PLATFORM.tar.gz sudo mv /tmp/eksctl /usr/local/bin 4. Bastion Host(ubuntu Linux)에 k8s 관리툴인 kubectl 설치 참고: https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/install-kubectl.html curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.1/2023-04-19/bin/linux/amd64/kubectl chmod +x ./kubectl mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc kubectl version --short --client 5. AWS IAM 생성하기 링크: aws.amazon.com - root 로그인후 IAM 생성 사용자이름(User name*) : eks-mng-user 프로그래밍 방식(Programmatic access) 선택 기존 정책(Attach existing policies directly) : AdministratorAccess 태그 추가(Add tags (optional)) - [사용자만들기(Create User)] 버튼 클릭 사용자 생성되면 csv다운로드 -액세스ID/엑세스키 6. Bastion Host(ubuntu)에서 aws 관리할수 있도록 aws 계정(eks-mng-user) 등록 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install aws --version # AWS 관리콘솔 -> IAM -> 사용자 -> 계정선택 -> 보안자격증명 > 액세스 키 만들기 -> CLI -> 액세스키, 비밀액세스키 저장 aws configure AWS Access Key ID [None]: 액세스키 AWS Secret Access Key [None]: 비밀_액세스키 Default region name [None]: ap-northeast-2 Default output format [None]: # aws 연결 arn 확인 aws sts get-caller-identity 7. WINDOWS 10의 WSL에서 관리시스템을 생성해서 운영중인 경우 아래와 같이 EC2 연결을 위한 키를 생성한다. 방법1: AWS에서 ssh를 생성하거나 아래의 명령을 실행해 aws--login-key 키를 생성한다. 키 생성시 만들어지는 pem은 잘 저장한후 ssh 접속시 사용한다. 방법2: aws ec2 create-key-pair --region ap-northeast-2 --key-name test-k8skey --output text > aws--login-key 8. EKS 구성 참고: https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/getting-started-eksctl.html EKS요금 시간당 0.10USD + t3.medium 시간 0.416 *2 USD 입니다. [Managed nodes – Linux] 탭 선택후 사용설명확인 eksctl 명령을 실행해서 Amazon EKS 클러스터를 생성한다. $ eksctl create cluster \ --name k8s-demo \ --region ap-northeast-2 \ --with-oidc \ --ssh-access \ --ssh-public-key aws--login-key \ --nodes 3 \ --node-type t3.medium \ --node-volume-size=20 \ --managed 참고: Amazon Elastic Kubernetes Service(Amazon EKS)에서 OpenID Connect(OIDC) 호환 자격 증명 공급자를 Kubernetes 클러스터에 대한 사용자 인증 옵션으로 사용할 수 있습니다. OIDC 인증을 사용하면 직원 계정의 생성, 활성화 및 비활성화에 대한 조직의 표준 절차를 사용하여 EKS 클러스터에 대한 사용자 액세스를 관리할 수 있습니다. https://aws.amazon.com/ko/about-aws/whats-new/2021/02/amazon-eks-clusters-support-user-authentication-oidc-compatible-identity-providers/ CloudFormation으로 생성되기 때문에 aws에서 cloudformation으로 확인해본다. 생성되는 시간이 20분정도 걸린다. ... 2021-05-19 06:04:39 [ℹ] eksctl version 0.50.0 2021-05-19 06:04:39 [ℹ] using region ap-northeast-2 2021-05-19 06:04:39 [ℹ] setting availability zones to [ap-northeast-2a ap-northeast-2b ap-northeast-2c] 2021-05-19 06:04:39 [ℹ] subnets for ap-northeast-2a - public:192.168.0.0/19 private:192.168.96.0/19 2021-05-19 06:04:39 [ℹ] subnets for ap-northeast-2b - public:192.168.32.0/19 private:192.168.128.0/19 2021-05-19 06:04:39 [ℹ] subnets for ap-northeast-2c - public:192.168.64.0/19 private:192.168.160.0/19 2021-05-19 06:04:39 [ℹ] using EC2 key pair %!q(*string=) 2021-05-19 06:04:39 [ℹ] using Kubernetes version 1.19 2021-05-19 06:04:39 [ℹ] creating EKS cluster "k8s-demo" in "ap-northeast-2" region with managed nodes 2021-05-19 06:04:39 [ℹ] will create 2 separate CloudFormation stacks for cluster itself and the initial managed nodegroup 2021-05-19 06:04:39 [ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=ap-northeast-2 --cluster=k8s-demo' 2021-05-19 06:04:39 [ℹ] CloudWatch logging will not be enabled for cluster "k8s-demo" in "ap-northeast-2" 2021-05-19 06:04:39 [ℹ] you can enable it with 'eksctl utils update-cluster-logging --enable-types={SPECIFY-YOUR-LOG-TYPES-HERE (e.g. all)} --region=ap-northeast-2 --cluster=k8s-demo' ... 2021-05-19 07:09:28 [✔] saved kubeconfig as "/home/ubuntu/.kube/config" 2021-05-19 07:09:28 [ℹ] no tasks 2021-05-19 07:09:28 [✔] all EKS cluster resources for "k8s-demo" have been created 2021-05-19 07:09:29 [ℹ] nodegroup "ng-343b6807" has 3 node(s) 2021-05-19 07:09:29 [ℹ] node "ip-192-168-38-198.ap-northeast-2.compute.internal" is ready 2021-05-19 07:09:29 [ℹ] node "ip-192-168-4-22.ap-northeast-2.compute.internal" is ready 2021-05-19 07:09:29 [ℹ] node "ip-192-168-82-229.ap-northeast-2.compute.internal" is ready 2021-05-19 07:09:29 [ℹ] waiting for at least 3 node(s) to become ready in "ng-343b6807" 2021-05-19 07:09:29 [ℹ] nodegroup "ng-343b6807" has 3 node(s) 2021-05-19 07:09:29 [ℹ] node "ip-192-168-38-198.ap-northeast-2.compute.internal" is ready 2021-05-19 07:09:29 [ℹ] node "ip-192-168-4-22.ap-northeast-2.compute.internal" is ready 2021-05-19 07:09:29 [ℹ] node "ip-192-168-82-229.ap-northeast-2.compute.internal" is ready 2021-05-19 07:09:32 [ℹ] kubectl command should work with "/home/ubuntu/.kube/config", try 'kubectl get nodes' 2021-05-19 07:09:32 [✔] EKS cluster "k8s-demo" in "ap-northeast-2" region is ready - aws에서 확인 : CloudFormation 검색 후 확인 9. 설치완료되면 다음과 같이 설치 결과 확인하고, CLI 명령어 자동완성 기능을 추가 - kubectl 명령으로 설치결과 확인 kubectl get nodes NAME STATUS ROLES AGE VERSION ip-192-168-38-198.ap-northeast-2.compute.internal Ready 28m v1.19.6-eks-49a6c0 ip-192-168-4-22.ap-northeast-2.compute.internal Ready 28m v1.19.6-eks-49a6c0 ip-192-168-82-229.ap-northeast-2.compute.internal Ready 28m v1.19.6-eks-49a6c0 CLI 명령어 완성기능 추가 source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc 10. 간단한 실행 실습 워커 노드 정보 보기 kubectl get nodes -o wide Pod 배포 TEST. nginx 컨테이너 5개 실행하고 결과 확인 kubectl create deployment webtest --image=nginx:1.14 --port=80 --replicas=5 kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES webtest-fdf54587f-8mfrz 1/1 Running 0 28s 192.168.10.139 ip-192-168-2-91.ap-northeast-2.compute.internal webtest-fdf54587f-d4pjc 1/1 Running 0 28s 192.168.39.104 ip-192-168-56-22.ap-northeast-2.compute.internal webtest-fdf54587f-dqg55 1/1 Running 0 28s 192.168.13.27 ip-192-168-2-91.ap-northeast-2.compute.internal webtest-fdf54587f-hs8zd 1/1 Running 0 28s 192.168.77.185 ip-192-168-70-30.ap-northeast-2.compute.internal webtest-fdf54587f-pn549 1/1 Running 0 28s 192.168.83.249 ip-192-168-70-30.ap-northeast-2.compute.internal nginx 웹서버에 클라이언트 접속 가능하도록 구성하고 간단히 TEST $ kubectl expose deployment webtest --port=80 --type=LoadBalancer $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 443/TCP 33h webtest LoadBalancer 10.100.222.89 ab5190278c9ac491cb45a4bc42a6d689-1608401336.ap-northeast-2.elb.amazonaws.com 80:30331/TCP 31s 1분정도 후에 웹브라우저를 통해 웹서버 연결되는지 확인 http://ab5190278c9ac491cb45a4bc42a6d689-1608401336.ap-northeast-2.elb.amazonaws.com 11. 모든 실습이 끝났고, 더이상 EKS 사용하지 않는다면 아래 명령으로 삭제. 삭제하지 않고 두면???? 음.. 나중에 깜딱 놀랄수도 있어요~ EKS, EC2 모두 과금됩니다. $ eksctl delete cluster --name k8s-demo 2021-05-21 18:39:08 [ℹ] eksctl version 0.50.0 2021-05-21 18:39:08 [ℹ] using region ap-northeast-2 2021-05-21 18:39:08 [ℹ] deleting EKS cluster "k8s-demo" 2021-05-21 18:39:08 [ℹ] deleted 0 Fargate profile(s) 2021-05-21 18:39:09 [✔] kubeconfig has been updated 2021-05-21 18:39:09 [ℹ] cleaning up AWS load balancers created by Kubernetes objects of Kind Service or Ingress ... 2021-05-21 18:42:37 [ℹ] waiting for CloudFormation stack "eksctl-k8s-demo-addon-iamserviceaccount-kube-system-aws-node" 2021-05-21 18:42:55 [ℹ] waiting for CloudFormation stack "eksctl-k8s-demo-addon-iamserviceaccount-kube-system-aws-node" 2021-05-21 18:42:55 [ℹ] deleted serviceaccount "kube-system/aws-node" 2021-05-21 18:42:56 [ℹ] will delete stack "eksctl-k8s-demo-cluster" 2021-05-21 18:42:56 [✔] all cluster resources were deleted 지우는 시간도 오래 걸려요~