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
- 액세스키-시크릿키-리전을 메모장에 저장하고 아래대로 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)들로 구성
- 컨트롤플레인은 aws에서 제공. 가격이 상대적으로 높다.
- 노드그룹 - 관리형노드그룹(Managed Node Group)
쿠버네티스 버전을 자동으로 업그레이드. failover도 해주는 대신, 가격이 조금 비싸다.
클러스터 생성 순서
- 클러스터 생성(eksctl create cluster...) = 컨트롤 플레인 구성
그냥 eksctl을 통해 생성하면, cloudformation에서 스크립트를 통해 클러스터를 생성해준다.
- cloudformation(aws가 제공하는 IaC) : 우리가 생성해야하는 인프라 및 설정들을 자기들이 이미 구성해놓고 스크립트를 통해 생성해준다. 클러스터를 생성하다가 실패시(서브넷관련) - cloudformation에 가서 스크립트를 지워주는게 좋다.
만약에 내가 나중에 terraform으로 eks클러스터를 구성한다면 당연히 cloudformation은 따로 생성되지 않을거다. - 노드그룹을 만들어서 (워커)노드들을 노드그룹에 포함시킨다음, 노드그룹과 컨트롤플레인이 통신이 되는지를 확인후에 클러스터가 활성화
♨ 주의) 클러스터를 생성했는데, 잘 안되는 경우
→ 10분이 경과해도 클러스터가 생성이 안되면, 대부분 워커노드와 컨트롤플레인의 통신 문제일 확률이 큼
워커노드에서 컨트롤플레인으로 아웃바운드 트래픽이 발생을 해야 클러스터가 정상적으로 구성이 된다.
- eks 설치 및 사용시 필요한 도구
- aws cli : 내 EKS 클러스터를 특정하기 위해 필요. 특히, kubeconfig를 가져올때도 필요하다.
- eksctl : 클러스터 생성 및 삭제,관리에 필요한 도구
- kubectl
- 인스턴스 유형에 따른 파드 제한 확인 하는 방법
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와는 다른, 구시대적인 방식
root@aws-cli:~# kubectl delete svc test
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
'AWS Cloud School 8기 > AWS' 카테고리의 다른 글
86일차) 2025-05-01(EKS 클러스터, ALB) (1) | 2025.05.01 |
---|---|
67일차) 2025-04-04(ECR, ECS, Github, CICD-codebuild) (0) | 2025.04.04 |
66일차) 2025-04-03(ECR, ECS) (0) | 2025.04.03 |
38일차) 2025-02-21(Route53, S3-bucket, ACM, CloudFront) (1) | 2025.02.21 |
37일차) 2025-02-20(Auto-scaling, CloudWatch, 시작 템플릿) (0) | 2025.02.20 |