-
[Kubernetes] EKS Workshop #1Kubernetes/EKS 2024. 6. 9. 16:53
- EKS 는 kubernetes를 쉽게 실행할 수 있는 관리형 서비스임
- EKS 를 사용하면 AWS 환경에서 쿠버네티스 컨트롤 플레인 이나 노드를 직접 설치하거나 운영, 유지할 필요없음 -> 관리형 쿠버네티스 !
- AWS의 다양한 서비스들과 연동할 수 있음 -> ECR, ELB, IAM, VPC...
실습 환경 구축하기
- 본 실습에서는 aws cloud9 서비스를 Control Plane으로 지정하고, Worker node들을 다룰 예정
- admin role을 만들어서 인스턴스에 붙여주고, cloud9 설정에서 AWS managed temporary credentials 설정을 비활성화
rm -vf ${HOME}/.aws/credentials // 기존의 자격 증명 파일 제거
kubectl 설치
- 쿠버네티스 클러스터에 명령을 내리는 CLI 를 설치하자
- 명령어가 쿠버네티스 api를 호출해 관련 동작을 수행함
sudo curl -o /usr/local/bin/kubectl \ https://s3.us-west-2.amazonaws.com/amazon-eks/1.27.4/2023-08-16/bin/linux/amd64/kubectl sudo chmod +x /usr/local/bin/kubectl # 버전 확인 kubectl version --client=true --short=true # jq 설치 : json 형식의 데이터를 다루는 커맨드라인 유틸리티 sudo yum install -y jq # bash-completion 설치 : kubectl 명령어 자동 완성 sudo yum install -y bash-completion
eksctl 설치
- EKS 클러스터를 배포하는 방식에는 aws 콘솔, cloudformation, cdk, eksctl, terraform 등이 있음
- eksctl: 주로 Amazon EKS 클러스터의 생성, 관리 및 설정 자동화를 위한 도구/ AWS와의 통합이 뛰어나며, 클러스터를 처음부터 설정하는 데 유용함, Go 언어로 쓰여 있고 cloudformation 형태로 배포됨
# eksctl 바이너리 다운로드 curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp # 바이너리 이동 후 설치 여부 확인 sudo mv -v /tmp/eksctl /usr/local/bin eksctl version # cloud9 추가 셋팅 -> 리전 기본 값 TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") export AWS_REGION=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region') echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile aws configure set default.region ${AWS_REGION} # 확인 aws configure get default.region # 계정 id 환경변수 등록 export ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text) echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
도커 컨테이너 이미지 만들기
DockerFile 구성하기
- FROM : Base Image 지정(OS 및 버전 명시, Base Image에서 시작해서 커스텀 이미지를 추가)
- RUN : shell command를 해당 docker image에 실행시킬 때 사용함
- WORKDIR : Docker File에 있는 RUN, CMD, ENTRYPOINT, COPY, ADD 등의 지시를 수행할 곳
- EXPOSE : 호스트와 연결할 포트 번호를 지정
- CMD : application을 실행하기 위한 명령어
cat << EOF > Dockerfile FROM nginx:latest RUN echo '<h1> test nginx web page </h1>' >> index.html RUN cp /index.html /usr/share/nginx/html EOF
# 이미지 생성, tag 지정안하면 "latest" 기본값 docker build -t test-image . # 이미지 확인 docker images # 이미지를 컨테이너로 실햄함, test-nginx의 컨테이너 실행, 호스트 8080포트와 컨테이너의 80포트와 매핑 docker run -p 8080:80 --name test-nginx test-image # 현재 실행중인 컨테이너 확인 docker ps # 로그 출력 docker logs -f test-nginx # 내부 쉘 환경으로 접근 docker exec -it test-nginx /bin/bash # 컨테이너 중지 docker stio test-nginx # 컨테이너 삭제 docker rm test-nginx # 이미지 삭제 docker rmi test-image
ECR에 이미지 올리기
github에서 완성된 코드를 다운받고, 패키징하여 ecr에 올려보자
해당 이미지로 EKS 클러스터에 배포할 것임!
git clone https://github.com/joozero/amazon-eks-flask.git # 리포지토리 생성 aws ecr create-repository \ --repository-name demo-flask-backend \ --image-scanning-configuration scanOnPush=true \ --region ${AWS_REGION} # 다운받은 소스코드 위치로 가서 도커이미지 빌드 cd ~/environment/amazon-eks-flask docker build -t demo-flask-backend . # 특정 리포지토리에 푸쉬돌 수 있도록 tag 명령어 docker tag demo-flask-backend:latest $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demo-flask-backend:latest # push docker push $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/demo-flask-backend:latest
eksctl로 클러스터 생성
- 구성 파일 (yaml) 을 작성해서 클러스터를 배포해보자
cat << EOF > eks-demo-cluster.yaml --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: eks-demo # 생성할 EKS 클러스터명 region: ${AWS_REGION} # 클러스터를 생성할 리전 version: "1.27" vpc: cidr: "10.0.0.0/16" # 클러스터에서 사용할 VPC의 CIDR nat: gateway: HighlyAvailable managedNodeGroups: - name: node-group # 클러스터의 노드 그룹명 instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입 desiredCapacity: 3 # 클러스터 워커 노드의 갯수 volumeSize: 20 # 클러스터 워커 노드의 EBS 용량 (단위: GiB) privateNetworking: true iam: withAddonPolicies: imageBuilder: true # Amazon ECR에 대한 권한 추가 albIngress: true # albIngress에 대한 권한 추가 cloudWatch: true # cloudWatch에 대한 권한 추가 autoScaler: true # auto scaling에 대한 권한 추가 ebs: true # EBS CSI Driver에 대한 권한 추가 cloudWatch: clusterLogging: enableTypes: ["*"] iam: withOIDC: true EOF
- 배포 명령어, 15-20분 정도 소요함
eksctl create cluster -f eks-demo-cluster.yaml # 노드 배포되었는지 확인 kubectl get nodes
- 콘솔 크레덴셜 추가하기
EKS 클러스터는 클러스터 접근 제어를 위해 IAM entity를 사용하는데, rule은 aws-auth라는 Config-Map에서 실행됨
기본적으로 클러스터 생성하는데 사용된 IAM entity에는 컨트롤 플레인에서 클러스터 RBAC 구성의 system:masters 권한이 자동적으로 부여됨
=> 콘솔창에서 클러스터 정보 확인할려면 IAM의 console 자격을 클러스터에 추가하자
# assumed-role 확인 방법 rolearn=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn') echo ${rolearn} assumedrolename=$(echo ${rolearn} | awk -F/ '{print $(NF-1)}') rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text) # identity 매핑 eksctl create iamidentitymapping --cluster eks-demo --arn ${rolearn} --group system:masters --username admin
현재까지 아키텍처 상태...
'Kubernetes > EKS' 카테고리의 다른 글
[EKS] EKS 업그레이드 후기 (2) 2024.10.27 [Kubernetes] EKS Workshop #3 (0) 2024.06.09 [Kubernetes] EKS Workshop #2 (0) 2024.06.09