AWS CLI 구성

호스트네임 : aws-cli

아이피 : 211.183.3.99/24

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
apt-get -y install unzip
unzip awscliv2.zip
./aws/install

  • <본인 iam사용자 로그인링크> + ?region=ap-northeast-2

# aws8-iam 바로가시 설정

  • 액세스키-시크릿키-리전을 메모장에 저장하고 아래대로 3가지 입력
aws configure

  • 위 aws 계정정보가 들어있는 파일
root@aws-cli:~# cat ~/.aws/credentials

eksctl

EKS 클러스터 구축, 관리에 필요한 명령어(kubeadm과 비슷한 느낌)

  • eksctl 명령어를 /tmp에 다운로드
curl --silent --location \
"https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname
 -s)_amd64.tar.gz" | tar xz -C /tmp

kubectl 설치

  • kubectl 명령어 설치파일 다운로드
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.32.0/2024-12-20/bin/linux/amd64/kubectl
  • 소유권 바꿔서 설치
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version --client


클러스터 구축

EKS의 특징

컨트롤플레인(master)과 노드그룹(worker)들로 구성

  1. 컨트롤플레인은 aws에서 제공. 가격이 상대적으로 높다.
  2. 노드그룹 - 관리형노드그룹(Managed Node Group)
    쿠버네티스 버전을 자동으로 업그레이드. failover도 해주는 대신, 가격이 조금 비싸다.

클러스터 생성 순서

  1. 클러스터 생성(eksctl create cluster...) = 컨트롤 플레인 구성
    그냥 eksctl을 통해 생성하면, cloudformation에서 스크립트를 통해 클러스터를 생성해준다.
    - cloudformation(aws가 제공하는 IaC) : 우리가 생성해야하는 인프라 및 설정들을 자기들이 이미 구성해놓고 스크립트를 통해 생성해준다. 클러스터를 생성하다가 실패시(서브넷관련) - cloudformation에 가서 스크립트를 지워주는게 좋다.
    만약에 내가 나중에 terraform으로 eks클러스터를 구성한다면 당연히 cloudformation은 따로 생성되지 않을거다.
  2. 노드그룹을 만들어서 (워커)노드들을 노드그룹에 포함시킨다음, 노드그룹과 컨트롤플레인이 통신이 되는지를 확인후에 클러스터가 활성화

 


♨ 주의) 클러스터를 생성했는데, 잘 안되는 경우

→ 10분이 경과해도 클러스터가 생성이 안되면, 대부분 워커노드와 컨트롤플레인의 통신 문제일 확률이 큼

워커노드에서 컨트롤플레인으로 아웃바운드 트래픽이 발생을 해야 클러스터가 정상적으로 구성이 된다.

  • eks 설치 및 사용시 필요한 도구
    • aws cli : 내 EKS 클러스터를 특정하기 위해 필요. 특히, kubeconfig를 가져올때도 필요하다.
    • eksctl : 클러스터 생성 및 삭제,관리에 필요한 도구
    • kubectl
  • 인스턴스 유형에 따른 파드 제한 확인 하는 방법

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/choosing-instance-type.html#determine-max-pods


Well-Architected의 비용 최적화

추가적으로, aws에서 내가 어떤 서비스를 쓴다고하면, 그 비용이 어느 정도 발생하고 어떻게 쓰는게 효율적인지를 고려하여 설계해야한다. 프로젝트 하실때도 꼭 well-architected 신경쓰세요!


VPC 생성

IGW 생성

VPC 연결

  • 가용영역 a
eks-vpc-pub-sub1 10.10.1.0/24
eks-vpc-pri-sub1 10.10.2.0/24
eks-vpc-db-sub1 10.10.3.0/24
  • 가용영역 c
