EKS 클러스터 만들기

1. eksctl 설치

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

eksct 명령어 동작을 확인합니다.

eksctl version

eksctl bash-completion을 활성화 합니다.

eksctl completion bash >> ~/.bash_completion
. /etc/profile.d/bash_completion.sh
. ~/.bash_completion

2. EKS 클러스터 만들기

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

eksctl create cluster --name=eksworkshop-eksctl --nodes=3 --region=${AWS_REGION}

본 실습에서는 다음 코드 블록을 사용하여 클러스터를 생성하는 데 사용할 ekctl deployment 파일(eksworkop.yaml)을 생성합니다.

cat << EOF > eksworkshop.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eksworkshop-eksctl
  region: ${AWS_REGION}
  version: "1.25"

availabilityZones: ["${AZS[0]}", "${AZS[1]}", "${AZS[2]}"]

managedNodeGroups:
- name: nodegroup
  desiredCapacity: 3
  instanceType: t3.small
  ssh:
    enableSsm: true

cloudWatch:
  clusterLogging:
    enableTypes: ["*"]

secretsEncryption:
  keyARN: ${MASTER_ARN}
EOF
cat << EOF > eksworkshop.yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: eksworkshop
  region: ${AWS_REGION}
  version: "1.26"
vpc: 
  id: ${vpc_ID}
  subnets:
    public:
      PublicSubnet01:
        az: ${AWS_REGION}a
        id: ${PublicSubnet01}
      PublicSubnet02:
        az: ${AWS_REGION}b
        id: ${PublicSubnet02}
      PublicSubnet03:
        az: ${AWS_REGION}c
        id: ${PublicSubnet03}
    private:
      PrivateSubnet01:
        az: ${AWS_REGION}a
        id: ${PrivateSubnet01}
      PrivateSubnet02:
        az: ${AWS_REGION}b
        id: ${PrivateSubnet02}
      PrivateSubnet03:
        az: ${AWS_REGION}c
        id: ${PrivateSubnet03}     
secretsEncryption:
  keyARN: arn:aws:kms:ap-northeast-2:886962536491:key/37caebce-65ae-401f-98f5-f70fa19ebf8b
        
nodeGroups:
  - name: ng-public-01
    instanceType: t3.small
    subnets:
      - ${PublicSubnet01}
      - ${PublicSubnet02}
    desiredCapacity: 2
    minSize: 2
    maxSize: 4
    volumeSize: 200
    volumeType: gp2
    volumeEncrypted: true
    amiFamily: AmazonLinux2
    labels:
      nodegroup-type: frontend-workloads
    ssh: 
      publicKeyPath: "${publicKeyPath}"
    iam:
      attachPolicyARNs:
      withAddonPolicies:
        autoScaler: true
        cloudWatch: true
        ebs: true
        
  - name: ng-private-01
    instanceType: t3.small
    subnets:
      - ${PrivateSubnet01}
      - ${PrivateSubnet02}
    desiredCapacity: 2
    privateNetworking: true
    minSize: 2
    maxSize: 4
    volumeSize: 200
    volumeType: gp2
    volumeEncrypted: true
    amiFamily: AmazonLinux2
    labels:
      nodegroup-type: backend-workloads
    ssh: 
      publicKeyPath: "${publicKeyPath}"
    iam:
      attachPolicyARNs:
      withAddonPolicies:
        autoScaler: true
        cloudWatch: true
        ebs: true

cloudWatch:
  clusterLogging:
    enableTypes: ["*"]

EOF

생성한 eksworkop.yaml로 클러스터를 생성합니다.

eksctl create cluster -f eksworkshop.yaml

eksctl.io 를 참고하여 클러스터 생성에 필요한 구성파일 작성할 수 있습니다.

아래 명령어로 생성된 노드를 확인합니다.

kubectl -n kube-system get all

kubectl get nodes

실습에 사용할 역할 이름을 환경변수로 설정합니다.

