Kubernetes

Kubernetes - EKS

빠빠담 2021. 11. 30. 00:04
반응형

https://aws-eks-web-application.workshop.aws/ko/20-preq/100-account.html

 

1. iam

 

<your_aws_account_id>는 본인 AWS 계정의 고유 ID가 들어가는 자리입니다. 루트 사용자로 해당 실습을 진행하는 것은 권고 드리지 않는 사항입니다. 반드시 Administrator 사용자로 로그인하여 실습을 진행하세요.

 

 

2. cloud9

 

cloud9을 만들고  ec2 role을 추가한다.

https://console.aws.amazon.com/iam/home?#/roles$new?step=type&amp;amp;amp;amp;amp;amp;commonUseCase=EC2%2BEC2&amp;amp;amp;amp;amp;amp;selectedUseCase=EC2&amp;amp;amp;amp;amp;amp;policies=arn:aws:iam::aws:policy%2FAdministratorAccess

 

Manage EC2 instance

 

eks-workspace-admin
AWS Settings - Credentials - managed temporary credentials: disable

  1. Temporary credentials이 없는지 확실히 하기 위해 기존의 자격 증명 파일도 제거합니다.
    rm -vf ${HOME}/.aws/credentials
    
  2. GetCallerIdentity CLI 명령어를 통해, Cloud9 IDE가 올바른 IAM Role을 사용하고 있는지 확인하세요. 결과 값이 나오면 올바르게 설정된 것입니다.
    aws sts get-caller-identity --query Arn | grep eksworkspace-admin

 

 

아래의 명령어를 통해, AWS CLI 버전을 업그레이드합니다.

sudo pip install --upgrade awscli

아래의 명령어를 통해, 버전을 확인합니다. 이때 1.18.124 >= version 혹은 2.0.42 >= version을 만족해야 합니다.

aws --version

 

kubectl 설치 

sudo curl -o /usr/local/bin/kubectl  \
   https://amazon-eks.s3.us-west-2.amazonaws.com/1.21.2/2021-07-05/bin/linux/amd64/kubectl
sudo chmod +x /usr/local/bin/kubectl

아래의 명령어를 통해, 최신의 kubectl이 설치되었는지 확인합니다.

kubectl version --client=true --short=true

# 출력되는 결과 값
Client Version: v1.21.2-13+d2965f0db10712

 

 

jq 설치하기

jq는 JSON 형식의 데이터를 다루는 커맨드라인 유틸리티입니다. 아래의 명령어를 통해, jq를 설치합니다.

sudo yum install -y jq

bash-completion 설치하기

Bash 쉘에서 kubectl completion script는 kubectl completion bash 명령어를 통해 생성할 수 있습니다. 쉘에 completion script를 소싱하면 kubectl 명령어의 자동 완성을 가능하게 만들 수 있습니다. 하지만 이런 completion script는 bash-completion에 의존하기 때문에 아래의 명령어를 통해, bash-completion을 설치해야 합니다.

sudo yum install -y bash-completion

 

 

 

eksctl 설치하기

Amazon EKS 클러스터를 배포하는 방식은 다양합니다. AWS 콘솔, CloudFormation, CDK, eksctl 및 Terraform 등이 그 예입니다.

본 실습에서는 eksctl을 사용하여 클러스터를 배포합니다.

eksctl이란 EKS 클러스터를 쉽게 생성 및 관리하는 CLI 툴입니다. Go 언어로 쓰여 있으며 CloudFormation 형태로 배포됩니다.

아래의 명령어를 통해, 최신의 eksctl 바이너리를 다운로드 합니다.

curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp

바이너리를 /usr/local/bin으로 옮깁니다.

sudo mv -v /tmp/eksctl /usr/local/bin

아래의 명령어를 통해 설치 여부를 확인합니다.

eksctl version

 

 

 

 

 

AWS CLOUD9 추가 셋팅하기

앞선 페이지에서 AWS Cloud9 IDE 구축  필요한 툴 설치를 수행한 후, 아래의 추가 설정 작업을 진행합니다.

 

현재 실습이 진행되고 있는 리전을 기본 값으로 하도록 aws cli를 설정합니다.

