eksctl을 통한 Amazon EKS 확인 및 설정

SummerToday·2024년 8월 24일
0

Amazon EKS 기본 강의

목록 보기
6/6
post-thumbnail
post-custom-banner

관련 플러그인 설치 확인

# krew로 설치한 플러그인 목록 출력
kubectl krew list

# kube_ps1 활성화, Kubernetes 클러스터와 네임스페이스 정보가 프롬프트에 추가로 표시된다. 붉은 색 영역이 컨텍스트이고 노란색 # 영역이 네임스페이스이로, 현재 작업 중인 위치를 알 수 있다.
kubeon

# ctx 플러그인 확인, 사용 가능한 컨텍스트 목록이 표시되며, 명령을 통해 컨텍스트를 전환할 수 있다.
kubectl ctx

# ns 플러그인 확인, 사용 가능한 네임스페이스 목록이 표시되며, 명령을 통해 네임스페이스를 전환할 수 있
kubectl ns

kubectl ns default # kube_ps1과 정보를 맞추기 위해 네임 스페이스를 default로 지정한다.

# 모든 네임스페이스의 모든 리소스 확인
kubectl get-all
  • krew 플러그인
    krew는 kubectl의 플러그인 관리 도구로, 다양한 플러그인을 설치하고 관리할 수 있다. kubectl의 기능을 확장하는 플러그인을 쉽게 설치하고 업데이트할 수 있다.

    • kube 플러그인 설치 명령어

      (
      set -x; cd "$(mktemp -d)" &&
      OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
      ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
      KREW="krew-${OS}_${ARCH}" &&
      curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
      tar zxvf "${KREW}.tar.gz" &&
      ./"${KREW}" install krew
      )

    • 설치 후, ~/.krew/bin 디렉토리를 PATH에 추가하여 krew 명령어를 사용할 수 있도록 설정해야 한다.
      export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"


  • kubeon
    kube_ps1이라는 셸 프롬프트 확장 기능을 활성화하는 명령어이다.

    • kube_ps1
      kube_ps1은 사용자의 셸 프롬프트에 현재 사용 중인 Kubernetes 컨텍스트와 네임스페이스를 표시해주는 유틸리티입니다. 이를 통해 어떤 클러스터와 네임스페이스에서 작업 중인지 한눈에 파악할 수 있다.

      • 컨텍스트
        클러스터, 사용자, 네임스페이스 등의 정보를 묶어 하나의 작업 환경을 정의하며, 여러 클러스터 및 환경 간에 쉽게 전환할 수 있도록 한다.

      • 네임스페이스
        클러스터 내의 리소스를 논리적으로 분리하여 그룹화하며, 동일한 클러스터 내에서 서로 다른 환경(예: 개발, 테스트, 프로덕션)을 분리하고 관리하는 데 사용된다.

        • kube_ps1 설치 명령어
          git clone https://github.com/jonmosco/kube-ps1.git

        • 셸 설정 파일에 다음


  • kubectl ctx
    kubectl의 플러그인으로, 현재 사용 중인 Kubernetes 컨텍스트(context)나 다른 컨텍스트로 변경이 가능하다. 멀티 클러스터 환경에서 관리할 때 유용하게 사용된다.

    • kube ctx 플러그인 설치 명령어

      kubectl krew install ctx
      
      vi ~/.bashrc # bashrc에 설정 추가 및 적용
      
      # 아래 내용 추가
      source /path/to/kube-ps1.sh
      PS1='[\u@\h \W $(kube_ps1)]\$ '
      
      source ~/.bashrc # 현재 셸에서 ~/.bashrc 파일의 내용을 실행하여, 파일에 정의된 설정이나 환경 변수를 다시 적용하는 명령어

  • kubectl ns
    ns는 kubectl의 플러그인으로, 현재 작업 중인 네임스페이스(namespace)를 빠르게 전환할 수 있는 명령어이다.

    • kubectl ns 플러그인 설치 명령어
      kubectl krew install ns


  • kubectl get-all
    현재 네임스페이스에 있는 주요 Kubernetes 리소스(예: Pods, Services, Deployments, ReplicaSets 등)를 모두 한 번에 조회한다.


EKS 클러스터 정보 확인