STACK_NAME=$(eksctl get nodegroup --cluster eksworkshop-eksctl -o json | jq -r '.[].StackName')
ROLE_NAME=$(aws cloudformation describe-stack-resources --stack-name $STACK_NAME | jq -r '.StackResources[] | select(.ResourceType=="AWS::IAM::Role") | .PhysicalResourceId')
echo "export ROLE_NAME=${ROLE_NAME}" | tee -a ~/.bash_profile

3. AWS Console 자격 증명

거의 모든 실습이 CLI를 사용하기 때문에 이 단계는 선택 사항입니다. 그러나 EKS 콘솔에서 실습 클러스터에 대한 전체 액세스 권한이 필요한 경우 이 단계 수행하는 것을 권장합니다.

EKS 콘솔을 사용하면 클러스터의 구성 측면 뿐만 아니라 배포, 파드 및 노드와 같은 쿠버네티스 클러스터 오브젝트를 볼 수 도 있습니다. 이러한 유형의 액세스의 경우 콘솔 IAM 사용자 또는 역할을 클러스터 내에서 허용해야 합니다.

기본적으로 클러스터를 만드는 데 사용 되는 자격 증명은 aws-auth라는 ConfigMap에 클러스터 RBAC 구성의 system:masters 권한이 자동적으로 부여됩니다. 실습에서 Cloud9의 IAM credential을 통해, 클러스터를 생성하였기 때문에 Amazon EKS 콘솔창에서 해당 클러스터 정보를 확인하기 위해서는 실제 콘솔에 접근할 IAM 사용자 또는 역할의 AWS Console credential을 클러스터에 추가하는 작업이 필요합니다.

IAM 사용자 및 역할은 aws-auth라는 ConfigMap을 통해 EKS 클러스터에 바인딩 됩니다.

kubectl describe configmap -n kube-system aws-auth

Cloud9를 통해서 사용자 계정에 EKS 클러스터에 대한 권한을 부여 합니다. 권한은 제한되고 세분화 될 수 있지만 워크샵 클러스터이므로 사용자 계정을 관리자로 추가 합니다.

우선 IAM > 사용자 에서 사용자 계정의 ARN을 확인하고 복사합니다.

사용자 권한을 mapRoles 뒤에 추가합니다.

kubectl edit -n kube-system configmap/aws-auth
  mapUsers: |   
    - userarn: arn:aws:iam::<account ID>:user/<username>
      username: <username>
      groups: 
        - system:masters

명령어로 확인합니다.

kubectl describe configmap -n kube-system aws-auth

<Optional>

eksctl을 사용하여 하나의 명령어로 이 작업을 수행 할 수도 있습니다.

AWS 콘솔 액세스에 추가 할 올바른 자격 증명을 결정해야 합니다. 이미 알고 있다면 eksctl create iamidentitymapping을 건너 뛸 수 있습니다.

Cloud9 에서 클러스터를 구축 한 경우 환경에서 다음을 호출하여 IAM 역할 또는 사용자 ARN을 확인하십시오.

c9builder=$(aws cloud9 describe-environment-memberships --environment-id=$C9_PID | jq -r '.memberships[].userArn')
if echo ${c9builder} | grep -q user; then
	rolearn=${c9builder}
        echo Role ARN: ${rolearn}
elif echo ${c9builder} | grep -q assumed-role; then
        assumedrolename=$(echo ${c9builder} | awk -F/ '{print $(NF-1)}')
        rolearn=$(aws iam get-role --role-name ${assumedrolename} --query Role.Arn --output text) 
        echo Role ARN: ${rolearn}
fi

확인된 ARN을 사용하여 명령어을 실행하여 클러스터 내에서 자격 증명 매핑을 생성 할 수 있습니다.

eksctl create iamidentitymapping --cluster eksworkshop-eksctl --arn ${rolearn} --group system:masters --username admin

이제 콘솔 내의 AWS 인증 맵에서 항목을 확인할 수 있습니다.

kubectl describe configmap -n kube-system aws-auth

이제 AWS Console에 접근하여 생성된 EKS 클러스터를 확인합니다.

자세한 내용은 이 주제에 대한 EKS 설명서를 확인하십시오.

EKS 클러스터가 성공적으로 생성되었습니다.

Last updated