목차
1. 기본 인프라 배포
    1.1. CloudFormation을 통한 기본 인프라 배포
    1.2. EKS 관리용 인스턴스 정보 확인
2. 관리 콘솔에서 Amazon EKS 배포
    2.1. Amazon EKS 클러스터 생성 (관리 콘솔)
    2.2. Amazon EKS 노드 생성 (관리 콘솔)
    2.3. Amazon EKS 클러스터 삭제 (관리 콘솔)
3. eksctl에서 Amazon EKS 배포
    3.1. Amazon EKS 클러스터 생성 (eksctl)
    3.2. Amazon EKS 클러스터 정보 확인 및 설정 (eksctl)
4. 실습 환경 삭제


1. 기본 인프라 배포


이번 실습은 IAM 사용자 계정을 통해 관리 콘솔에 접근하고 액세스 키를 활용해 awscli 도구를 사용합니다.
해당 작업을 수행하지 않았다면 아래 토글을 확장해 작업을 선행하고 본격적인 실습에 들어갑니다.

IAM 사용자 생성 및 액세스 키 생성


IAM 사용자 생성

  • 루트 계정으로 로그인하여 링크에 클릭하여 IAM 사용자 페이지에 진입합니다.
  • 사용자 추가 버튼을 클릭합니다.
  • 사용자 이름admin으로 입력하고 [AWS Management Console에 대한 사용자 액세스 권한 제공]을 체크합니다.
  • 사용자에게 콘솔 액세스 권한 제공은 [IAM 사용자를 생성하고 싶음]을 선택합니다.
  • 콘솔 암호는 [사용자 지정 암호]를 선택하고 생성 기준에 맞춰 각자 암호를 지정합니다.
  • 사용자는 다음 로그인 시 새 암호를 생성해야 합니다.를 체크 해제하고 다음 버튼을 클릭합니다.
  • 권한 옵션은 [직접 정책 연결]을 선택하고 권한 정책에서 [AdministratorAccess]를 체크한 후 아래 다음 버튼을 클릭합니다.
  • 검토 및 생성 페이지에서 사용자 생성 버튼을 클릭합니다.
  • 암호 검색 페이지에서 .csv 파일 다운로드 버튼을 클릭하여 자신의 PC의 디렉터리에 저장합니다.
  • 사용자 목록으로 돌아가기 버튼을 클릭하여 IAM 사용자 생성을 마무리합니다.


IAM 사용자 액세스 키 생성

  • IAM 사용자 페이지에서 생성한 사용자 이름을 클릭합니다.
  • 보안 자격 증명 탭을 클릭하고 [액세스 키] 영역에서 액세스 키 만들기 버튼을 클릭합니다.
  • 액세스 키 모범 사례 및 대안 페이지에서 [Command Line Interface(CLI)]를 선택하고 아래 체크 박스를 체크한 후 다음 버튼을 클릭합니다.
  • 액세스 키 만들기 버튼을 클릭합니다.
  • 액세스 키 검색 페이지에서 .csv 파일 다운로드 버튼을 클릭하여 자신의 PC의 디렉터리에 저장합니다.
  • 완료 버튼을 클릭하여 IAM 사용자 액세스 키 생성을 마무리합니다.

Note: IAM 사용자로 관리 콘솔에 로그인 할때 계정 ID가 필요하니 잘 메모해 둡니다.


1.1. CloudFormation을 통한 기본 인프라 배포

해당 링크를 클릭하면 AWS CloudFormation 페이지로 연결되며, 파라미터를 입력(키 페어, 작업 PC의 공인 IP 주소/32) 후 스택을 실행합니다.

Note: AWS 관리 콘솔에 로그인 할때 IAM 사용자 계정으로 진행합니다.

AWS CloudFormation에 의해 생성이 완료되면 관리 콘솔에서 생성된 인프라들을 확인합니다.



1.2. EKS 관리용 인스턴스 정보 확인

AWS CloudFormation 스택의 출력 탭에서 eksctlhost의 퍼블릭 IP를 확인합니다.
해당 IP로 EKS 관리용 인스턴스(myeks-host)에 SSH로 접속하고 아래 명령어를 통해 정보를 확인합니다.


사용자 확인

1
whoami
  • whoami를 입력하여 root 사용자임을 확인합니다.

Note: root 사용자로 전환하도록 미리 설정해 두었으며, 접속 타이밍에 따라 ec2-user 사용자라면 sudo su -를 입력하여 root 사용자로 전환합니다.