# 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
  • kubectl cluster-info
    명령어는 현재 설정된 특정 Kubernetes 클러스터의 기본 정보(API 서버와 CoreDNS 서비스의 주소 등)를 출력합니다. 클러스터가 정상적으로 동작 중인지 확인할 때 유용하다.

  • eksctl get cluster
    AWS 계정 내에서 관리되는 모든 EKS 클러스터의 상태와 기본 정보를 제공한다.

  • aws eks describe-cluster --name $CLUSTER_NAME | jq
    awscli를 사용하여 특정 EKS 클러스터에 대한 상세 정보를 JSON 형식으로 출력합니다. jq를 사용하여 출력된 JSON을 읽기 쉽게 포맷팅한다.

    • aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint
      aws eks describe-cluster 명령어로 클러스터 정보를 조회한 후, jq를 사용해 클러스터 API 서버의 엔드포인트 주소만 추출하여 출력한다.
  • PIDNS=$(aws eks describe-cluster --name $CLUSTER_NAME | jq -r .cluster.endpoint | cut -d '/' -f 3)
    클러스터 API 서버의 DNS 이름(도메인)을 추출하여 APIDNS 변수에 저장한다. cut 명령어를 사용하여 https:// 프로토콜 부분과 경로를 제거하고 순수한 도메인 이름만 추출한다.

    • cut -d '/' -f 3

      • cut은 텍스트 파일이나 명령어 출력에서 특정 필드를 추출할 때 사용하는 명령어다. 주로 구분자(delimiter)를 기준으로 필드를 나누고, 그 중 필요한 부분을 가져올 때 사용된다.

      • -d 옵션은 cut 명령어에서 필드를 구분할 때 사용하는 구분자를 지정하는 데 사용됩니다. 여기서 -d '/'는 슬래시(/)를 구분자로 사용하겠다는 의미이다.

      • -f 옵션은 구분자로 나누어진 텍스트에서 추출할 필드(부분)의 번호를 지정합니다. 여기서 -f 3은 세 번째 필드를 추출하겠다는 의미이다.

  • dig +short $APIDNS
    dig 명령어를 사용해 APIDNS에 저장된 DNS 이름을 조회하여 해당 도메인의 IP 주소를 확인한다. +short 옵션은 결과를 간단하게 출력하도록 한다. 보통 AWS EKS 클러스터의 API 서버가 배치된 Network Load Balancer (NLB)의 IP 주소가 출력된다.


EKS 노드 그룹 정보 확인

# 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
  • eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup
    eksctl을 사용하여 특정 EKS 클러스터에서 지정된 노드 그룹의 정보를 조회한다. 노드 그룹의 이름, 상태, 인스턴스 타입, 최소/최대 노드 수, 현재 노드 수 등의 기본 정보를 출력한다.
    해당 명령어 사용 시 노드 그룹이 정상적으로 작동 중인지, 몇 개의 노드가 할당되어 있는지를 쉽게 확인할 수 있다.

  • aws eks describe-nodegroup --cluster-name $CLUSTER_NAME --nodegroup-name $CLUSTER_NAME-nodegroup | jq
    awscli를 사용해 특정 EKS 클러스터의 노드 그룹에 대한 상세 정보를 JSON 형식으로 조회한다. jq는 이 JSON 출력을 가독성 있게 포맷팅하는 데 사용된다.

  • kubectl get node
    Kubernetes 클러스터에서 현재 동작 중인 모든 노드의 목록을 출력한다. 각 노드의 이름, 상태(Ready/NotReady), 역할, 버전, 나이(age) 등을 기본적으로 보여준다.

  • kubectl get node -owide
    kubectl get node 명령어에 -o wide 옵션을 추가하여 노드에 대한 확장된 정보를 출력한다. 기본 정보 외에도 노드의 IP 주소, 호스트네임, 컨테이너 런타임, OS 이미지 등의 추가적인 정보를 포함한다.

  • kubectl get node -v=6
    kubectl 명령어에 -v=6 옵션을 추가하여 디버깅 목적의 상세 로그를 활성화한다. 이 명령어는 노드 정보를 출력하는 과정에서 발생하는 내부 API 호출 및 처리 과정을 매우 상세하게 로그로 출력한다.
    주로 디버깅이나 문제 해결을 위해 사용되며, 일반적인 사용에서는 잘 사용되지 않는다. -v 뒤의 숫자는 로그의 상세 수준을 나타내며, 숫자가 높을수록 더 많은 디버그 정보를 출력한다.

    myeks-host에서 kubectl 명령을 API 서버에게 전달하려면 자신의 kubeconfig를 확인해 보안 토큰으로 API 서버에 통신을 수행한다. 이 후 클러스터 엔드포인트 주소에 api 형태로 노드 정보를 요청해서 전달받은 값을 표시하는 것이다. 이러한 모든 과정이 출력 값을 표시가 된다.


