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, 어플리케이션 환경 구성
해당 프로젝트는 테라폼을 통해 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 관련 매니페스트를 다시 구성 했다.
ALB-Ingress를 다시 생성했을때 AWS 콘솔에서도 생성 중이고
생성인 완료되면 정상적으로 접속이 된다!!!
ALB-Ingress 생성에 필요한 컨드롤러 매니페스트 코드는 아래 깃허브 레포지토리에서 확인 가능하다.
ALB-Ingress 매니패스트 : https://github.com/Duckie1/mini-project/tree/main/management/ALB-Ingress