AWS 인프라 구축 실습 15회 - EKS
AWS 인프라 구축 실습 15회 - EKS
이번 시간에는 EKS(Elastic Kubernetes Service)를 실습해 보도록하겠습니다.
여기에서 사용하는 EC2는 ECS(Elastic Container Service) 회차에서 이용한 것으로, 이전 시간에 작성한 실습 결과를 사용하겠습니다.
AWS EKS와 같은 컨테이너 오케스트레이션 서비스는 일명 "무중단 서비스", "무중단 배포"를 위한 최고의 서비스입니다.
AWS EKS와 같은 서비스는 Docker Swarm, AWS ECS, Kubernetes k8s가 있습니다. 운영하는 규모에 따라 선택해서 적용을 하면 됩니다. Docker Swarm의 경우는 소규모 클라우드 인프라환경에서 사용하는게 일반적입니다.
EKS와 같은 서비스는 컨테이너 오케스트레이션(Container Orchestration)이라고 하는 서비스입니다. 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화하는 서비스입니다.
Amazon EKS는 자체 Kubernetes 제어 플레인을 설치 및 운영할 필요 없이 AWS에서 Kubernetes를 쉽게 사용할 수 있도록 해주는 관리형 서비스입니다.
Amazon EKS는 Kubernetes API 엔드포인트를 표시합니다. 기존 Kubernetes 도구는 EKS 관리형 제어 플레인에 직접 연결할 수 있습니다. 작업자 노드는 사용자 계정에서 EC2 인스턴스로 실행됩니다.
사전작업
1. ECR : sbrich
2. Route53 : sbrich.shop / docker.sbrich.shop / eks.sbrich.shop
3. (자동생성) 대상그룹 : 'TG-ALB', instance type, HTTP, 80port
4. 보안그룹 : sg-Docker
실습과정
1. 역할 만들기
- 클러스터, 노드그룹
2. 클러스터 생성
3. 노드그룹 생성
4. kubectl 설치
5. 애플리케이션 배포
6. 로드밸런서 적용
7. Route53 설정
8. EKS 클러스터 확인
1. 역할 생성
클러스터, 노드그룹에 대한 역할을 생성합니다.
'클러스터 역할'을 생성합니다.
IAM 메뉴 > 역할 메뉴 페이지에서 역할 만들기를 클릭합니다.
1단계 일반사용 사례
'AWS 서비스'와 일반사용 사례 'EC2'를 선택, 'EKS'를 선택, 'EKS - Cluster'를 선택하고 '다음'을 클릭합니다.
2단계 권한 정책 연결
다음을 클릭합니다.
3단계 태그 추가(선택 사항)
다음을 클릭합니다.
4단계 검토
역할 이름 'eksClusterRole'를 입력하고 '역할 만들기' 버튼을 클릭합니다.
역할이 생성되었습니다.
'노드그룹 역할'을 생성합니다.
IAM 메뉴 > 역할 메뉴 페이지에서 역할 만들기를 클릭합니다.
1단계 일반사용 사례
'AWS 서비스'와 일반사용 사례 'EC2'를 선택, 'EC2'를 선택, 'EC2'를 선택하고 '다음'을 클릭합니다.
2단계 권한 정책 연결
정책필터에 다음 3가지를 차례대로 입력하고 체크를 합니다. 아래는 "AmazonEKSWorkerNodePolicy"를 체크하는 예입니다.
"AmazonEKSWorkerNodePolicy"
"AmazonEC2ContainerRegistryReadOnly"
"AmazonEKS_CNI_Policy"
3가지 정책을 체크하였다면 다음을 클릭합니다.
3단계 태그 추가(선택 사항)
다음을 클릭합니다.
4단계 검토
역할 이름 'NoteInstanceRole'를 입력하고 '역할 만들기' 버튼을 클릭합니다.
역할이 생성되었습니다.
2. 클러스터 생성
EKS > 클러스터 > Amazon EKS 메뉴 페이지로 이동합니다.
클러스터 생성을 클릭합니다.
1단계 클러스터 구성
이름 'my-eks-cluster'를 입력하고 클러스터 서비스 역할은 (미리 선택되어 있습니다) 'eksClusterRole'을 선택하고 다음을 클릭합니다.
2단계 네트워킹 지정
VPC 'default', 서브넷은 4개 모두 선택합니다.
보안그룹은 새로 등록하기 위하여 'VPC콘솔'을 클릭하여 보안그룹 'SG-EKS', VPC는 'default', 인바운드 규칙은 'HTTP(anywhere)'로 설정한 후, 보안그룹 항목에서 갱신하여 'SG-EKS'를 선택하고 나머지는 수정없이 다음을 클릭합니다.
3단계 로깅 구성
다음을 클릭합니다.
4단계 검토 및 생성
생성을 클릭합니다.
메시지가 클러스터 생성 진행중에서 활성 상태가 변경되어야 생성이 완료됩니다. 클러스터가 생성되었습니다.
3. 노드그룹 생성
생성된 클러스터의 세부정보에서 컴퓨팅 탭으로 이동합니다.
노드그룹 설정을 위하여 추가를 클릭합니다.
1단계 노드그룹 구성
이름 'node-group', 역할 'NodeInstanceRole'을 선택하고 나머지는 기본값으로 하여 다음을 클릭합니다.
2단계 컴퓨팅 및 조정 구성 설정
EKS 노드 최소 유형인 't3.medium'으로 디스크 크기는 '20GiB', 노드그룹 조정은 최소 2, 최대 4, 기본 3으로 아래와 같이 설정한 후 다음을 클릭합니다.
3단계 네트워킹 지정
서브넷은 구성 4가지 모두를 선택합니다.
노드에 대한 SSH 액세스 구성을 활성화하기 위하여 설정을 변경하면 다음과 같은 경고 메세지가 나타납니다. 잘 숙지하시기 바랍니다.
여기서는 키페어를 미리 지정한 것을 사용합니다. 보안그룹은 실습 과정에서는 인바운드 규칙에 모두 통신 되는 것을 사용합니다. 다음을 클릭합니다.
4단계 검토 및 생성
생성을 클릭합니다.
메시지가 노드그룹 생성 진행중에서 활성 상태가 변경되어야 생성이 완료됩니다. 노드그룹이 생성되었습니다.
4. kubectl 설치
EC2 인스턴스에 접속하여 kubectl을 설치합니다.
# EC2 instance에 접속
$ ssh -i "my-aws-train.pem" ec2-user@ec2-3-36-126-37.ap-northeast-2.compute.amazonaws.com
Last login: Thu Nov 25 05:11:52 2021 from 218.38.24.159
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-2/
7 package(s) needed for security, out of 7 available
Run "sudo yum update" to apply all updates.
# aws 로그인
$ aws configure
# kubectl 설치
$ curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.20.4/2021-04-12/bin/linux/amd64/kubectl
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 38.3M 100 38.3M 0 0 4878k 0 0:00:08 0:00:08 --:--:-- 5977k
$ chmod +x ./kubectl
$ mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
$ kubectl version --short --client
Client Version: v1.20.4-eks-6b7464
# --name 은 생성한 클러스터명
$ aws eks --region ap-northeast-2 update-kubeconfig --name my-eks-cluster
Added new context arn:aws:eks:ap-northeast-2:103355202864:cluster/my-eks-cluster to /home/ec2-user/.kube/config
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 3d18h
# 노드그룹 3개가 생성되어 있는지 확인
$ kubectl get node
NAME STATUS ROLES AGE VERSION
ip-172-31-22-232.ap-northeast-2.compute.internal Ready <none> 3d18h v1.21.5-eks-bc4871b
ip-172-31-5-167.ap-northeast-2.compute.internal Ready <none> 3d18h v1.21.5-eks-bc4871b
ip-172-31-63-200.ap-northeast-2.compute.internal Ready <none> 3d18h v1.21.5-eks-bc4871b
5. 애플리케이션 배포
쿠버네티스에서 가장 중요한 기능인 애플리케이션 배포과정입니다.
Deployment를 통한 어플리케이션 배포를 합니다.
배포 리소스를 생성합니다.
# 배포 yaml 파일 생성
$ vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 6
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
containers:
- name: nginx-deployment-container
image: public.ecr.aws/b3h1g9o6/aplus
; wq!
# 리소스 생성
$ kubectl apply -f deployment.yaml
deployment.apps/nginx-deployment created
#
$ kubectl get deployments.apps -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 0/6 6 0 157m nginx-deployment-container public.ecr.aws/b3h1g9o6/aplus app=nginx-deployment
# 상세정보 확인
$ kubectl describe deployments.apps nginx-deployment
6. 노드포트 배포
노드포트 배포 리소스도 동일한 방법으로 생성합니다.
$ vi nodeport-deployment.yaml # 노드포트 yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-deployment
spec:
type: NodePort
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080
; wq!
# 리소스 적용
$ kubectl apply -f nodeport-deployment.yaml
service/nodeport-service-deployment created
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 3d23h <none>
nodeport-service-deployment NodePort 10.100.220.150 <none> 80:30080/TCP 13s app=nginx-deployment
$ kubectl describe svc nodeport-service-deployment
7. 클러스터IP 배포
클러스터IP 배포 리소스를 생성합니다.
# 클러스터아이피 yaml
$ vi clusterip-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-deployment
spec:
type: ClusterIP
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
; wq!
# 리소스 생성
$ kubectl apply -f clusterip-deployment.yaml
service/clusterip-service-deployment created
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
clusterip-service-deployment ClusterIP 10.100.77.184 <none> 80/TCP 6s app=nginx-deployment
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 3d23h <none>
nodeport-service-deployment NodePort 10.100.220.150 <none> 80:30080/TCP 7m1s app=nginx-deployment
$ kubectl describe svc clusterip-service-deployment
8. 로드밸런서 배포
로드밸러서 리소스를 생성합니다.
# 로드밸런서 yaml
$ vi loadbalancer-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-deployment
spec:
type: LoadBalancer
externalIPs:
- 192.168.0.143
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
;wq!
$ kubectl apply -f loadbalancer-deployment.yaml
service/loadbalancer-service-deployment created
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
clusterip-service-deployment ClusterIP 10.100.77.184 <none> 80/TCP 3m5s app=nginx-deployment
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 3d23h <none>
loadbalancer-service-deployment LoadBalancer 10.100.9.2 a8cc51e0f3adf4f3d87c756b1a3052ec-1693233752.ap-northeast-2.elb.amazonaws.com,192.168.0.143 80:30942/TCP 21s app=nginx-deployment
nodeport-service-deployment NodePort 10.100.220.150 <none> 80:30080/TCP 10m app=nginx-deployment
$ kubectl describe svc loadbalancer-service-deployment
7. EKS 도메인 설정
Route 53 메뉴로 이동하여 EKS용 레코드를 생성합니다.
레코드 : eks.sbrich.shop
API 서버 엔드포인트 : https://B78F9C1D5B5CAB72B1864B32C925EF7D.gr7.ap-northeast-2.eks.amazonaws.com
8. EKS 클러스터 확인
EC2 목록 확인 : tag name이 없는 것이 EKS 오토스케일 대상 EC2 인스턴스(node)
EKS 클러스터클러스터 개요정보
EKS 클러스터의 워크로드 정보
EKS 클러스터 구성
서비스 리소스 정보
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
clusterip-service-deployment ClusterIP 10.100.77.184 <none> 80/TCP 61m
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 4d
loadbalancer-service-deployment LoadBalancer 10.100.9.2 a8cc51e0f3adf4f3d87c756b1a3052ec-1693233752.ap-northeast-2.elb.amazonaws.com,192.168.0.143 80:30942/TCP 58m
nodeport-service-deployment NodePort 10.100.220.150 <none> 80:30080/TCP 68m
Tips
팁 - 쿠버네티스 pod, replicaset, deployment 서비스 삭제하는 방법입니다.
$ kubectl get all
$ kubectl delete pod,svc --all
$ kubectl delete replicaset,svc --all
$ kubectl delete deployment,svc --all
팁 - 롤링 업데이트 제어
# Deployment 롤링 업데이트 제어
$ kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=nginx:1.9.1
$ kubectl get all
$ kubectl rollout history deployment nginx-deployment
$ kubectl rollout history deployment nginx-deployment --revision=2 # 리비전2 상세보기
$ kubectl rollout undo deployment nginx-deployment # 롤백(전 단계로 복원)
$ kubectl get all
$ kubectl rollout history deployment nginx-deployment
$ kubectl rollout history deployment nginx-deployment --revision=3 # 리비전3 상세보기
쿠버네티스 명령어는 다음링크에서 참조하세요.
kubectl 명령어 참조는 아래에서
https://kubernetes.io/ko/docs/reference/kubectl/kubectl/
이번 시간에는 AWS 인프라 구축 실습 15회 - EKS에 대하여 실습해 보았습니다.