파드 정보 확인

# 현재 네임스페이스에 파드 정보 확인
kubectl get pod

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

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

kubectl get pod -n kube-system -owide
  • kubectl get pod
    kubectl이 설정된 네임스페이스에서 실행 중인 모든 파드의 정보를 조회한다. 파드의 이름, 상태(Running, Pending, Succeeded, Failed 등), 재시작 횟수, 클러스터에서 실행된 시간을 기본적으로 출력한다.

  • kubectl get pod -A
    클러스터의 모든 네임스페이스에서 실행 중인 모든 파드의 정보를 조회한다. -A 옵션은 --all-namespaces의 약어이다.

  • kubectl get pod -n kube-system
    kube-system 네임스페이스에서 실행 중인 파드의 정보를 조회합니다. -n 옵션은 특정 네임스페이스를 지정할 때 사용된다.
    kube-system 네임스페이스는 Kubernetes 시스템 관련 파드들이 실행되는 네임스페이스로, 클러스터의 핵심 구성 요소들이 이곳에 위치한다(예: kube-apiserver, kube-controller-manager, kube-dns 등).
    해당 명령어를 통해 클러스터의 핵심 서비스들이 제대로 실행되고 있는지 확인할 수 있다.

  • kubectl get pod -n kube-system -owide
    kube-system 네임스페이스에서 실행 중인 파드의 정보를 확장된 형태로 조회합니다. -o wide 옵션은 파드에 대한 추가 정보를 출력하는 데 사용된다.
    기본 정보 외에 파드가 실행 중인 노드의 이름, 파드의 IP 주소, 컨테이너 이미지, 더 자세한 파드 상태 등을 포함한 확장된 정보를 출력한다.

    kube-system 네임 스페이스에 존재하는 파드들을 보면 API 서버나 스케쥴러 등과 같은 시스템 파드들든 AWS Managed VPC에 위치해 AWS 관리형으로 동작하고 있기 때문이다.


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

# 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
  • 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

    • aws ec2 describe-instances
      AWS CLI 명령어로, 현재 계정에서 실행 중인 EC2 인스턴스의 세부 정보를 가져온다.

    • --query
      jq와 유사한 형식으로 JSON 출력 결과를 필터링하여 필요한 정보만 선택할 수 있도록 한다.

    • "Reservations[*].Instances[*]"
      각 인스턴스에 대한 정보를 나타내는 경로이다.

      Reservations는 AWS에서 EC2 인스턴스와 관련된 정보를 그룹화한 개념이다.

      • PublicIpAddress, PrivateIpAddress
        각각 인스턴스의 공인 IP와 사설 IP 주소를 나타내는 필드이다.

      • Tags[?Key=='Name']|[0].Value
        EC2 인스턴스에 설정된 태그 중에서 Name이라는 키의 값을 가져온다.

      • State.Name
        인스턴스의 상태를 나타내며, running, stopped 등의 상태가 있을 수 있다.


    • --filters: EC2 인스턴스를 필터링하는 옵션으로, Name=instance-state-name,Values=running는 실행 중인(running) 인스턴스만 선택하도록 한다.

    • --output table: 결과를 표 형식으로 출력한다. --output json, --output text 등 다른 형식으로도 출력할 수 있다.


  • kubectl get node -o jsonpath={.items[0].status.addresses[0].address}

    • kubectl get node
      Kubernetes 클러스터의 노드 목록을 조회하는 명령어다.

    • -o jsonpath={}
      출력 결과를 JSONPath 형식으로 필터링하여 원하는 필드만 선택할 수 있다.

    • .items[0].status.addresses[0].address
      첫 번째 노드의 첫 번째 주소를 선택한다. 일반적으로 프라이빗 IP 주소다.


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

    • export N1=
      N1이라는 환경 변수를 설정합니다. 이 변수는 현재 셸 세션에서만 유지된다.

    • $(...)
      명령어를 실행하고 그 출력을 변수에 할당하는 구문이다. 예를 들어, $(kubectl get node...)는 명령어의 결과(IP 주소)를 N1에 할당한다.


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

    • echo "export N1=$N1" >> /etc/profile
      /etc/profile 파일에 N1 환경 변수를 설정하는 명령어를 추가한다. /etc/profile은 시스템이 부팅될 때 모든 사용자에게 공통적으로 적용되는 설정을 포함하는 파일이다.

    • >>
      파일에 내용을 추가하는 연산자이다. 기존 파일 내용을 덮어쓰지 않고, 새로운 내용을 추가한다.


  • echo $N1
    N1 변수에 저장된 값을 출력한다.


  • kubectl get node -o jsonpath={.items[0].status.addresses[3].address}

    • .items[0].status.addresses[3].address
      첫 번째 노드의 네 번째 주소를 선택한다. 일반적으로 노드 이름이나 호스트 이름에 해당한다.

