본문 바로가기
CICD/AWS

MSA 구조 K8S 통해 배포해보기 (4) EKS, ECR, GitAction

by windy7271 2024. 9. 1.
728x90
반응형

 

이제 레디스, DB, EKS 등이 남았다.

레디스는 저번에 한적이있다.

 

https://windy7271.tistory.com/entry/k8s-rediscluster-%EC%97%98%EB%9D%BC%EC%8A%A4%ED%8B%B1%EC%BA%90%EC%8B%9C%EB%A0%88%EB%94%94%EC%8A%A4-%EC%84%A4%EC%A0%95

 

k8s rediscluster, 엘라스틱캐시(레디스) 설정,

엘라스틱캐시 는 클라우드에서 분산된 인메모리 데이터 스토어 또는 캐시 환경을 쉽게 설정, 관리 및 확장할 수 있게 해주는 웹 서비스이다. 간단하기때문에 많이 사용한다. 이 서비스를 사용해

windy7271.tistory.com

 

EKS, ECR 뭘까 ? 너무 궁금하다

 

 

이번 블로그를 쓰면서 한 번 제대로 공부했고 가장 쉽게 알려주려고한다.

 

EKS (Amazon Elastic Kubernetes Service)

AWS에 관리형 K8S 클러스터를 실행할 수 있는 서비스이다.

Docker로 컨테이너화한 app의 자동배포, 확장, 관리를 지원한다 

컨테이너를 실행하는 ECS 와 비슷하지만 사용하는 API가 다르다. ESC 는 오픈소스가 아니고, K8S는 오픈소스이고 여러 클라우드 제공자가 사용한다.

 

azure google cloud 등 모든 클라우드에서 지원되고 클라우드 컨테이너 간 마이그레이션할 경우 eks가 솔루션이 된다.

 

2가지 실행모드

  • EC2시작모드
  • Fargate 모드

 

쿠버네티스는 클러스터 기반으로 구성되어 있고, 클러스터는 컨테이너화된 애플리케이션을 실행하기 위한 컴퓨터의 집합(노드)이다.

클러스터는 마스터 노드와 워커 노드로 구성되어있다. 아마 1편에서 얘기한거 같다.

 

 

 

그러면 여기서 말한 그 클러스터가 EKS가 된다. 생성 해보면 알겠지만 노드 그룹은 자동으로 생성이된다.

EKS 의 장점은 

1. 보안

2. 다른 AWS 서비스와 통합

3. 자동 스케일링 (HPa, Cluster Autoscaler)

4. IAM 을 통한 보안

5. 고가용성 - 여로 AZ 에서 클러스터를 배포해 높은 가용성과 내결함성을 제공한다.

 

 

 

 

생성 한 번 가보겠다.

 

일단 EKS 전용 Role 을 만들자Role에 대해 궁금하다면 밑에서 찾아보면 된다.

https://windy7271.tistory.com/entry/AWS-IAM-%EA%B3%BC-CLI

 

[AWS] IAM 과 CLI

새로운 어플 선택시 어느 나라를 선택하는게 좋을까?-상황에 따라 다르다 1. 법률준수2.지연시간: 가까울 수록 지연시간이 줄어든다.3.요금데이터 센터(DC)와 가용영역(AZ)들은 높은 대역폭의 초

windy7271.tistory.com

 

 

EKS 전용 role 을 생성하려는데 일단은 아무것도 추가하지 않는다.

나중에 필요하면 여기서 추가하면 된다. 이렇게 aws 서비스 별로 보안그룹을 생성해주는게 좋다.

 

EKS role도 생성해줘야한다.

 

IAM 콘솔에서 역할생성하기

 

 

AWS서비스, EKS -cluster

추가 다음

 

 

 

default 냅둬주시고

 

그리고 생성해주고 아까 거기에 다시 넣어준다.

 

이렇게 추가해주면 된다.

 

보안그릅과 서브넷은 적절히 해주고 (저는 기본) 클러스터 엔드포인트 엑세스는 퍼블릭 나머지는 디폴트로 생성해줍니다.

 

 

aws eks update-kubeconfig --region ap-northeast-2 --name test

를 해줘야하는데, kubectl 명령어가 AWS EKS 클러스터와 통신할 수 있도록 Kubernetes 구성 파일(kubeconfig)을 업데이트하기 위해서다다. 이 명령어를 통해 kubectl이 EKS 클러스터에 대한 작업을 수행할 수 있게 된다.

 

kubectl get pods 하면 노드가 없기때문에 아무것도 안 가져온다. 그래서 만들어준다.

