Cloud AWS, Azure, GCP

AWS 인프라 구축 실습 15회 - EKS

SB리치퍼슨 2021. 12. 22. 14:01

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/

 

kubectl

시놉시스 kubectl은 쿠버네티스 클러스터 관리자를 제어한다. 자세한 정보는 kubectl 개요를 확인한다. kubectl [flags] 옵션 --add-dir-header true인 경우, 로그 메시지의 헤더에 파일 디렉터리를 추가한다. -

kubernetes.io

 


이번 시간에는 AWS 인프라 구축 실습 15회 - EKS에 대하여 실습해 보았습니다.

반응형