본문 바로가기

EKS/LoadBalancer & EXT DNS

EKS LoadBalancer - 4. Nginx Ingress (NLB)

Helm을 통해 Nginx Ingress를 설치해보도록 하겠습니다.

 

Helm3를 설치해주시고, nginx-ingress namespace를 만들어주세요

 

그리고 아래와 같이 values.yaml을 만들어주도록 하겠습니다.

 

여기서 중요하게 봐야하는 부분이 ingressClass입니다. Nginx Ingress를 하나만 두지 않고 여러개를 두어 통신하게 구성할 수 있는데,

이때 ingressClass로 어떤 nginx ingress에서 트래픽을 받을 것인지 정하기 때문입니다.

 

저는 일단 외부에서 퍼블릭하게 할 수 있도록 구성할 것인데 ext-nginx-ingress라 칭하겠습니다.

 

만약 저 처럼, 특정 Node에 배포하실게 아니라면 affinity는 빼주시면 됩니다.

controller:
    ingressClass: ext-nginx
    affinity: 
        nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                  - key: nodegroup-type
                    operator: In
                    values:
                    - MANAGE
    service:
      annotations: 
        external-dns.alpha.kubernetes.io/hostname: yourdomain.com
        service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
        service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
        

 

이제 아래와 같이 구성하여보도록 하겠습니다.

kubectl create ns ext-nginx-ingress
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install -f ./ext-values.yaml -n ext-nginx-ingress ext-nginx ingress-nginx/ingress-nginx

 

이제, annotation을 읽어서 자동으로 Route53에 도메인을 등록 할 수 있도록, External DNS를 아래 yaml을 통해 배포해주세요

 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: ext-external-dns
  namespace: ext-nginx-ingress

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: ext-external-dns
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get","watch","list"]
- apiGroups: ["extensions"]
  resources: ["ingresses"]
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["list"]
- apiGroups: ["networking.istio.io"]
  resources: ["gateways"]
  verbs: ["get","watch","list"]

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: ext-external-dns-viewer
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: ext-external-dns
subjects:
- kind: ServiceAccount
  name: ext-external-dns
  namespace: ext-nginx-ingress
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-dns
  namespace: ext-nginx-ingress
spec:
  selector:
    matchLabels:
      app: external-dns
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: external-dns
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: nodegroup-type
                operator: In
                values:
                - MANAGE
      serviceAccountName: ext-external-dns
      containers:
      - name: external-dns
        image: registry.opensource.zalan.do/teapot/external-dns:v0.5.17
        args:
        - --source=service
        - --source=ingress
        - --domain-filter=yourdomain.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
        - --provider=aws
        - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
        - --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both)
        - --registry=txt
        - --txt-owner-id=route53 id

 

 

nginx ingress가 다른 네임스페이스에 트래픽을 전달하기 위해서는

아래와 같이 externalName.yaml을 nginx ingress가 구성된 네임스페이스에 만들어 주어야합니다.

kind: Service
apiVersion: v1
metadata:
  name: phh-fo
  namespace: ext-nginx-ingress
spec:
  type: ExternalName
  externalName: phh-fo.phh-test-fo.svc.cluster.local

 

이렇게 하면,

해당 coredns를 통해서 다른 네임스페이스에 있는 서비스더라도 phh-fo라는 이름을 매핑시켜 트래픽을 전달할 수 있게 됩니다.

 

마지막으로 ingress는 아래와 같이 배포해주시면 됩니다.

 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    name: ext-nginx-ingress
    namespace: ext-nginx-ingress
    annotations:
      kubernetes.io/ingress.class: "ext-nginx"
spec:
    rules:
    - host: yourdomain.com
      http:
        paths:
        - path: /
          backend:
            serviceName: phh-fo
            servicePort: 9000

 

Nginx Ingress 설치 및 트래픽 전달을 할 수 있게하는 ingress에 대해서 간략하게 알아봤습니다.