기본 설치 도구 확인

1
2
3
4
5
6
7
8
9
10
11
// kubectl 버전 확인
kubectl version --client=true -o yaml | yh

// eksctl 버전 확인
eksctl version

// awscli 버전 확인
aws --version

// 도커 정보 확인
docker info | yh

Note: 실습 진행 시점에 따라 버전 정보가 다를 수도 있습니다.


awscli 사용을 위한 IAM 자격 증명

1
2
3
4
5
// awscli로 인스턴스 정보 확인 (IAM 자격 증명 X)
aws ec2 describe-instances | jq

// IAM 사용자 자격 구성
aws configure
  • IAM 사용자의 액세스 키 생성할 때 저장한 xxxx_accesskeys.csv 파일을 열어 값을 참조합니다.
  • aws config를 입력하여 Access Key ID, Secret Access Key, Region 코드를 입력합니다.
  • IAM 자격 증명이 이루어지면 awscli 도구로 인스턴스 정보를 다시 확인합니다.


EKS 배포할 VPC 정보 확인

1
2
3
4
5
6
7
8
// CLUSTER_NAME 변수 확인
echo $CLUSTER_NAME

// EKS를 배포할 myeks-VPC 정보 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq

// EKS를 배포할 myeks-VPC ID 값만 확인
aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId


EKS 배포할 VPC ID 변수 저장

1
2
3
4
5
6
7
8
// VPCID 변수에 myeks-VPC ID 값을 저장
export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)

// VPCID를 전역 변수로 선언
echo "export VPCID=$VPCID" >> /etc/profile

// VPCID 변수 호출
echo $VPCID


EKS 배포할 VPC의 서브넷 정보 확인

1
2
3
4
5
6
7
8
9
10
11
12
// EKS를 배포할 VPC의 전체 서브넷 정보 확인
aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq

// EKS를 배포할 VPC의 퍼블릭 서브넷 정보 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" | jq

aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" | jq

// EKS를 배포할 VPC의 퍼블릭 서브넷 ID 값만 확인
aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text

aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text


EKS 배포할 퍼블릭 서브넷 ID 변수 저장

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 변수에 퍼블릭 서브넷 ID 값을 저장
export PubSubnet1=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text)

