ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] EKS Workshop #1
    Kubernetes/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 구성하기

    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

     

     

     

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

     

     

    'Kubernetes > EKS' 카테고리의 다른 글

    [EKS] EKS 업그레이드 후기  (2) 2024.10.27
    [Kubernetes] EKS Workshop #3  (0) 2024.06.09
    [Kubernetes] EKS Workshop #2  (0) 2024.06.09
Designed by Tistory.