eks-vpc-pub-sub2 10.10.11.0/24
eks-vpc-pri-sub2 10.10.12.0/24
eks-vpc-db-sub2 10.10.13.0/24

 

  • 서브넷 설정 편집

  • 퍼블릭 서브넷

  • 프라이빗 서브넷

  • 라우팅 테이블


퍼블릭서브넷에 EKS 클러스터를 구축

더보기

echo 'complete -C "$(which aws_completer)" aws' >> ~/.bashrc

eksctl completion bash | sudo tee /etc/bash_completion.d/eksctl > /dev/null

  • eksctl create cluster --vpc-public-subnets <퍼블릭서브넛1>,<퍼블릭서브넛2> --name <클러스터이름> --region <리전명> --version <쿠버네티스버전> --nodegroup-name 노드그룹이름 --node-type <인스턴스유형> --nodes <원하는노드갯수> --nodes-min <최소노드수> --nodes-max <최대노드수>
eksctl create cluster --vpc-public-subnets  <퍼블릭서브넛1>,<퍼블릭서브넛2> --name myc --region ap-northeast-2 --version 1.32 --nodegroup-name mycng --node-type t3.small --nodes 1 --nodes-min 1 --nodes-max 3

  • eks에서 클러스터 생성됐는지 확인

  • 혹시 잘못 생성한 경우, 아래대로 삭제
eksctl delete cluster <클러스터명>
  • cloudFormation에서 클러스터 생성 내용 확인

  • 잠시후에 EC2에 워커노드가 추가된걸 확인 가능

  • ~/.kube/config에 kubeconfig파일을 가져오는 명령어(aws-cli가 잘 구성되어있어야 가능)
aws eks update-kubeconfig --region ap-northeast-2 --name <클러스터이름>
  • 설치한 곳에서 자동으로 구성해주지만 매번 해주는것도 좋음
aws eks update-kubeconfig --region ap-northeast-2 --name myc
ls ~/.kube/config

# 클러스터를 설치한 곳에서는 자동으로 가져옴.

root@aws-cli:~# vi ~/.kube/config
  • 생성된 클러스터의 API 서버 엔드포인트로 수정

  • kubeconfig를 업뎃 후에 다시 API 요청이 잘 가는걸 확인 가능


실습)

kubectl create deploy (deployment 생성), kubectl expose (svc 생성) 명령만 사용하여 oolralra/ipnginx 를 NodePort로 배포하고 접속이 잘 되는걸 확인해보세요. curl이나 브라우저로 확인.

  • deployment 생성
kubectl create deployment test --image=oolralra/ipnginx --replicas=1

 

  • svc 생성
kubectl expose deploy test --port 80 --target-port 80 --type=NodePort

 

# 노드포트로 접근하고 싶은데, 컨트롤플레인의 노드주소나 접근방법은 모른다.
왜냐하면 aws가 관리해주는(managed) 것이기 때문 → 워커노드들(nodegroup의 ec2)의 포트로 접근하면 될 것같다.

  • 퍼블릭 아이피 + kubectl get svc로 조회한 포트로 접근

#  보안그룹 때문에  접속이 안되는듯

  • 보안그룹 인바운드 규칙 수정

# 보안그룹 수정 후 잘되는것 확인


실습)

kubectl edit svc <서비스이름> 으로 해당 서비스의 타입을 수정이 가능하다. 노드포트로 되어있는 svc type을 LoadBalancer로 수정후 로드밸런서가 잘 띄워지는지, 접속은 잘 되는지 확인해보세요.
안된다면 왜 안되는지도 describe를 통해 문제점을 찾아보세요.
patch 도 한번 써보세여.

kubectl edit svc test

  • 바로 curl을찍으면 잘 되는걸 확인 가능

  • 클래식 = 우리가 쓰던 NLB나 ALB와는 다른, 구시대적인 방식

# 보안그룹만 어떻게 구성됐는지 확인, 어차피 안쓰는 LB타입
# 알아서 구성을 해줬지만 항상 확인!

