본문 바로가기

AWS

[EKS] AWS Load Balancer Controller 알아보기 #2 - 실습

반응형

실습

전체적인 순서

  1. cert-manager 배포
  2. ⇒ cert-manager가 설치되어 있지 않을 경우 AWS Load Balancer Controller에서 Certificate를 배포하지 못한다. 미리 설치되어 있어야 한다.
  3. AWS Load Balancer Controller 배포
    • Cluster name, VPC ID, Region Name, AWS Load Balancer Controller 전용 IAM Role ARN 4개의 값을 미리 알고 있어야 한다.
    ⇒ .yaml 파일에 기입해줘야함. 만약 각각의 값을 넣는 과정이 귀찮다면 쉘 스크립트를 짤 수도 있을 것이다.
  4. 데모용 Ingress 배포
  5. ⇒ Pod와 연결된 Service가 있다고 가정할 시 Ingress를 적절하게 생성할 경우 이를 Trigger하여 로드밸런서를 생성하는지 확인이 필요함

 

1. Cert Manager 배포

하기의 명령어로 간단하게 배포할 수 있다.

(엄청난 Template 길이를 자랑하므로 조용히 아래의 명령어를 칠 수 있도록 한다.)

 

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v1.4.1/cert-manager.yaml

 

 

2. AWS Load Balancer Controller 배포

  • IAM Role ARN : OIDC와 신뢰 관계를 맺은 IAM Role로 각 Controller에게 적절한 권한을 부여하기 위한 IRSA 사용 (IAM Role For Service Account)

 

252, 488, 490, 491 라인 수정

 

코드 출처 : https://github.com/marcincuber/eks/blob/master/k8s_templates/aws-load-balancer-controller/aws-load-balancer-controller.yaml

 

GitHub - marcincuber/eks: AWS EKS - kubernetes project

AWS EKS - kubernetes project. Contribute to marcincuber/eks development by creating an account on GitHub.

github.com

 

 

야믈 템플릿 Apply

kubectl apply -f aws-load-balancer-controller.yaml

 

 

3. 배포 확인
- 로드밸런서 컨트롤러가 배포된 것을 확인할 수 있다.

 

 

Trouble Shooting을 위한 Log 확인

해당 LB Controller Pod가 정상적으로 Ingress를 모니터링하고 LB 및 SG를 생성하는지 확인하기 위함

kubectl logs -f -n kube-system \
$(kubectl get po -n kube-system | egrep -o "aws-load-balancer[a-zA-Z0-9-]+")

 

 

4. 데모 Ingress 배포

Deployment를 배포하고, 이를 Service에서 레이블링하여 Service와 Pod를 연결해준다.
그 이후, Ingress를 생성하여 어떤 Path로 들어오는 트래픽에 대해 어느 Service로 보낼지를 정의해준다.
(해당 Template은 옛날 템플릿이며, 쿠버네티스 1.21 버전과는 다른 부분이 있다.)
LB를 어떻게 구성할지는 이 annotation으로 결정할 수 있다.
AWS 대상 그룹의 타입은 인스턴스 타입, 로드밸런서는 인터넷 페이싱, 
어느 서브넷에 로드밸런서를 배포할 것인지를 지정할 수 있다.

annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: instance     # instance, ip
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/subnets: subnet-0dadeb59620bbcd8f, subnet-0c688f06a54bd09d5

 

 

# 1. Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80

# 2. Service
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  type: NodePort
  selector:
    run: my-nginx

# 3. Ingress
# Annotation : https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/ 에서 확인할 수 있다.
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "ingress-app"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: instance     # instance, ip
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/subnets: subnet-0dadeb59620bbcd8f, subnet-0c688f06a54bd09d5
spec:
  rules:
   - http:
      paths:
        - path: /*
          backend:
            serviceName: "my-nginx"
            servicePort: 80

 

 

kubectl apply -f aws-lb-ingress-demo.yaml

 

결과

로그를 보아하니 정상적으로 수행한 것으로 보인다.

 

 

로드밸런서가 생성되었으며

 

대상 그룹은 인스턴스 타입, NodePort와 연결된 것으로 추정할 수 있다.

 

 

ALB의 Domain으로 접근한 결과 Nginx의 Pod로 접속한 것을 확인할 수 있다.

 

 

 

 

Ref

https://aws-eks-web-application.workshop.aws/ko/60-ingress-controller/100-launch-alb.html

반응형