iam룰 을 추가해주고

 

컴퓨터 사양을 골라서 만들어주면 2개가 만들어질것이다.

 

이런식으로 나오게된다. 

 

ECR 이미지 만들기

ECR은 AWS에서 제공하는 Docker 컨테이너 이미지 레지스트리 서비스이다. 이따 코드단에서 보여질것인데 한 번 만들어보자

 

이런식으로 이름을 써주면 된다.

 

Deployment

EKS 에서 application 을 어떻게 배포할지 정의하는 리소스이다. 파드도 생성한다.

이 파드는 ECR 에서 이미지를 가져와 실행되며 이를 통해 Application EKS 클러스에서 실행된다.

 

내 Employee 코드를 보겠다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: employee-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: employee
  template:
    metadata:
      labels:
        app: employee
    spec:
      containers:
        - name: employee-backend
          image: 533267394261.dkr.ecr.ap-northeast-2.amazonaws.com/harbor-employee:latest
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
          resources:
            limits:
              cpu: "1"
              memory: "500Mi"
            requests:
              cpu: "0.5"
              memory: "250Mi"
          ##### Kubectl secrets #####
          env:
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: DB_HOST
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: DB_USERNAME
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: DB_PASSWORD
            - name: REDIS_HOST
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: REDIS_HOST
            - name: JWT_SECRETKEY
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: JWT_SECRETKEY
            - name: HOST
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: HOST
            - name: S3KEY
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: S3KEY
            - name: S3PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-infos
                  key: S3PASSWORD
---

 

이게 Deployemt 코드이다.

k8s에서 파드가 실행될때 컨테이너에 할당할 양도 지정한다.

 

이 설정은 K8s 에서 컨테이너 실행시(배포) 적용된다. ECR은 단지 컨테이너 이미지를 저장하고 있을 뿐 이다.

 

---
apiVersion: v1
kind: Service
metadata:
  name: employee-service 
spec:
  type: ClusterIP # 클러스터 내부
  ports:
    - name: http
      port: 80
      targetPort: 8080
  selector:
    app: employee

---

 

서비스로 파드에 대한 네트워크 엑세스 관리한다.

App: employee 라는 레이블을 가진 모든 파드를 선택하고 여러 요청이 있으면 각 파드로 분산시키기도한다.

 

나는 깃 푸쉬를 하는순간 코드가 돌아가게 해놨는데.

name: Harbor-Employee-Backend
on:
  push:
    branches:
      - harbor-employee
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: checkout github
        uses: actions/checkout@v2

      - name: install kubectl
        uses: azure/setup-kubectl@v3
        with:
          version: "v1.25.9"
        id: install

      - name: configure aws
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      - name: update cluster information
        run: aws eks update-kubeconfig --name harbor_cluster --region ap-northeast-2

      - name: Login to ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      ################ build and push #################
      ################ employee  #################
      - name: build and push docker image to ecr (employee)
        env:
          REGISTRY: 533267394261.dkr.ecr.ap-northeast-2.amazonaws.com
          REPOSITORY: harbor-employee
          IMAGE_TAG: latest
        run: |
          docker build \
          -t $REGISTRY/$REPOSITORY:$IMAGE_TAG \
          -f ./Harbor_employee/Dockerfile ./Harbor_employee
          docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG

      ################ apply ################
      - name: eks kubectl employee apply
        run: |
          kubectl apply -f ./Harbor_employee/k8s/harbor-employee-depl-serv.yml
          kubectl rollout restart deployment employee-depl

 

 

 

EKS를 나는 따로 실행 시켜줘야하는줄 알았는데 kubectl이 그 명령어였다.

 

순서대로 한번 해보겠다.

  1.  개발자가 harbor-backend 브랜치에 푸시하면 자동으로 트리거된다.
  2.  코드 체크아웃: 최신 코드를 가져온다
  3.  kubectl 을 설치한다. -- EKS클러스터와 상호작용할때 사용 (kubectl ~)
  4.  EKS 정보 업데이트 
  5. ECR 로그인 
    1.  이미지를 푸시하기위해서 필요하다
  6.  EKS와 상호작용한다.
    1. kubectl apply -f ./Harbor_employee/k8s/harbor-employee-depl-serv.yml 으로 EKS클러스터와 상호작용하여 k8s 리소스 생성하거나 업데이트 작업을 한다.

 

EKS 와 ECR에 대해 알아보았다.

이제남은것들은 도커작성과 DB연결, HPA, kafka 등이 남았다.

 

 

반응형

댓글