root@aws-cli:~# kubectl delete svc test

# 마찬가지로 실제로 aws의 리소스가 지워졌는지 확인


NLB 생성

기존의 deploy에 NLB를 연결시켜보자. 온프레미스 클러스터에서는 MetalLB를 설치해야 LB가 생성가능했지만, aws 같은 클라우드 경우, 이미 클라우드공급자가 기능을 구현해놨다.

  • svc에서 label 명시하기위해 labels확인
kubectl describe pod test | grep -i label

# app:test

  • NLB타입의 svc
vi svc-test.yml
apiVersion: v1
kind: Service
metadata:
  name: svc-test
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  selector:
    app: test
  ports:
  - port: 80
    targetPort: 80

# annotations를 통해 추가적인 기능이나 설정을 추가, 부여가능

# nlb를 명시안하면 클래식으로 생성된다.

kubectl apply -f svc-test.yml

  • 클러스터 삭제전에는 꼭 aws의 리소스를 생성하는 svc 같은거 지우기
kubectl delete svc svc-test
eksctl delete cluster myc

과제)

이번에는 private 서브넷에 pric라는 eks 클러스터를 구성해서, oolralra/ipnginx를 NLB로 배포해서 접속이 되도록 만들어보세요. VPC는 절대지우지 마시고 재활용하세요! 클러스터를 생성할때 추가옵션(--node-private-networking)이 필요합니다.

  • NAT GW 생성

  • EKS Cluster 생성
eksctl create cluster --vpc-private-subnets subnet-0d87648d62113880c,subnet-0179704bb2d582784 --name pric --region ap-northeast-2 --version 1.32 --nodegroup-name mycng --node-type t3.small --nodes 1 --nodes-min 1 --nodes-max 3 --node-private-networking
kubectl create deployment pric --image=oolralra/ipnginx --replicas=1
kubectl expose deploy pric --port 80 --target-port 80 --type=LoadBalancer

  • svc에서 label 명시하기위해 labels확인
kubectl describe pod pric | grep -i label

  • NLB타입의 svc
vi svc-test.yml
apiVersion: v1
kind: Service
metadata:
  name: svc-pric
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  selector:
    app: pric
  ports:
  - port: 80
    targetPort: 80

 

kubectl apply -f svc-test.yml

  • 클러스터 삭제전에는 꼭 aws의 리소스를 생성하는 svc 같은거 지우기
kubectl delete svc svc-pric
eksctl delete cluster pric

풀이)

# 프라이빗서브넷에 노드그룹(워커노드들)을 구성하려면, 워커노드들이 공인대역에 있는 컨트롤플레인과 아웃바운드로 통신이 가능해야하기때문에 natgw가 필요하다.

프라이빗 클러스터 생성하는 명령

export SUBNET1_ID=<본인 프라이빗서브넷1>
export SUBNET2_ID=<본인 프라이빗서브넷2>
eksctl create cluster --name pric --node-private-networking --region ap-northeast-2 --version 1.32 --nodegroup-name pring --node-type t3.small --nodes 1 --nodes-min 1 --nodes-max 3 --vpc-private-subnets $SUBNET1_ID,$SUBNET2_ID

# 내가 만약 프라이빗서브넷에 존재하는 워커노드에 접근해야하는경우가 있다면(노드포트로 테스트를 해보고 싶은경우) bastion을 통해 워커노드와 통신할 수 있는 상황을 만들어야 한다.

 

kubectl create deploy test --image=oolralra/ipnginx --replicas=1

# deployment 생성. 워커노드에 natgw가 붙어있기때문에 도커허브에서 이미지풀링이 가능할것이다.

 

kubectl expose deploy test --type LoadBalancer --port 80 --target-port=80

# 로드밸런서타입으로 서비스 생성

 

curl a4da46ece459b41c99ffa6a08fc81d37-1659867644.ap-northeast-2.elb.amazonaws.com