워커 노드 SSH 접속

# 워커 노드 SSH 접속 후 빠져 나오기
ssh ec2-user@$N1 
exit

ssh ec2-user@$N2
exit

# 워커 노드 SSH 접속하여 hostname 명령어 실행
ssh ec2-user@$N1 hostname

ssh ec2-user@$N2 hostname
  • 참고
    SSH 키 페어를 베스천 호스트의 특정 폴더에 저장해두면 명령어에 별도로 키 지정을 안해도 된다.

    1. SSH 키 페어를 적절한 위치에 저장

      mv /path/to/your-key.pem ~/.ssh/your-key.pem
      chmod 600 ~/.ssh/your-key.pem # 파일의 권한을 변경하여, 소유자만 읽고 쓸 수 있도록 합니다. 이는 SSH가 키 파일을 안전하게 사용하는 데 필수적이다.
      

      Bastion 호스트의 ~/.ssh 폴더에 SSH 키 페어를 저장한다.


    2. SSH 설정 파일 수정 (~/.ssh/config)

      nano ~/.ssh/config
      
      Host your-ec2-instance
        HostName <노드의 프라이빗 IP 또는 퍼블릭 IP>
        User ec2-user
        IdentityFile ~/.ssh/your-key.pem
      
      Host your-ec2-instance
        HostName <노드의 프라이빗 IP 또는 퍼블릭 IP>
        User ec2-user
        IdentityFile ~/.ssh/your-key.pem
      
      ...
      

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

// 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
  • ssh ec2-user@$N1 sudo systemctl status kubelet
    접속한 워커 노드 서버에서 관리자 권한으로 kubelet 서비스의 상태를 확인한다.

    • systemctl status kubelet
      systemd로 관리되는 kubelet 서비스의 현재 상태를 보여준다. 여기에는 서비스가 활성화되어 있는지, 실행 중인지, 실패했는지 등에 대한 정보가 포함된다.


  • ssh ec2-user@$N1 sudo pstree
    시스템에서 실행 중인 프로세스들이 어떤 부모-자식 관계로 연결되어 있는지를 직관적으로 볼 수 있다.

  • ssh ec2-user@$N1 sudo ps afxuwww
    현재 시스템에서 실행 중인 모든 프로세스를 자세히 나열하는 명령어이다.

    • a
      터미널에 관계없이 모든 프로세스를 보여줍니다.

    • f
      프로세스 간의 부모-자식 관계를 트리 형식으로 보여줍니다.

    • x
      특정 터미널에 종속되지 않은 모든 프로세스를 포함시킵니다.

    • u
      각 프로세스에 대해 사용자, CPU, 메모리 사용량 등을 포함한 추가 정보를 표시합니다.

    • www
      출력 라인을 잘리지 않도록 전체 명령어 줄을 표시합니다.


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

    cf. kubernetes 1.24 버전 이후로 컨테이너 런타임은 containerd를 사용한다.

    • ps axf
      시스템에서 실행 중인 모든 프로세스를 나열하고, 트리 형식으로 보여준다.

    • grep /usr/bin/containerd
      프로세스 목록에서 containerd 실행 경로(/usr/bin/containerd)와 일치하는 프로세스를 필터링한다.

      • grep
        특정 패턴과 일치하는 텍스트를 검색하는 명령어이다. 여기서는 containerd라는 컨테이너 런타임 프로세스를 검색한다.


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