export AWS_REGION=$(curl -s 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=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.accountId')

echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile

 

 

도커 이미지를 빌드하는 동안, AWS Cloud9 환경에서 용량 부족 이슈가 발생할 수 있습니다. 이를 해결하기 위해, 디스크 사이즈를 증설하는 쉘 스크립트를 실행합니다.

 

wget https://gist.githubusercontent.com/joozero/b48ee68e2174a4f1ead93aaf2b582090/raw/2dda79390a10328df66e5f6162846017c682bef5/resize.sh

sh resize.sh

완료 후, 아래의 명령어를 통해 파일 시스템에 늘어난 볼륨 크기가 반영되었는지 확인합니다.

df -h

리전을 명시해주지 않으면 클러스터를 배포한 후, 관련 정보를 확인할 때 에러가 뜹니다.

 

 

3. ecr 

아래의 명령어를 통해, 컨테이너라이징할 소스 코드를 다운 받습니다.

git clone https://github.com/joozero/amazon-eks-flask.git

AWS CLI를 통해, 이미지 리포지토리를 생성합니다. 본 실습에서는 리포지토리 이름을 demo-flask-backend라고 설정합니다. 또한, 리전 값에는 EKS 클러스터를 배포할 리전 코드(예: ap-northeast-2)를 명시합니다.

aws ecr create-repository \
--repository-name demo-flask-backend \
--image-scanning-configuration scanOnPush=true \
--region ${AWS_REGION}

 

 

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 225953240914.dkr.ecr.ap-northeast-2.amazonaws.com

docker build -t demo-flask-backend .

docker tag demo-flask-backend:latest 225953240914.dkr.ecr.ap-northeast-2.amazonaws.com/demo-flask-backend:latest

docker push 225953240914.dkr.ecr.ap-northeast-2.amazonaws.com/demo-flask-backend:latest

 

 

 

 

4. eks

 

eksctl을 사용하여 EKS 클러스터 생성하기

eksctl을 사용하여 아무 설정 값을 주지 않고 이 명령어(eksctl create cluster)를 실행하면 default parameter로 클러스터가 배포됩니다.

하지만 몇 가지 값을 커스텀하게 주기 위해 구성 파일을 작성하여 배포합니다. 뒤의 실습에서 쿠버네티스의 오브젝트를 생성할 때에도 단순히 kubectl CLI로 생성하는 것이 아닌 구성 파일을 작성하여 생성합니다. 이는 개인이 명시한 오브젝트들의 바라는 상태(desired state)를 쉽게 파악하고, 관리할 수 있는 이점이 있습니다.

 

 

root 폴더(/home/ec2-user/environment) 위치에서 아래의 값을 붙여넣습니다.

cd ~/environment
cat << EOF > eks-demo-cluster.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eks-demo # 생성할 EKS 클러스터명
  region: ${AWS_REGION} # 클러스터를 생성할 리젼
  version: "1.21"

vpc:
  cidr: "192.168.0.0/16" # 클러스터에서 사용할 VPC의 CIDR

managedNodeGroups:
  - name: node-group # 클러스터의 노드 그룹명
    instanceType: m5.large # 클러스터 워커 노드의 인스턴스 타입
    desiredCapacity: 3 # 클러스터 워커 노드의 갯수
    volumeSize: 10  # 클러스터 워커 노드의 EBS 용량 (단위: GiB)
    ssh:
      enableSsm: true
    iam:
      withAddonPolicies:
        imageBuilder: true # AWS ECR에 대한 권한 추가
        # albIngress: true  # albIngress에 대한 권한 추가
        cloudWatch: true # cloudWatch에 대한 권한 추가
        autoScaler: true # auto scaling에 대한 권한 추가

cloudWatch:
  clusterLogging:
    enableTypes: ["*"]
EOF

클러스터 컨피그 파일을 보면, iam.attachPolicyARNs를 통해 정책들을 정의할 수 있고, iam.withAddonPolicies를 통해, add-on 정책 또한 정의할 수 있습니다. EKS 클러스터가 배포된 후, EC2 콘솔창에서 워커 노드로 배포된 인스턴스의 IAM Role을 확인하면 추가된 권한들을 확인할 수 있습니다.

https://eksctl.io/usage/creating-and-managing-clusters/

 

 

아래의 명령어를 통해, 클러스터를 배포합니다.

 eksctl create cluster -f eks-demo-cluster.yaml

배포가 완료되면 아래의 명령어를 통해, 노드가 제대로 배포되었는지 확인합니다.

kubectl get nodes

 

~/.kube/config에 클러스터 자격 증명이 더해진 것을 확인할 수 있습니다.

 

 

 

 

eksctl 도 결국 cloudformation을 통해 eks를 구축하기에 cloudformation을 참고하도록 한다. 

 

 

- 콘솔 크리덴셜 

 

Console Credential 더하기

EKS 클러스터는 클러스터 접근 제어를 위해 IAM entity(사용자 또는 역할)를 사용합니다. 해당 rule은 aws-auth라는 ConfigMap에서 실행됩니다. 기본적으로 클러스터를 생성하는데 사용된 IAM entity에는 컨트롤 플레인에서 클러스터 RBAC 구성의 system:masters 권한이 자동적으로 부여됩니다.


현재 상태에서 Amazon EKS 콘솔창에 접속한다면 아래와 같이 어떤 정보도 확인할 수 없습니다.

 

eksctl로 클러스터 생성하기 실습에서 Cloud9의 IAM credential을 통해, 클러스터를 생성하였기 때문에 Amazon EKS 콘솔창에서 해당 클러스터 정보를 확인하기 위해서는 실제 콘솔에 접근할 IAM entity(사용자 또는 역할)의 AWS Console credential을 클러스터에 추가하는 작업이 필요합니다.

 

아래의 명령어를 통해, role ARN(Amazon Resource Number)을 정의합니다.

rolearn=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn')

echo ${rolearn}

해당 결과 값을 불렀을 때, assumed-role이 있다면 아래의 작업을 추가적으로 수행합니다.

 

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

 

아래의 명령어를 통해, 관련 정보를 확인할 수 있습니다.

kubectl describe configmap -n kube-system aws-auth

 

위의 작업이 완료되면 콘솔창에서 컨트롤 플레인 단의 정보 및 워커 노드 정보, 로깅 활성화 정보, 업데이트 정보 등을 파악할 수 있습니다.

Workloads 탭에서 쿠버네티스 안에 있는 애플리케이션들을 확인할 수 있습니다.

 

 

 

Configuration 탭에서 클러스터의 구성 정보를 확인할 수 있습니다.

 

 

 

 

 

- 쿠버네티스 대시보드 보기 

 

쿠버네티스 공식 대시보드

본 실습에서는 쿠버네티스에서 제공하는 공식 대시보드를 구성하는 방법에 대해 살펴봅니다.

 

아래의 명령어를 이용하여 대시보드를 배포합니다. 최신 대시보드 버전이 아래의 버전과 맞는지 확인하기 위해서 여기를 참고합니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

 

프록시를 사용하여 대시보드에 접근해야 합니다. kube-proxy를 통해, 외부에서도 해당 요청을 가능하게 만듭니다.

kubectl proxy --port=8080 --address=0.0.0.0 --disable-filter=true &

 

Cloud9 상단에 있는 Tool > Preview > Preview Running Application을 클릭한 후, 새로운 창이 나오면 URL 끝에 아래의 값을 붙여넣습니다.

api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

 

 

2번의 CLI를 입력한 터미널 창 외에 새로운 터미널 창에서 아래의 값을 입력한 뒤, 얻는 토큰 값을 쿠버네티스 대시보드 로그인 화면에 붙여 넣습니다.

aws eks get-token --cluster-name eks-demo | jq -r '.status.token'

본 실습에서는 간결하게 대시보드를 확인하기 위해, 외부에서도 접속 가능하게 만들었으나 production level에서 쿠버네티스 대시보드를 사용할 경우, 위의 방법을 권고드리지 않습니다.

 

 

 

반응형

'Kubernetes' 카테고리의 다른 글

Fargate  (0) 2021.12.11
K9S  (0) 2021.12.11
Kubernetes - EKS Console setup  (0) 2021.12.11
Ingress - EKS  (0) 2021.12.05
Kubernetes - On-Premise  (0) 2021.11.25