[Kubernetes] EKS Workshop #1
- 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
현재까지 아키텍처 상태...