실습
전체적인 순서
- cert-manager 배포
- ⇒ cert-manager가 설치되어 있지 않을 경우 AWS Load Balancer Controller에서 Certificate를 배포하지 못한다. 미리 설치되어 있어야 한다.
- AWS Load Balancer Controller 배포
- Cluster name, VPC ID, Region Name, AWS Load Balancer Controller 전용 IAM Role ARN 4개의 값을 미리 알고 있어야 한다.
- 데모용 Ingress 배포
- ⇒ 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 라인 수정
야믈 템플릿 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
'AWS' 카테고리의 다른 글
[CICD / ECS] CodePipeline으로 ECS Fargate 배포 자동화 #1 - 개요, 아키텍처 (0) | 2021.09.27 |
---|---|
[AWS] ALB, NLB 기본 개념 정리하기 (0) | 2021.09.06 |
[EKS] AWS Load Balancer Controller 알아보기 #1 - 개념 (1) | 2021.08.30 |
[Bash] S3에 저장되어 있는 AWS FlowLogs 추출하는 Shell Script (0) | 2021.08.21 |
[CICD] Terraform을 통한 AWS 3 Tier 구성 및 CI/CD 파이프라인 배포 #5 - CodeDeploy를 통한 ASG Blue-Green 배포 (2) | 2021.08.11 |