export PubSubnet2=$(aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet2" --query "Subnets[0].[SubnetId]" --output text)

// 퍼블릭 서브넷 ID를 전역 변수로 선언
echo "export PubSubnet1=$PubSubnet1" >> /etc/profile

echo "export PubSubnet2=$PubSubnet2" >> /etc/profile

// VPCID 변수 호출
echo $PubSubnet1

echo $PubSubnet2


변수 호출 (종합)

1
2
3
4
5
6
7
echo $AWS_DEFAULT_REGION

echo $CLUSTER_NAME

echo $VPCID

echo $PubSubnet1,$PubSubnet2




2. 관리 콘솔에서 Amazon EKS 배포


2.1. Amazon EKS 클러스터 생성 (관리 콘솔)

Amazon EKS 클러스터 생성에 앞서 IAM 역할이 필요합니다.
먼저 EKS 클러스터 IAM 역할을 생성 후 다음 작업을 진행합니다.


[관리 콘솔] EKS 클러스터 IAM Role 생성

  • AWS IAM 역할 메뉴로 진입합니다.
  • 역할 만들기 버튼을 클릭합니다.
  • 신뢰할 수 있는 엔터티 유형은 [AWS 서비스]로 선택합니다.
  • 사용 사례는 다른 AWS 서비스의 사용 사례에서 [EKS] 선택 후 [EKS - Cluster]를 선택하고 다음 버튼을 클릭합니다.
  • 연결되는 정책인 AmazonEKSClusterPolicy를 확인하고 다음 버튼을 클릭합니다.
  • 역할 이름eksClusterRole로 입력하고 역할 생성 버튼을 클릭합니다.


[관리 콘솔] EKS 클러스터 추가 생성

  • Amazon EKS 관리 콘솔에 접속하여 클러스터 추가 버튼을 클릭하고 [생성]을 선택합니다.
  • [클러스터 구성] 영역에서 이름myeks로 입력합니다.
  • [클러스터 구성] 영역에서 Kubernetes 버전은 [1.26]으로 선택합니다.
  • [클러스터 구성] 영역에서 클러스터 서비스 역할은 [eksClusterRole]을 선택하고 다음 버튼을 클릭합니다.
  • [네트워킹] 영역에서 VPC는 [myeks-VPC]를 선택합니다.
  • [네트워킹] 영역에서 서브넷은 [myeks-PublicSubnet1]과 [myeks-PublicSubnet2]를 선택합니다.
  • [클러스터 엔드포인트 액세스] 영역에서 [퍼블릭]을 선택하고 다음 버튼을 클릭합니다.
  • [로깅 구성] 영역은 별도의 설정 없이 다음 버튼을 클릭합니다.
  • [추가 기능 선택] 영역은 기본값을 유지하고 다음 버튼을 클릭합니다.
  • [선택한 추가 기능 설정 구성] 영역은 별도의 설정 없이 다음 버튼을 클릭합니다.
  • [검토 및 생성] 영역의 내용을 살펴보고 생성 버튼을 클릭합니다.

Note: 설정을 마치고 약 5분 정도 대기 시간이 흐른 뒤 EKS 클러스터 생성이 완료됩니다.


EKS 클러스터 정보를 kubeconfig 등록
myeks-host에서 생성한 EKS 클러스터와 통신을 위해 kubeconfig 생성 및 업데이트가 필요합니다.

1
2
3
4
5
6
7
8
9
10
11
// EKS 클러스터 정보 업데이트
aws eks update-kubeconfig --region $AWS_DEFAULT_REGION --name $CLUSTER_NAME

// kubeconfig 정보 확인
cat ~/.kube/config | yh

// kube_ps1 비활성화
kubeoff

// 생성한 Kubernetes 서비스 확인
kubectl get svc



2.2. Amazon EKS 노드 생성 (관리 콘솔)

Amazon EKS 노드 생성에 앞서 IAM 역할이 필요합니다.
먼저 EKS 노드 IAM 역할을 생성 후 다음 작업을 진행할 것인데 이번에는 관리 콘솔이 아닌 awscli를 통해 작업을 진행하겠습니다.


EKS 노드 IAM Role의 신뢰 엔터티 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// EKS 노드 IAM 역할의 신뢰 대상 지정 파일 생성
cat <<EOT > node-role-trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOT


EKS 노드 IAM Role 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// EKS 노드 IAM 역할 생성 (eksNodeRole)
aws iam create-role \
  --role-name eksNodeRole \
  --assume-role-policy-document file://"node-role-trust-policy.json"

// EKS 노드 IAM 역할에 정책 연결
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \
  --role-name eksNodeRole

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \
  --role-name eksNodeRole

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
  --role-name eksNodeRole


EKS 노드 IAM Role 확인

1
2
3
4
5
// EKS 노드 IAM 역할 확인
aws iam get-role --role-name eksNodeRole | jq

// EKS 노드 IAM 역할에 연결된 정책 확인
aws iam list-attached-role-policies --role-name eksNodeRole | jq


[관리 콘솔] EKS 관리형 노드 그룹 생성

  • 해당 링크를 클릭하여 Amazon EKS 클러스터 메뉴에서 생성한 myeks 클러스터의 컴퓨팅 탭으로 진입합니다.
  • [노드 그룹] 영역에서 노드 그룹 추가 버튼을 클릭합니다.
  • [노드 그룹 구성] 영역에서 이름myeks-nodegroup으로 입력합니다.
  • [노드 그룹 구성] 영역에서 노드 IAM 역할을 [eksNodeRole]으로 선택하고 다음 버튼을 클릭합니다.
  • [컴퓨팅 및 조정 구성 설정] 영역은 기본 값으로 유지하고 다음 버튼을 클릭합니다.
  • [노드 그룹 네트워크 구성] 영역에서 노드에 대한 원격 액세스 허용을 체크하여 확장하며 팝업에서 활성화 버튼을 클릭합니다.
  • EC2 키 페어자신의 키파일을 선택합니다.
  • 보안 그룹은 [eks-cluster-sg-myeks-XXXX]를 선택하고 다음 버튼을 클릭합니다.
  • [검토 및 생성] 영역의 내용을 살펴보고 생성 버튼을 클릭합니다.

Note: 설정을 마치고 약 3분 정도 대기 시간이 흐른 뒤 EKS 관리형 노드 그룹 생성이 완료됩니다. 생성이 완료되면 Amazon EKS 관리 콘솔에서 생성된 자원을 확인합니다.

Warning: 노드 그룹이 정상적으로 생성되지 않는다면 아래 토글 내용을 확인해 보길 바랍니다.

EKS 클러스터의 IAM OIDC 생성


EKS 클러스터의 IAM OIDC 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
// OIDC ID 값 확인
aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5

// 변수에 OIDC ID 값 저장 및 확인
export OIDC_ID=$(aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

echo $OIDC_ID

// IAM OIDC 제공업체 정보가 있는지 확인
aws iam list-open-id-connect-providers | grep $OIDC_ID

// IAM OIDC 제공업체 정보 생성
eksctl utils associate-iam-oidc-provider --cluster $CLUSTER_NAME --approve
// 출력 값 예시
2023-06-05 01:41:02 [ℹ]  will create IAM Open ID Connect provider for cluster "myeks" in "ap-northeast-2"
2023-06-05 01:41:02 [✔]  created IAM Open ID Connect provider for cluster "myeks" in "ap-northeast-2"




2.3. Amazon EKS 클러스터 삭제 (관리 콘솔)

Amazon EKS 클러스터 삭제를 할때 노드가 생성되어 있다면 노드 먼저 삭제해야 합니다.

[관리 콘솔] EKS 관리형 노드 그룹 삭제

  • 해당 링크를 클릭하여 생성된 myeks_nodegroup 페이지로 진입합니다.
  • 우측 상단에 삭제 버튼을 클릭합니다.
  • [삭제 노드 그룹] 팝업 창에서 myeks_nodegroup을 입력하고 삭제 버튼을 클릭합니다.

Note: 삭제를 진행하고 약 5분 정도 대기 시간이 흐른 뒤 EKS 관리형 노드 그룹 삭제가 완료됩니다.


[관리 콘솔] EKS 클러스터 삭제

  • Amazon EKS 클러스터 메뉴에 진입합니다.
  • 생성된 클러스터인 myeks를 선택하고 우측에 삭제 버튼을 클릭합니다.
  • [삭제 클러스터] 팝업 창에서 myeks을 입력하고 삭제 버튼을 클릭합니다.

Note: 삭제를 진행하고 약 3분 정도 대기 시간이 흐른 뒤 EKS 클러스터 삭제가 완료됩니다.




3. eksctl에서 Amazon EKS 배포


3.1. Amazon EKS 클러스터 생성 (eksctl)

eksctl 도구로 Amazon EKS 클러스터를 다음과 같은 명령어로 생성합니다.


eksctl에 활용할 변수 확인

1
2
3
4
5
6
7
8
9
echo $AWS_DEFAULT_REGION

echo $CLUSTER_NAME

echo $VPCID

echo $PubSubnet1

echo $PubSubnet2


eksctl 사용 연습(배포 없이 확인만)


// eksctl 명령어
eksctl

// eksctl create 명령어
eksctl create

// eksctl create cluster or nodegroup 명령어 (--help)
eksctl create cluster -h

eksctl create nodegroup -h

// 지원하는 Kubernetes 버전 정보
eksctl create cluster -h | grep version


// 클러스터 생성 확인 - 기본 값
eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --dry-run | yh


// EKS 클러스터 생성 확인 - 노드 그룹 (X)
eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --without-nodegroup \
  --dry-run | yh


// EKS 클러스터 생성 확인 - 노드 그룹 (X), 가용 영역 (2a, 2c) 
eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --without-nodegroup \
  --zones=ap-northeast-2a,ap-northeast-2c \
  --dry-run | yh


// EKS 클러스터 생성 확인 - 노드 그룹 생성(이름, 인스턴스 타입, EBS볼륨사이즈, SSH접속허용), 가용 영역 (2a, 2c), VPC IP 대역
eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --nodegroup-name=$CLUSTER_NAME-nodegroup \
  --node-type=t3.medium \
  --node-volume-size=30 \
  --zones=ap-northeast-2a,ap-northeast-2c \
  --vpc-cidr=172.20.0.0/16 \
  --ssh-access \
  --dry-run | yh


[eksctl] EKS 클러스터 & 관리형 노드 그룹 생성

1
2
3
4
5
6
7
8
9
10
11
12
// EKS 클러스터 및 관리형 노드 그룹 생성 전 정보 확인 (dry-run 옵션)
eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --nodegroup-name=$CLUSTER_NAME-nodegroup \
  --node-type=t3.medium \
  --node-volume-size=30 \
  --vpc-public-subnets "$PubSubnet1,$PubSubnet2" \
  --version 1.26 \
  --ssh-access \
  --external-dns-access \
  --dry-run | yh


1
2
3
4
5
6
7
8
9
10
11
12
// EKS 클러스터 및 관리형 노드 그룹 생성
eksctl create cluster \
  --name $CLUSTER_NAME \
  --region=$AWS_DEFAULT_REGION \
  --nodegroup-name=$CLUSTER_NAME-nodegroup \
  --node-type=t3.medium \
  --node-volume-size=30 \
  --vpc-public-subnets "$PubSubnet1,$PubSubnet2" \
  --version 1.26 \
  --ssh-access \
  --external-dns-access \
  --verbose 4


Note: eksctl 도구로 EKS 클러스터를 배포하면 약 15~20분 정도 대기 시간이 흐른 뒤 EKS 클러스터 생성이 완료됩니다.



3.2. Amazon EKS 클러스터 정보 확인 및 설정 (eksctl)

eksctl 도구로 앞서 생성한 Amazon EKS 클러스터 정보를 다음과 같은 명령어로 확인합니다.


krew 플러그인 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// krew로 설치한 플러그인 확인
kubectl krew list

// kube_ps1 활성화
kubeon

// ctx 플러그인 확인
kubectl ctx

// ns 플러그인 확인
kubectl ns

kubectl ns default

// 모든 네임스페이스의 모든 리소스 확인
kubectl get-all


EKS 클러스터 정보 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// kubectl을 통한 클러스터 정보 확인
kubectl cluster-info

// eksctl을 통한 클러스터 정보 확인
eksctl get cluster

// awscli를 통한 클러스터 정보 확인 (상세)
aws eks describe-cluster --name $CLUSTER_NAME | jq

// awscli를 통한 클러스터 정보 확인 (API 서버 주소만 추출)
aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint

// API 서버 주소 변수 저장 및 dig 조회
APIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)

dig +short $APIDNS

// API 서버 접속
curl -k -s https://$APIDNS | jq

curl -k -s https://$APIDNS/version | jq


EKS 노드 그룹 정보 확인

1
2
3
4
5
6
7
8
9
10
11
12
// eksctl을 통한 노드 그룹 정보 확인
eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup

// awscli를 통한 노드 그룹 정보 확인 (상세)
aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-nodegroup | jq

// kubectl을 통한 노드 정보 확인
kubectl get node

kubectl get node -owide

kubectl get node -v=6


파드 정보 확인

1
2
3
4
5
6
7
8
9
10
// 현재 네임스페이스에 파드 정보 확인
kubectl get pod

// 모든 네임스페이스에 파드 정보 확인
kubectl get pod -A

// kube-system 네임스페이스에 파드 정보 확인
kubectl get pod -n kube-system

kubectl get pod -n kube-system -owide


워커 노드의 프라이빗 IP 확인 및 변수 지정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// EC 인스턴스의 프라이빗/퍼블릭 IP 확인
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table

// 워커 노드의 프라이빗 IP 주소를 변수에 입력 및 확인
kubectl get node -o jsonpath={.items[0].status.addresses[0].address}
kubectl get node -o jsonpath={.items[1].status.addresses[0].address}

export N1=$(kubectl get node -o jsonpath={.items[0].status.addresses[0].address})
export N2=$(kubectl get node -o jsonpath={.items[1].status.addresses[0].address})

echo "export N1=$N1" >> /etc/profile
echo "export N2=$N2" >> /etc/profile

echo $N1
echo $N2

// 워커 노도의 노드 이름을 변수에 입력 및 확인
kubectl get node -o jsonpath={.items[0].status.addresses[3].address}
kubectl get node -o jsonpath={.items[1].status.addresses[3].address}

export NN1=$(kubectl get node -o jsonpath={.items[0].status.addresses[3].address})
export NN2=$(kubectl get node -o jsonpath={.items[1].status.addresses[3].address})

echo "export NN1=$NN1" >> /etc/profile
echo "export NN2=$NN2" >> /etc/profile

echo $NN1
echo $NN2


워커 노드 SSH 접속 및 명령어 입력

1
2
3
4
5
6
7
8
9
10
11
// 워커 노드 SSH 접속 후 빠져 나오기
ssh ec2-user@$N1 
exit

ssh ec2-user@$N2
exit

// 워커 노드 SSH 접속하여 명령어만 반환
ssh ec2-user@$N1 hostname

ssh ec2-user@$N2 hostname


워커 노드의 프로세스 정보 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// kubelet 상태 정보
ssh ec2-user@$N1 sudo systemctl status kubelet

ssh ec2-user@$N2 sudo systemctl status kubelet

// 프로세스 확인
ssh ec2-user@$N1 sudo pstree
ssh ec2-user@$N1 sudo ps afxuwww

ssh ec2-user@$N2 sudo pstree
ssh ec2-user@$N2 sudo ps afxuwww

// 컨테이너 런타임 확인
ssh ec2-user@$N1 sudo ps axf |grep /usr/bin/containerd

ssh ec2-user@$N2 sudo ps axf |grep /usr/bin/containerd


워커 노드의 네트워크 정보 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 인터페이스 IP 주소 확인
ssh ec2-user@$N1 sudo ip -c addr

ssh ec2-user@$N2 sudo ip -c addr

// 라우팅 테이블 확인
ssh ec2-user@$N1 sudo ip -c route

ssh ec2-user@$N2 sudo ip -c route

// NAT iptables 확인
ssh ec2-user@$N1 sudo iptables -t nat -S

ssh ec2-user@$N2 sudo iptables -t nat -S


워커 노드의 스토리지 정보 확인

1
2
3
4
// 스토리지 정보
ssh ec2-user@$N1 lsblk

ssh ec2-user@$N2 lsblk


워커 노드의 통신 대상 확인

1
2
3
4
5
6
7
8
9
10
11
// TCP 세션 확인 (kubelet과 kubeproxy의 Peer IP 확인)
ssh ec2-user@$N1 sudo ss -tnp
ssh ec2-user@$N2 sudo ss -tnp

// API 서버 주소 dig 조회
dig +short $APIDNS

// 새로운 터미널에서 kebectl으로 노드에 bash 셸 접근
kubectl node-shell $NN1

exit


EKS 보안 그룹 확인

1
2
3
4
5
// 보안 그룹 ID와 이름 확인
aws ec2 describe-security-groups --query 'SecurityGroups[*].[GroupId, GroupName]' --output text | grep myeks

// 각각의 보안 그룹 정보 확인
aws ec2 describe-security-groups --group-ids --output yaml sg-XXXXXXXXXXX | yh


파드 배포

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 새로운 터미널에서 파드와 서비스 모니터링
watch -d 'kubectl get pod,svc'

// 슈퍼마리오 디플로이먼트 다운 및 확인
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml

cat mario.yaml | yh

// 슈퍼마리오 디플로이먼트 배포
kubectl apply -f mario.yaml

// 슈퍼마리오 디플로이먼트 배포 확인 (CLB 확인)
kubectl get deploy,svc,ep mario

// 슈퍼마리오 CLB 주소 추출
kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Mario URL = http://"$1 }'


생성한 파드 삭제

1
2
// 생성한 파드 삭제
kubectl delete -f mario.yaml


관리형 노드 그룹에 노드 추가 및 삭제

1
2
3
4
5
6
7
8
9
10
11
// 새로운 터미널에서 EC2 인스턴스 생성 모니터링
while true; do aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text ; echo "------------------------------" ; sleep 1; done

// EKS 노드 그룹 정보 확인
eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup

// EKS 노드 수 증가 (2개 -> 3개)
eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 3 --nodes-min 3 --nodes-max 6

// EKS 노드 수 감소 (3개 -> 2개)
eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 2 --nodes-min 2 --nodes-max 4




4. 실습 환경 삭제


eksctl 도구와 awscli 도구로 실습에 진행한 모든 자원을 삭제합니다.


Amazon EKS 클러스터 삭제

1
2
// eksctl 도구로 Amazon EKS 클러스터 삭제
eksctl delete cluster --name $CLUSTER_NAME

Warning: Amazon EKS 클러스터(+노드 그룹) 삭제는 약 10분 정도 소요됩니다. 반드시 클러스터 삭제를 확인하고 다음 단계를 진행합니다.


기본 인프라 삭제

1
2
// awscli 도구로 기본 인프라 삭제
aws cloudformation delete-stack --stack-name $CLUSTER_NAME

Warning: 기본 인프라 삭제는 약 5분 정도 소요됩니다. 정상적으로 자원 삭제 되었는지 꼭 확인을 합니다.




여기까지 1장 실습을 마칩니다.
수고하셨습니다 :)