Kubernetes/EKS

[Kubernetes] EKS Workshop #1

팽팽 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 구성하기

  1. FROM : Base Image 지정(OS 및 버전 명시, Base Image에서 시작해서 커스텀 이미지를 추가)
  2. RUN : shell command를 해당 docker image에 실행시킬 때 사용함
  3. WORKDIR : Docker File에 있는 RUN, CMD, ENTRYPOINT, COPY, ADD 등의 지시를 수행할 곳
  4. EXPOSE : 호스트와 연결할 포트 번호를 지정
  5. 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

 

 

 

현재까지 아키텍처 상태...