DevOps/Kubernetes

[EKS] Kubernetes Ingress 설치 및 옵션 정리

Jen'_' 2022. 8. 19. 17:06
반응형

개요

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 옵션 설정
  • LoadBalance에 ACM(SSL/TLS) 증명서를 설치하면 LB단에서 SSL/TLS을 종료시켜야 하므로 backend-protocol을 http로 설정
    • alb.ingress.kubernetes.io/backend-protocol: "HTTP"

 

설치 확인

aws-load-balancer-controller 설치 확인
nginx 설치 확인
ingress(alb) 생성 확인
웹페이지 확인

설정한 도메인에 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"

 

설치 명령어 

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 설치 확인

ingress-nginx-controller 설치 확인
nlb 생성
target type is ip

 

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 설치 확인

nginx 설치 확인
ingress 설치 확인
웹페이지 확인

 

 

 

 

참고

https://github.com/kubernetes/ingress-nginx/tree/main/charts/ingress-nginx/templates

https://github.com/kubernetes-sigs/aws-load-balancer-controller

반응형