[2023-06-12 월] EKS
1. IAM 사용자 생성
IAM 사용자 생성
생성한 사용자 MFA 설정하기
사용자로 접속해보기
IAM 사용자 URL 복사
시크릿창을 열고 URL에 붙여넣기
리포지토리로 사용할 가상머신 켜고 MobaXterm 접속
# curl http://192.168.1.157:5000/v2/_catalog # 현재 리포지토리에 있는 이미지 정보
# curl http://192.168.1.157:5000/v2/web-site/tags/list # web-site 이름이 web-site 이고 태그가 달린 이미지 정보
# vi /etc/docker/daemon.json # 인증정보 있는지 확인. 안되어있다면 입력 후 systemctl restart docker
{ "insecure-registries":["192.168.1.157:5000"] }
# docker pull 192.168.1.157:5000/web-site:aws # 사설리포지토리에서 이미지 가져오기
# docker pull 192.168.1.157:5000/web-site:food
2. AWS ECR
AWS ECR
자격증명
# aws configure
ap-northeast-2
json
# aws s3 ls
가상머신에 AWS CLI 설치
# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# unzip awscliv2.zip
# ./aws/install
# aws --version
ECR에 로그인
# aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/f5s7z9x9
# docker tag 192.168.1.157:5000/web-site:aws public.ecr.aws/f5s7z9x9/web-site:aws # 태그 달기
# docker tag 192.168.1.157:5000/web-site:food public.ecr.aws/f5s7z9x9/web-site:food
# docker push public.ecr.aws/f5s7z9x9/web-site:aws
# docker push public.ecr.aws/f5s7z9x9/web-site:food
이미지가 잘 push됨
# docker rmi public.ecr.aws/f5s7z9x9/web-site:food # 이미지 삭제하기
# docker rmi public.ecr.aws/f5s7z9x9/web-site:aws
# docker run -d -p 8081:80 --name aws-web public.ecr.aws/f5s7z9x9/web-site:aws # 컨테이너 생성+실행
# docker run -d -p 8082:80 --name food-web public.ecr.aws/f5s7z9x9/web-site:food
접속테스트
test-home 리포지토리 생성
# docker tag 192.168.1.157:5000/test-home:v0.0 public.ecr.aws/f5s7z9x9/test-home:v0.0
# docker tag 192.168.1.157:5000/test-home:v1.0 public.ecr.aws/f5s7z9x9/test-home:v1.0
# docker tag 192.168.1.157:5000/test-home:v2.0 public.ecr.aws/f5s7z9x9/test-home:v2.0
# docker push public.ecr.aws/f5s7z9x9/test-home:v0.0
# docker push public.ecr.aws/f5s7z9x9/test-home:v1.0
# docker push public.ecr.aws/f5s7z9x9/test-home:v2.0
3. AWS EKS의 권한 생성
ECS는 역할 설정하지 않아도 자동으로 만들어줬지만 EKS는 수동으로 역할을 만들어줘야한다
어떤 서비스가 역할을 사용할 것인지 선택하는 단계
서브넷 subnet # 워커노드를 어디에 생성시킬 지 선택
4. EKS 생성 및 세팅
CoreDNS
EKS Kubernetes 클러스터 내에서 DNS 서비스를 제공한다.
DNS를 사용하면 개별 컨테이너가 클러스터 내의 다른 컨테이너를 쉽게 검색하고 연결할 수 있다.
kube-proxy
Kubernetes 클러스터의 각 노드에서 실행되는 네트워크 프록시
kube-proxy 역할은 클러스터에 정의된 서비스를 반영하고 노드에서 네트워킹 규칙을 관리하여 서비스를 지원하는 포드와의 통신을 허용한다
Amazon VPC CNI (flannel 역할)
Amazon EKS Kubernetes용 Amazon VPC CNI(Container Network Interface) 플러그인을 사용하여 네이티브 VPC 네트워킹을 지원한다.
이 플러그인을 사용하면 Kubernetes 포드가 VPC 네트워크에서와 동일한 IP 주소를 포드 내에서 가질 수 있습니다.
Docker 서버 세션에서 eks cli 실행
# aws eks --region ap-northeast-2 update-kubeconfig --name EKS-CLUSTER # kubectl server에 대한 자격증명
# curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.26.4/2023-05-11/bin/linux/amd64/kubectl # kubectl 설치
# chmod +x ./kubectl
# sudo mv ./kubectl /usr/local/bin # 어느 경로에서든지 kubectl 명령을 실행할 수 있게 하는 명령
# yum install -y bash-completion
# source <(kubectl completion bash) # 자동완성을 위한 소스
# echo "source <(kubectl completion bash)" >> ~/.bashrc
# kubectl version --short --client
# kubectl get svc
5. EKS 워커노드 생성
IAM 역할 생성
워커 노드들은 EC2
역할에 정책 연결하기
AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy
노드 그룹 생성
생성된 워커노드 이름 입력
도커서버 세션에서
# kubectl get no
# kubectl get pod --all-namespaces
6. EKS 워커노드 LoadBalancer로 접속, Pod 개수 제한
# mkdir test && cd $_
# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-site-deployment
spec:
replicas: 4
selector:
matchLabels:
app: web-site-deployment
template:
metadata:
name: web-site-deployment
labels:
app: web-site-deployment
spec:
containers:
- name: web-site-deployment-container
image: public.ecr.aws/f5s7z9x9/web-site:aws # ECR에 있는 이미지
# kubectl apply -f deployment.yaml
# kubectl get all
# vi loadbalancer-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-deployment
spec:
type: LoadBalancer
selector:
app: web-site-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
# kubectl apply -f loadbalancer-deployment.yaml
# kubectl get svc
접속테스트
Route53 레코드 생성하기
도메인 명으로 접속테스트
ScaleOut 하기
# kubectl edit deployments.apps web-site-deployment # replicas: 12으로 변경
# kubectl get po -o wide # 2개의 pod가 Pending되었다
# kubectl describe po web-site-deployment-7b85c97579-p4v92 # Pod가 너무 많아서 용량이 부족함
VirtualBox는 다 만들어졌는데 EKS 워커노드는 못 만든 이유
# kubectl describe po web-site-deployment-7b85c97579-p4v92 # 노드를 지키기위해 aws 자체적으로 생성 파드 개수를 제한한다
다른 노드는 system-pod가 2개지만 하나의 노드가 system-pod로 4개가 다 차있기 때문에 12개를 생성하지 못하고 10개만 생성된다
# kubectl scale deployment web-site-deployment --replicas 6 # ScaleIn 하기
# kubectl get po -o wide # Pending인 pod가 사라졌다
7. EKS 보안그룹, 워커노드 NodePort로 접속
# cp deployment.yaml deployment2.yaml
# vi deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-site-deployment2
spec:
replicas: 4
selector:
matchLabels:
app: web-site-deployment2
template:
metadata:
name: web-site-deployment2
labels:
app: web-site-deployment2
spec:
containers:
- name: web-site-deployment-container2
image: public.ecr.aws/f5s7z9x9/web-site:food
# kubectl apply -f deployment2.yaml # aws 웹페이지 6개 food 웹페이지 4개가 생성된다
# cp loadbalancer-deployment.yaml nodeport-deployment.yaml
# vi nodeport-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-deployment
spec:
type: NodePort
selector:
app: web-site-deployment2
ports:
- protocol: TCP
port: 80
targetPort: 80
# kubectl apply -f nodeport-deployment.yaml
# kubectl get svc # 노드포트 번호를 30347을 부여받았다
# kubectl get po -o wide # pod가 생성된 노드 이름 확인
# kubectl get no -o wide # 노드 이름
# curl 10.40.13.151 # 안됨. 도커 서버가 클러스터 안에 있지 않기 때문
# curl 13.125.163.172:30347 # 안됨. 보안 그룹 때문
현재 워커 노드에는 보안 그룹이 2개 있다
sg-0f2880c89595fddfd (eks-cluster-sg-EKS-CLUSTER-1723060346) 는 클러스터 안에서 클러스터끼리 통신하도록 하는 방화벽
sg-0e45b84a089baea4b (eks-remoteAccess-f0c4570f-2ae4-e260-74b2-ffdf06d6eb9e)는 외부에서 클러스터에 접속하는 방화벽
외부에서 클러스터에 접속하는 방화벽에서 생성된 노드포트 서비스의 포트 번호를 열어준다
접속테스트
8. EKS 워커노드 ClusterIP로 접속
# cp nodeport-deployment.yaml clusterip-deployment.yaml
# vi clusterip-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-deployment
spec:
type: ClusterIP
externalIPs:
- 10.40.13.151 # 위에서 노드 포트로 접속했던 워커노드의 external-IP와 매핑되어있는 Internal-lIP
selector:
app: web-site-deployment2
ports:
- protocol: TCP
port: 80
targetPort: 80
# kubectl apply -f clusterip-deployment.yaml
# kubectl get svc
# kubectl get no -o wide # svc와 매핑되는 EXTERNAL-IP로 접속테스트
접속테스트 # 안됨. 80포트를 열지 않았기 때문
eks-remoteAccess 방화벽에서 80포트를 열어준다
접속테스트
보안 그룹 규칙 설명
CLB에서 들어오는 트래픽만 허용하겠다는 규칙을 EKS가 생성해줬다
자기 자신의 보안그룹을 소스로 설정해놓으면 같은 보안 그룹 내에 있는 인스턴스끼리는 모든 포트의 통신이 가능하다
원래는 같은 보안 그룹에 있다고 해서 통신이 되는 것이 아니라 포트번호를 열어줘야한다
자원 정리하기
# kubectl delete all --all
노드 그룹 지우기
EKS 삭제