반응형
개요
AWS EKS 환경에서 ELB를 사용해야 할 때 aws-load-balancer-controller를 설치해야 한다.
추가로 ingress-nginx-controller도 많이 사용한다.
각각에 대한 사용 용도, 설치 및 사용 방법, 옵션을 정리한다.
두 개의 컨트롤러는 모두 헬름 차트로 설치한다.
사전 구성: 서브넷 자동 검색 (옵션)
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/subnet_discovery/
aws-load-balancer-controller
사용 용도
- Kubernetes Cluster에서 AWS ELB를 사용/관리하기 위해서 필요하다.
- ALB를 설치하기 위해서는 Kubernetes Ingress를 정의한다.
- NLB를 설치하기 위해서는 Kubernetes Service를 정의한다.
설치 방법
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/aws-load-balancer-controller.html
nginx 배포
AWS ALB를 사용해서 Nginx에 접속하는 예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
annotations:
alb.ingress.kubernetes.io/target-type: "ip"
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/group.name: "jena-alb"
alb.ingress.kubernetes.io/group.order: "1"
alb.ingress.kubernetes.io/subnets: subnet-xxxxxxxxx, subnet-xxxxxxxxx
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:ap-northeast-2:xxxxxxxxxxxx:certificate/xxxxxx-xxxxx-xxxx-xxxx-xxxxxxxx"
alb.ingress.kubernetes.io/ssl-redirect: "443"
alb.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
ingressClassName: "alb"
rules:
- host: nginx.xxxx.xxxx
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
- 타겟 타입을 ip로 설정할 경우
- service.type: ClusterIP
- alb.ingress.kubernetes.io/target-type: "ip"
- 타겟 타입을 instance로 설정할 경우
- service.type: NodePort or LoadBalancer
- alb.ingress.kubernetes.io/target-type: "instance"
- 단일 ALB를 사용하여 여러개의 Ingress 규칙을 자동으로 병합 (단일 ALB으로 여러개의 서비스 지원)
- alb.ingress.kubernetes.io/group.name: {GROUP_NAME}
- alb.ingress.kubernetes.io/group.order
- ssl redirect 옵션 설정
- alb.ingress.kubernetes.io/ssl-redirect: "443"
- https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.7/guide/tasks/ssl_redirect/
- LoadBalance에 ACM(SSL/TLS) 증명서를 설치하면 LB단에서 SSL/TLS을 종료시켜야 하므로 backend-protocol을 http로 설정
- alb.ingress.kubernetes.io/backend-protocol: "HTTP"
설치 확인
설정한 도메인에 ALB 등록을 하면 웹페이지를 확인할 수 있다.
Ingress-nginx-controller
사용 용도
- 주의) AWS ELB를 사용하려면 aws-load-balancer-controller는 필수이다. (사전 설치 필요)
- 백엔드 서비스의 노출된 URL이 수신 규칙의 지정된 경로와 다를 때 사용할 수 있는 Rewrite 옵션을 사용할 수 있다.
설치 방법
values.yaml
controller:
service:
targetPorts:
http: http
https: http
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:XX-XXXX-X:XXXXXXXXX:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
service.beta.kubernetes.io/aws-load-balancer-subnets: subnet-xxxx, subnet-xxxx
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
- 아래 두 옵션을 통해 타겟 타입이 ip인 nlb를 생성한다.
- service.beta.kubernetes.io/aws-load-balancer-type: "external"
- service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
- 타켓 타입을 instance로 생성하고 싶으면 아래 옵션으로 변경한다.
- service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"
- LoadBalance에 ACM(SSL/TLS) 증명서를 설치하면 LB단에서 SSL/TLS을 종료시켜야 하므로 위와 같은 설정이 필요.
설치 명령어
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx -f values.yaml -n ingress-nginx --version 4.2.0
controller 설치 확인
nginx 배포
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: "nginx"
rules:
- host: nginx.xxxx.xxxx
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
nginx 설치 확인
참고
https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx/templates
https://github.com/kubernetes-sigs/aws-load-balancer-controller
반응형
'DevOps > Kubernetes' 카테고리의 다른 글
MAC M1에서 EKS 배포 에러 (CPU ARM/AMD 문제) (0) | 2022.09.22 |
---|---|
Secret Manager를 사용해서 K8S Secret 관리하기 (0) | 2022.09.15 |
[k8s] Resource + Autoscaler (CA, HPA) 개념 정리 (0) | 2022.07.18 |
[k8s] Graceful Shutdown을 위한 preStop, terminationGracePeriodSeconds 설정 (0) | 2022.06.29 |
Kubernetes Component (0) | 2022.06.22 |