private link, ingress로 분기 처리하기

Glen·2023년 12월 31일
0

Azure에서 Frontdoo와 AKS를 사용하여 구축을 진행했다.
외부로 노출시키지 않고 안전하게 내부 서비스로 통신할때 Private Link를 각 서비스마다 k8s service에 생성해서 사용했다.

그러다 어느순간 생성이 되질 않았다. 알고보니 AKS에 public, private l4가 하나씩 존재하는데 그 l4에 연결할 수 있는 private link가 최대 8개까지 밖에 되질 않는다.

그래서 뜯어고치는김에 여러 테스트를 진행해보고 결국 NS당 private link한개만 사용하는것으로 구조를 변경해봤다.

  • 기존 : service에 pls를 내부 네트워크에 배포

    • 하나의 aks에 pls가 최대 8개 까지만 연결 될 수 있다.
  • 변경 : nginx ingress-controller의 service에 private link 배포

    • host 기반으로 분기처리 하여 하나의 pls로 같은 포트도 사용 가능.
    • 그림에서 ingress가 하나로 되어있지만 사실 ingress-controller를 하나로 사용하는것이고 argocd app마다 ingress를 각각 생성해줬다.
      • 만약 모든 서비스의 namespace가 같으면 하나로 사용해도 무방.

Nginx Controller

  • nginx controller를 helm으로 배포 하는 스크립트에 annotation을 미리 세팅해준다.
    • nginx controller의 service에 privatelink가 배포된다.
#!/bin/bash

NAMESPACE=$2
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

helm install --replace $1-nginx ingress-nginx/ingress-nginx \
    --namespace $NAMESPACE \
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."kubernetes\.io/os"=linux \
    --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-internal"=true \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-pls-create"=true \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-pls-ip-configuration-subnet"="<subnet-name>" \
    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-pls-name"="stg-${NAMESPACE}-pls" \
    --set annotations."app\.kubernetes\.io/managed-by"=$1 \
    --set controller.ingressClass=$1-nginx \
    --set controller.ingressClassResource.name=$1-nginx \
    --set controller.ingressClassResource.controllerValue="k8s.io/$1-nginx"

Frontdoor

  • ingress controller에 private link가 배포 된 후 설정된 ip를 선언
  • host 기반으로 분기하기 때문에, 원본 호스트헤더에 분기처리할 host를 명시
    • ingress에 명시된 host와 맞지 않으면 nginx 404 에러가 발생함.

ingress

  • ingress classname을 통일
    • 같은 내부 ip를 할당받아 사용됨
  • host에 맞는 service name 명시
ingress:
  enabled: true
  ingressClassName: "stg-web-nginx"
  annotations:
  hosts:
    - host: 'stg.test.com'
      paths:
        - path: /
          pathType: Prefix
          service:
            - name: stg-test-web
              port: 80
  • web에서 다른 도메인으로 요청하는 서비스일 경우엔 cors에러가 발생할 수 있기 때문에 cors와 관련된 annotations 설정
ingress:
  enabled: true
  ingressClassName: "stg-web-nginx"
  annotations:
    nginx.ingress.kubernetes.io/cors-allow-origin : "*"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET,POST,OPTIONS"
    nginx.ingress.kubernetes.io/enable-cors: 'true'
  hosts:
    - host: 'stg-backend.test.com'
      paths:
        - path: /
          pathType: Prefix
          service:
            - name: stg-test-backend
              port: 80

결과

  • 하나의 ingress controller의 로그에서 분기처리되는것을 확인 할 수 있다.
    • 빨강 : web
    • 초록 : backend
profile
어제보다 나은 엔지니어가 되기 위해서 공부중

0개의 댓글