ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AEWS] Wk1-2. EKS 클러스터 배포
    IT/AWS 2023. 4. 30. 09:03

    다음으로, 클러스터 배포 내용에 대해서 확인해 보겠습니다.

    먼저 EC2 인스턴스를 통해서 작업할 예정이기 때문에, 다음과 같이 Bastion을 만들어 주고, 배포를 시작합니다.

    EKS 클러스터 생성에 앞서서 VPC, Subnet4개, EC2 1대 + 보안그룹 등을 설정하고,

    다음 내용을 통해서 작업에 필요한 기본적인 도구들이 설치되었는지 확인합니다.

    만약 설치되어 있지 않다면, 해당 도구들을 설치해야 합니다.

     

    EKS 배포는 다음과 같이 다양한 방법을 통해서 배포가 가능하나,

    eksctl을 통해서 배포하였습니다.

     

    1. 도구 설치

    # 기본 툴 및 SSH 키 설치 등 확인
    kubectl version --client=true -o yaml | yh
      gitVersion: v1.25.7-eks-a59e1f0
    
    eksctl version
    0.138.0
    
    aws --version
    aws-cli/2.11.15 Python/3.11.3 Linux/4.14.311-233.529.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
    
    ls /root/.ssh/id_rsa*
    
    # 도커 엔진 설치 확인
    docker info

    이후, 클러스터 생성에 필요한 변수들을 설정합니다.

     

    2. 클러스터에 필요한 변수 설정

    # 자격 구성 설정 없이 확인
    aws ec2 describe-instances
    
    # IAM User 자격 구성 : 실습 편리를 위해 administrator 권한을 가진 IAM User 의 자격 증명 입력
    aws configure
    
    # 자격 구성 적용 확인 : 노드 IP 확인
    aws ec2 describe-instances
    
    # EKS 배포할 VPC 정보 확인
    aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq Vpcs[].VpcId
    aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId
    export VPCID=$(aws ec2 describe-vpcs --filters "Name=tag:Name,Values=$CLUSTER_NAME-VPC" | jq -r .Vpcs[].VpcId)
    echo "export VPCID=$VPCID" >> /etc/profile
    echo VPCID
    
    # EKS 배포할 VPC에 속한 Subnet 정보 확인
    aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output json | jq
    aws ec2 describe-subnets --filters "Name=vpc-id,Values=$VPCID" --output yaml | yh
    
    ## 퍼블릭 서브넷 ID 확인
    aws ec2 describe-subnets --filters Name=tag:Name,Values="$CLUSTER_NAME-PublicSubnet1" --query "Subnets[0].[SubnetId]" --output text
    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)
    echo "export PubSubnet1=$PubSubnet1" >> /etc/profile
    echo "export PubSubnet2=$PubSubnet2" >> /etc/profile
    echo $PubSubnet1
    echo $PubSubnet2

    3. 클러스터 배포

    # 변수 확인
    echo $AWS_DEFAULT_REGION
    echo $CLUSTER_NAME
    echo $VPCID
    echo $PubSubnet1,$PubSubnet2
    
    # 옵션 [터미널1] 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
    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
    
    # 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.24 --ssh-access --external-dns-access --dry-run | yh
    
    # 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.24 --ssh-access --external-dns-access --verbose 4
    ...

    생성 후에,  API 서버 엔드포인트 액세스가 퍼블릭으로 설정되어 있는지, Kubernetes 버전이 최신 버전으로 설정되어 있는지 정상적으로 동작하고 있는지 등을 확인합니다.

     

    4. 클러스터 정보 확인

    다음으로, 생성된 클러스터 정보를 확인해 보겠습니다.

    # eks 클러스터 정보 확인
    kubectl cluster-info
    eksctl get cluster
    aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint
    # eks API 접속 시도
    curl -k -s $(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint)
    curl -k -s $(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint)/version | jq

    상기 API 접속 시도 시, endpoint에 대해서 -k 옵션을 주어서, ssl 인증서에 대한 검증 없이 연결을 시도하였으나,

    결과는 Forbidden으로 떨어집니다.

    그렇다면, jq로 엔드포인트에 대한 버전을 읽어보면, 해당 내용은 잘 읽히는 것을 확인할 수 있습니다.

     

    5. Node 접속 시도

    다음으로는 Node에 접속하여 해당 내용을 자세하게 확인하려고 합니다.

    # 노드 IP 확인 및 PrivateIP 변수 지정
    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
    **N1=$(**kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2a -o jsonpath={.items[0].status.addresses[0].address})
    **N2=$**(kubectl get node --label-columns=topology.kubernetes.io/zone --selector=topology.kubernetes.io/zone=ap-northeast-2c -o jsonpath={.items[0].status.addresses[0].address})
    ****echo $N1, $N2
    
    # eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
    ping <IP>
    ping -c 2 $N1
    ping -c 2 $N2

    다음과 같이 Node1번과, Node2번을 설정, 보안 그룹을 설정한 다음에, 핑테스트를 시행합니다.

    # 노드 보안그룹 ID 확인
    aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query "SecurityGroups[*].[GroupId]" --output text
    NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values=*nodegroup* --query "SecurityGroups[*].[GroupId]" --output text)
    echo $NGSGID
    
    # 노드 보안그룹에 eksctl-host 에서 노드(파드)에 접속 가능하게 룰(Rule) 추가 설정
    aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr **192.168.1.100/32**
    
    # eksctl-host 에서 노드의IP나 coredns 파드IP로 ping 테스트
    ping -c 2 $N1
    ping -c 2 $N2
    
    # 워커 노드 SSH 접속
    **ssh -i ~/.ssh/id_rsa ec2-user@$N1 hostname
    ssh -i ~/.ssh/id_rsa ec2-user@$N2 hostname**
    **ssh -i ~/.ssh/id_rsa ec2-user@$N1 
    exit**
    **ssh -i ~/.ssh/id_rsa ec2-user@$N2
    exit**

    다음을 통해서 노드의 네트워크 정보를 확인합니다.

     

    6. EKS owned ENI

    다음으로, 스터디 중 살펴보았던 EKS owned ENI에 대해서 확인해 보겠습니다.

     

    EKS owned ENI : 관리형 노드 그룹의 워커 노드는 내 소유지만, 

    연결된 ENI(NIC)의 인스턴스(관리형 노드)는 AWS 소유가 됩니다.

    # kubelet, kube-proxy 통신 Peer Address는 어딘인가요?
    ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp
    ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp

    해당 명령어를 통해서 확인해 보면, kubelet과 kube-proxy가 가리키는 Peer Address는 API 서버임을 알 수 있습니다.

    # [터미널] aws-node 데몬셋 파드 1곳에 bash 실행해두기 
    kubectl exec daemonsets/aws-node -it -n kube-system -c aws-node -- bash
    
    # exec 실행으로 추가된 연결 정보의 Peer Address는 어딘인가요? >> AWS 네트워크 인터페이스 ENI에서 해당 IP 정보 확인
    ssh -i ~/.ssh/id_rsa ec2-user@$N1 sudo ss -tnp
    ssh -i ~/.ssh/id_rsa ec2-user@$N2 sudo ss -tnp

     

    감사합니다.

    728x90
    반응형
Designed by Tistory.