// 인터페이스 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
  • ssh ec2-user@$N1 sudo ip -c addr

    • sudo
      명령어를 관리자 권한으로 실행한다. 네트워크 설정을 확인하려면 일반적으로 관리자 권한이 필요합니다.

    • ip addr
      시스템의 네트워크 인터페이스에 대한 상세 정보를 표시한다. 여기에는 각 인터페이스의 IP 주소, 브로드캐스트 주소, 네트워크 마스크 등이 포함된다.

    • -c
      터미널에서 정보를 쉽게 구분할 수 있도록 컬러 출력을 활성화 한다.


  • ssh ec2-user@$N1 sudo ip -c route

    • sudo ip -c route:

      • ip route
        현재 시스템의 라우팅 테이블을 표시한다.

      • -c
        컬러 출력을 활성화한다.


  • ssh ec2-user@$N1 sudo iptables -t nat -S

    • sudo iptables -t nat -S

      • iptables
        리눅스 시스템에서 네트워크 패킷 필터링 규칙을 설정하고 관리하는 명령어다.

      • -t nat
        NAT(Network Address Translation) 테이블을 대상으로 지정한다. NAT 테이블은 네트워크 주소 변환과 관련된 규칙을 포함하고 있다.

      • -S
        현재의 모든 규칙을 나열하는 옵션이다.


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

// 스토리지 정보
ssh ec2-user@$N1 lsblk

ssh ec2-user@$N2 lsblk
  • lsblk
    "list block devices"의 약자로, 시스템에 연결된 블록 디바이스(주로 디스크 장치와 그 파티션)를 트리 구조로 보여준다.
    각 디스크의 이름, 크기, 유형(예: 디스크, 파티션), 마운트 포인트 등의 정보를 확인할 수 있다.

워커 노드의 통신 대상 확인

# 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
  • ssh ec2-user@$N1 sudo ss -tnp
    각 워커 노드에서 kubelet 및 kube-proxy와 같은 주요 Kubernetes 컴포넌트들이 사용 중인 TCP 세션과 연결된 Peer IP를 확인하는 데 사용된다.

    • sudo
      명령어를 관리자 권한으로 실행합니다. 네트워크 관련 정보는 보통 관리자 권한이 필요합니다.

    • ss
      ss 명령어는 소켓 통계(socket statistics)를 보여주는 유틸리티로, 현재 시스템에서 열려 있는 소켓(네트워크 연결)에 대한 정보를 제공합니다.

      • 소켓
        소켓(Socket)은 네트워크 통신에서 데이터를 주고받기 위한 끝점(Endpoint)을 정의하는 개념이다. IP 주소, 포트 번호, 프로토콜로 구성되어 있으며, 이들을 결합하여 네트워크 상의 특정 서비스와 통신을 가능하게 한다. 소켓을 통해 클라이언트와 서버 간의 연결이 이루어지고, 데이터를 송수신하며, 통신 세션을 관리할 수 있다.
    • -t
      TCP 소켓만 표시한다.

    • -n
      호스트 이름을 숫자 IP 주소로 표시하며, 포트도 숫자로 표시한다.

    • -p
      연결된 프로세스의 정보를 표시한다. 이는 각 연결이 어떤 프로세스에 의해 관리되고 있는지 확인하는 데 유용하다.


  • dig +short $APIDNS
    $APIDNS에 저장된 Kubernetes API 서버의 DNS 이름을 IP 주소로 조회한다.

    • dig
      DNS 조회 도구로, 도메인 이름에 대한 정보를 확인하는 데 사용된다.

    • +short
      간략한 형태로 결과를 출력한다. 해당 옵션을 사용하면 기본적으로 IP 주소만 출력된다.

    • $APIDNS
      APIDNS 환경 변수에 저장된 Kubernetes API 서버의 도메인 이름이다.


  • kubectl node-shell $NN1
    ubernetes 노드에 kubectl을 통해 직접 셸(bash) 접근을 제공한다. 이를 통해 노드에서 직접 명령을 실행하고 시스템 상태를 점검할 수 있다.

    • kubectl
      Kubernetes 클러스터와 상호작용하기 위한 명령줄 도구이다.

    • node-shell
      Kubernetes 노드에 대한 인터랙티브 셸을 연다. 이 셸을 통해 해당 노드의 환경에 직접 접근하여 진단, 문제 해결 및 관리 작업을 수행할 수 있다.

    • $NN1
      접근하려는 노드의 이름이다. $NN1 변수는 노드의 이름을 저장하고 있다.

EKS 보안 그룹 확인

