Devops Tutorial


개요

이전 실습들을 모두 수행했다면 이번엔 EKS로 환경 구성, 어플리케이션 배포를 할 것이다.

Kuberntes 는 대규모 컨테이터 환경에 적합한 컨테이너 오케스트레이션 오픈소스 소프트웨어이다.

그리고 AWS 에서 제공하는 EKS(Elastic Kubernetes Service) 를 통해 효율적인 환경 구성 및 관리가 가능하다.



사전 준비

AWS CLI 설치

AWS CLI 초기 설정

IAM USER 권한에 AdministratorAccess policy 권한 부여



EKS 구성 하기

IAM USER for EKS

EKS는 Root User의 접근을 권장하지 않으며 EKS을 관리하기 위한 권한(Kubernetes RBAC authorization)을 EKS를 생성한 IAM 엔터티(user 혹은 role)로 부터 할당을 시키기 때문에 IAM user 혹은 role를 사용중이지 않다면 필수로 IAM 엔터티를 생성하고 EKS 생성 역할을 부여 해야한다.


IAM User 생성

alt text



alt text



AWS Configurations

aws configure 명령어와 Access Key를 통해 사용자를 지정 할 수 있다.



현재 세션의 IAM 엔터티 확인 방법

aws sts get-caller-identity 명령어를 통해 확인 가능



Install eksctl and kubectl


kubectl 설치(1.18)

eksctl 설치



Deploy EKS Cluster


EKS 배포를 위한 구성 정보 파일 (eks-cluster-config.yml) 작성


eks-cluster-config.yml

---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: test-eks-cluster
  region: ap-northeast-2

availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]

iam:
  withOIDC: true

managedNodeGroups:
- name: test-eks-workers
  desiredCapacity: 1
  iam:
    withAddonPolicies:
      albIngress: true
  instanceTypes: ["c4.large","c5.large"]
  spot: true
#  instanceType: t3.small
#  ssh:
#    publicKeyName: "<your key pair name>"
#    https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#KeyPairs:

cloudWatch:
    clusterLogging:
        enableTypes: ["audit", "authenticator", "controllerManager"]


eksctl create cluster -f ./eks-cluster-config.yml


명령어 실행, cluster 생성 (15~25분 가량 소요)


EKS Cluster 접속 확인

Output

[✔] all EKS cluster resources for "test-eks-01" have been created [ℹ] nodegroup "tes-eks-workers" has 1 node(s) [ℹ] node "ip-192-168-27-236.ap-northeast-2.compute.internal" is ready [ℹ] waiting for at least 1 node(s) to become ready in "test-eks-workers" [ℹ] nodegroup "test-eks-workers" has 1 node(s) [ℹ] node "ip-192-168-27-236.ap-northeast-2.compute.internal" is ready [ℹ] kubectl command should work with "/Users/kcchang/.kube/config", try 'kubectl get nodes' [✔] EKS cluster "test-eks-01" in "ap-northeast-2" region is ready



kubectl을 통해 추가된 node 확인

kubectl get nodes



Application Deployment Using Kubernetes


쿠버네틱스에 Flask app을 배포하기 위해 Deployment manifast 파일 작성

flask-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-flask
  labels:
    app: test-flask
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-flask
  strategy:
    rollingUpdate:
      maxSurge: 20%
      maxUnavailable: 20%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: test-flask
    spec:
      containers:
      - image: ju990828/devopstutorial:latest
        imagePullPolicy: Always
        name: test-flask
        ports:
        - containerPort: 5000
          protocol: TCP

deployment 파일 내용으로 배포:

kubectl apply -f flask-deployment.yaml


배포 내용 확인:

kubectl describe deployment test-flask



정상적으로 Flask app이 배포 되었다면 외부에서 flask app으로 접속을 위해 service를 deployment에 매핑

flask-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: test-flask-svc
spec:
  selector:
    app: test-flask
  ports:
   -  protocol: TCP
      port: 80
      targetPort: 5000
  type: LoadBalancer


service file 배포:

kubectl apply -f flask-service.yaml


배포가 정상적으로 완료가 되면 Pod 정보를 찾을수 있다

kubectl get pods -l app=test-flask


flask app의 경우는 Service 타입을 LoadBalancer로 Endpoint를 외부 노출시켜 접근 가능

kubectl get svc test-flask-svc

Output

NAME              TYPE           CLUSTER-IP       EXTERNAL-IP                                                                   PORT(S)        AGE
test-flask-svc   LoadBalancer   10.100.163.64   acd2f9103b9564eb3asa544282a1dee3-566651492.ap-northeast-2.elb.amazonaws.com   80:31126/TCP   98s 

Output 을 통해 확인한 EXTERNAL-IP(LB endpoint) 를 통해 접근 가능 (1~2분 정도 소요 후 정상적으로 작동)



Clean Up


실습 후 EKS 리소스를 정리

eksctl delete cluster --region=ap-northeast-2 --name=<your eks cluster name>