EKS CI/CD 구성 프로젝트_1

duckiee·2023년 3월 2일
0

DevOps 업무에서 대표적인 업무는 컨테이너 환경과 CI/CD 파이프 라인의 구축 및 유지하는 것이다.
이번 포스트는 패스트 캠퍼스 강의내용을 참고하여 EKS 기반으로 컨테이너를 오케스트레이션 하고, 해당 환경에 CI/CD 환경을 구성하는 프로젝트를 기록하기로 했다.

예상 구성도

예상 구성도는 아래와 같으며, 아키택처는 테라폼을 통해 구성했다.

AWS 서비스의 용도는 아래와 같다.
1.S3 : 테라폼의 상태(tfsate) 파일의 원격 저장소
2.DynamoDB : 동시에 같은 테라폼 파일을 수정하지 못하도록 하기 위해 DynamoDB에 작업에 대한 Lock을 생성
3.ALB : k8s Ingress annotation에 의해 생성되는 ALB이며, 어플리케이션과 연결
4.Route53 : EKS에 배포된 어플리케이션, Ingress에 도메인 연결
5.ACM : 어플리케이션에 연결된 도메인에 SSL 적용
6.ECR : 어플리케이션의 컨테이너 이미지 저장
7.EKS : k8s 클러스터이며 jenkins, argocd, 어플리케이션 환경 구성

1. EKS 환경 구성하기

해당 프로젝트는 테라폼을 통해 EKS 환경을 구축 했으며, k8s 버전은 1.23 버전으로 진행 했다.
테라폼 코드(git-hub) : https://github.com/Duckie1/mini-project

EKS가 생성 되었다면 ALB를 사용하기 위해 Ingress를 구성해야 한다.
Ingress를 구성하기 위해 aws-load-balancer-controller를 생성하고 아래 매니페스트 파일을 사용하여 생성했다.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-2048
  namespace: test-ingress-alb
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/subnets: <서브넷 ID>, <서브넷 ID>
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: <어플리케이션 이름>
              servicePort: 80

아래와 같이 ALB는 정상적으로 생성되지 않고 생성후 오류메시지가 출력된다.

error: unable to recognize "example-ingress.yaml": no matches for kind "Ingress" in version "networking.k8s.io/v1beta1"

에러 메시지를 검색해보니 k8s 1.22 버전부터 networking.k8s.io/v1beta1 API 지원이 중단된다고 한다...
출처 : https://kubernetes.io/blog/2021/07/14/upcoming-changes-in-kubernetes-1-22

Ingress 메니패스트 파일을 아래와 같이 수정해서 다시 생성했다.
우선 AWS 콘솔에서는 확인되지 않고 아래 처럼 EKS클러스터 내부에서는 Ingress가 확인된다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test-ingress-alb
  name: ingress-2048
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/subnets: <서브넷 ID>, <서브넷 ID>
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: <어플리케이션 이름>
              port:
                number: 80

계속 ALB가 생성되지 않아 aws-load-balancer-controller 상태가 의심된다.
aws-load-balancer-controller 상태를 조회 해보니 아래와 같은 오류가 발생한다.

해당 오류를 검색해보니 1.19+ 이상 버전의 aws-load-balancer-controller는 2.4.2 이후의 버전을 써야한다고 한다.
기존 aws-load-balancer-controller 매니패스트를 보니 2.3.1 버전이었다.

k8s 1.23 버전에 맞춰 aws-load-balancer-controller, cert-manager 등 ALB 관련 매니페스트를 다시 구성 했다.

  • kube-system 네임스페이스 (aws-load-balancer-controller 환경)
  • cert-manager 네임스페이스 (aws-load-balancer-controller 환경)

ALB-Ingress를 다시 생성했을때 AWS 콘솔에서도 생성 중이고
생성인 완료되면 정상적으로 접속이 된다!!!

  • AWS 콘솔
  • 접속 테스트

ALB-Ingress 생성에 필요한 컨드롤러 매니페스트 코드는 아래 깃허브 레포지토리에서 확인 가능하다.
ALB-Ingress 매니패스트 : https://github.com/Duckie1/mini-project/tree/main/management/ALB-Ingress

profile
DevOps로 진화하기

0개의 댓글