# 보안 그룹 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
  • aws ec2 describe-security-groups --query 'SecurityGroups[*].[GroupId, GroupName]' --output text | grep myeks
    이 명령어는 보안 그룹의 ID와 이름을 텍스트 형식으로 출력하며, 그 중 myeks라는 문자열을 포함하는 보안 그룹만을 표시한다.

    • aws ec2 describe-security-groups
      AWS CLI 명령어로, 현재 계정에서 사용 가능한 모든 보안 그룹의 정보를 조회한다.


    • --query 'SecurityGroups[*].[GroupId, GroupName]'
      JMESPath 구문을 사용하여 출력 결과를 필터링한다.

      JMESPath는 JSON 데이터에서 원하는 정보를 필터링하거나 선택하는 데 사용되는 쿼리 언어이다. JMESPath는 AWS CLI와 같은 도구에서 JSON 응답을 처리할 때 매우 유용하다. 이를 사용하여 복잡한 JSON 구조에서 특정 데이터를 추출할 수 있다.

    • SecurityGroups[*].[GroupId, GroupName]
      모든 보안 그룹의 ID(GroupId)와 이름(GroupName)을 리스트 형식으로 추출한다.


    • --output text
      결과를 텍스트 형식으로 출력한다. 기본적으로 열 구분자로 탭이 사용된다.


    • | grep myeks
      grep 명령어를 사용하여 출력된 보안 그룹 중 myeks라는 문자열을 포함하는 항목만 필터링한다.
      이는 myeks라는 이름이나 ID를 포함한 보안 그룹을 찾는 데 유용하다.


  • aws ec2 describe-security-groups --group-ids --output yaml sg-XXXXXXXXXXX | yh
    지정된 보안 그룹 ID(sg-XXXXXXXXXXX)에 대한 상세 정보를 YAML 형식으로 출력한다. 이 정보에는 인바운드 규칙, 아웃바운드 규칙, VPC ID, 설명 등이 포함된다. yh 명령어를 사용하면 출력된 YAML 데이터를 더 깔끔하고 가독성 있게 볼 수 있다.

    • aws ec2 describe-security-groups --group-ids sg-XXXXXXXXXXX
      특정 보안 그룹의 상세 정보를 조회한다.

    • --group-ids sg-XXXXXXXXXXX
      조회할 보안 그룹의 ID를 지정한다. 예: sg-XXXXXXXXXXX.

    • --output yaml
      출력 형식을 YAML로 지정한다. YAML 형식은 사람이 읽기 쉽게 구조화된 데이터 표현을 제공한다.

    • | yh
      yh는 YAML 출력을 깔끔하게 표시하는 명령어다. 이는 설치된 yh 유틸리티를 사용하여 출력된 YAML을 보기 좋게 색상 구분을 하여 표시한다.


eksctl에서 Amazon EKS 보안그룹 구성

출처: 인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟

  • 워커 노드는 myeks-VPC의 ENI와 연결되어 VPC 내부의 통신이나 외부 인터넷 구간 통신이 가능하다.

  • 워커 노드는 컨트롤 플레인의 API 서버와 연결된 EKS owned ENI와도 연결된다.

  • EKS 관리용 인스턴스인 myeks-host도 myeks-VPC의 ENI와 연결되어 통신을 수행한다.

    ENI는 EC2 인스턴스의 네트워크 인터페이스로, 서브넷에 속해 있으며 서브넷의 IP 주소 범위 내에서 IP 주소를 할당받는다. ENI는 EC2 인스턴스가 네트워크에 연결될 수 있도록 하는 가상 네트워크 인터페이스로, IP 주소, 보안 그룹 등을 포함한다.

  • Cluster SG 보안 그룹
    컨트롤 플레인과 워커 노드 간 통신을 할 때 사용하는 보안 정책이다. 각 워커 노드의 ENI와 EKS owned ENI 모두에 해당 보안 그룹이 적용되어 있다.

  • Control Plane SG 보안 그룹
    EKS owned ENI로 컨트롤 플레인과 통신 할 때 사용하는 보안 정책이다.

  • Cluster Shared Node SG 보안 그룹
    노드 간의 통신을 할 때 사용하는 보안 정책이다.

  • Node Remote Access SG
    워커 노드로 SSH 접근을 할 때 사용하는 보안 정책이다.

  • myeks-host Remote Access SG
    myeks-host에 접근을 위한 보안 정책도 존재한다.


파드 배포

# 새로운 터미널에서 파드와 서비스 모니터링
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 }'
  • watch -d 'kubectl get pod,svc'
    주기적으로 파드와 서비스의 상태를 확인하면서, 변화가 발생하는 즉시 이를 모니터링할 수 있도록 한다. 새로운 파드가 생성되거나 서비스의 상태가 변경될 때마다 업데이트된 정보를 즉시 확인할 수 있다.

    • watch -d
      주어진 명령어를 주기적으로 실행하여 출력 결과를 모니터링한다. -d 옵션은 변경된 부분을 강조하여 표시한다.

    • kubectl get pod,svc
      클러스터에서 실행 중인 파드(pods)와 서비스(services)의 상태를 조회한다.


  • curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml
    슈퍼마리오 애플리케이션을 배포하기 위한 Kubernetes YAML 파일을 다운로드하고, 이를 확인한다.

    • curl -s -O
      주어진 URL에서 파일을 다운로드하여 현재 디렉토리에 저장한다. -O 옵션은 원본 파일 이름을 유지한다.

    • https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/mario.yaml
      슈퍼마리오 애플리케이션의 Kubernetes 디플로이먼트 파일이 위치한 URL이다.

    • cat mario.yaml
      다운로드한 mario.yaml 파일의 내용을 출력한다.

    • | yh
      출력된 YAML 파일을 더 깔끔하게 보기 위해 yh 유틸리티를 사용한다. 이는 YAML 데이터를 색상으로 구분하여 가독성을 높인다.


  • kubectl apply -f mario.yaml
    다운로드한 mario.yaml 파일을 사용하여 Kubernetes 클러스터에 슈퍼마리오 애플리케이션을 배포한다.

    • apply
      정의된 리소스(파드, 서비스 등)를 클러스터에 적용한다.

    • -f
      Kubernetes 클러스터에서 실행할 리소스(예: 파드, 디플로이먼트, 서비스 등)의 설정을 담고 있는 YAML 또는 JSON 파일을 읽어들여, 그 내용에 따라 실제로 Kubernetes 클러스터에 해당 리소스들을 생성하거나 업데이트한다.


  • kubectl get deploy,svc,ep mario
    mario라는 이름의 디플로이먼트(deployment), 서비스(service), 엔드포인트(endpoint) 정보를 조회하여 상태를 확인한다.

    • deploy
      슈퍼마리오 애플리케이션의 디플로이먼트 상태를 확인한다.

    • svc
      슈퍼마리오 애플리케이션의 서비스 상태를 확인한다.

    • ep
      서비스가 연결된 파드의 엔드포인트 상태를 확인한다.


  • kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "Mario URL = http://"$1 }'
    슈퍼마리오 애플리케이션이 로드 밸런서를 통해 접근 가능한 URL을 출력한다. 이를 통해 사용자는 웹 브라우저에서 슈퍼마리오 애플리케이션을 직접 접근할 수 있는 주소를 얻을 수 있다.

    JSONPath는 JSON 데이터 구조에서 특정 데이터를 선택하고 추출하기 위해 사용하는 쿼리 언어이다. JSONPath는 JSON 문서 내의 특정 부분을 탐색하고 필터링할 수 있도록 도와주고,이를 통해 JSON 객체나 배열에서 원하는 데이터를 효율적으로 추출할 수 있다.

    • kubectl get svc mario -o jsonpath={.status.loadBalancer.ingress[0].hostname}:

      • svc mario: mario라는 이름의 서비스를 조회한다.

      • -o jsonpath={.status.loadBalancer.ingress[0].hostname}
        JSON 경로를 사용하여 서비스의 로드 밸런서 주소(호스트 이름)를 추출한다.

        • .status
          JSON 출력에서 status 필드를 선택한다. status는 리소스의 현재 상태 정보를 담고 있다.

        • .loadBalancer
          status 필드 안의 loadBalancer 필드를 선택한다. 이 필드는 로드 밸런서 관련 정보를 포함하고 있다.

        • .ingress
          loadBalancer 필드 안의 ingress 필드를 선택한다. ingress는 로드 밸런서의 진입점 목록을 나타내는 배열이다. 이 배열에는 로드 밸런서의 IP 주소나 호스트 이름이 포함된다.

        • [0]
          ingress 배열의 첫 번째 요소를 선택한다. 이 배열은 여러 진입점을 가질 수 있지만, 일반적으로 클라이언트가 서비스에 접근하기 위해서는 첫 번째 진입점이 필요하다.

        • .hostname
          ingress[0] 요소의 hostname 필드를 선택한다. 해당 필드는 로드 밸런서의 DNS 호스트 이름을 나타낸다.

    • | awk '{ print "Mario URL = http://"$1 }'

      • awk
        추출된 호스트 이름 앞에 "Mario URL = http://"을 추가하여 완전한 URL 형식으로 출력한다.

생성한 파드 삭제

kubectl delete -f mario.yaml
  • delete
    kubectl 명령어 중 하나로, 지정된 리소스 또는 리소스 그룹을 삭제하는 명령어다.
    해당 명령어는 클러스터에서 리소스를 제거한다. 리소스가 삭제되면 해당 리소스와 관련된 모든 파드, 서비스, 디플로이먼트 등이 삭제된다.

  • -f mario.yaml

    • -f
      file의 약자로, 파일 경로를 지정하는 옵션이다.

    • mario.yaml
      삭제할 리소스들이 정의된 YAML 파일이다. 해당 파일에는 리소스의 종류(예: 디플로이먼트, 서비스), 이름, 설정 등이 포함되어 있다.

kubectl delete -f mario.yaml 명령어가 실행되면, Kubernetes는 이 YAML 파일을 읽고, 해당 파일에 정의된 모든 리소스를 클러스터에서 삭제한다. 여기에는 디플로이먼트, 서비스, 파드, 컨피그맵, 시크릿 등 다양한 리소스가 포함될 수 있다.


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

# 새로운 터미널에서 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
  • 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

    • while true; do ... done
      무한 루프를 실행하여 주기적으로 특정 작업을 수행한다. true 조건이 항상 참이므로, 루프는 무한정 반복한다.

    • aws ec2 describe-instances
      AWS CLI 명령어로, 현재 계정의 EC2 인스턴스에 대한 정보를 조회합니다.

    • --query
      describe-instances 명령어의 출력 결과를 필터링하여, 원하는 필드만 선택하는 데 사용된다.

      • Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}
        각 인스턴스의 퍼블릭 IP, 프라이빗 IP, 인스턴스 이름, 상태 정보를 출력한다.
    • --filters Name=instance-state-name,Values=running
      현재 실행 중인(running) 인스턴스만 필터링하여 출력한다.

    • --output text
      출력 결과를 텍스트 형식으로 표시한다.

    • echo "------------------------------"
      각 반복이 끝날 때마다 출력되어, 이전 명령어 출력과 다음 명령어 출력 사이에 구분선을 삽입한다.

    • sleep 1
      각 루프 사이에 1초 대기한다.


  • eksctl get nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup
    EKS 클러스터 내의 특정 노드 그룹에 대한 정보를 조회합니다. 노드 그룹의 상태, 크기, 구성 등의 정보를 확인할 수 있다.

    • get nodegroup
      지정된 클러스터에서 노드 그룹 정보를 가져온다.

    • --cluster $CLUSTER_NAME
      CLUSTER_NAME 변수에 저장된 클러스터 이름을 지정하여, 해당 클러스터의 정보를 조회한다.

    • --name $CLUSTER_NAME-nodegroup
      특정 노드 그룹의 이름을 지정한다.


  • eksctl scale nodegroup --cluster $CLUSTER_NAME --name $CLUSTER_NAME-nodegroup --nodes 3 --nodes-min 3 --nodes-max 6

    • scale nodegroup
      EKS 클러스터의 노드 그룹 크기를 조정하는 명령어다.

    • --cluster $CLUSTER_NAME
      조정할 노드 그룹이 속한 클러스터 이름을 지정한다.

    • --name $CLUSTER_NAME-nodegroup
      크기를 조정할 노드 그룹의 이름을 지정한다.

    • --nodes 3
      노드 그룹의 현재 노드 수를 3개로 조정한다.

    • --nodes-min 3
      노드 그룹의 최소 노드 수를 3개로 설정한다.

    • --nodes-max 6
      노드 그룹의 최대 노드 수를 6개로 설정한다.


실습 환경 삭제

# eksctl 도구로 Amazon EKS 클러스터 삭제
eksctl delete cluster --name $CLUSTER_NAME
  • delete cluster
    클러스터를 삭제하는 명령이다.

  • --name $CLUSTER_NAME
    삭제하려는 클러스터의 이름을 지정한다.


// awscli 도구로 기본 인프라 삭제
aws cloudformation delete-stack --stack-name $CLUSTER_NAME
  • delete-stack
    특정 스택을 삭제하는 명령이다.
  • --stack-name $CLUSTER_NAME
    삭제하려는 스택의 이름을 지정한다.



해당 글은 다음 강의의 내용을 참고한 글임을 밝힙니다. 자세한 내용은 다음 강의에서 확인해볼 수 있습니다.
인프런, Ongja_CloudNet@, ⌜CloudNet@와 함께하는 Amazon EKS 기본 강의⌟
profile
IT, 개발 관련 정보들을 기록하는 장소입니다.
post-custom-banner

0개의 댓글