TheKoguryo's 기술 블로그

 Version 2023.11.20

4.1.1 NGINX Ingress Controller 설치하기

OKE에서 Kubernetes에서 사용가능한 여러가지 오픈 소스 ingress controller를 사용할 수 있습니다. 본 문서에서는 그중에서 가장 많이 사용되며, OKE 문서에서 예제로 설명하고 있는 nginx-ingress-controller를 테스트 해보겠습니다.

NGINX Ingress Controller 설치

  1. kubectl 사용이 가능한 Cloud Shell 또는 작업환경에 접속합니다.

  2. nginx ingress controller 설치할 파일 deploy.yaml을 다운로드 받습니다.

    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml
    
  3. ingress-nginx-controller의 Load Balancer Service 유형에 대한 설정을 annotation으로 추가합니다.

    • metadata 하위에 Load balancer를 위한 annotations 들을 추가합니다.

      ---
      apiVersion: v1
      kind: Service
      metadata:
        labels:
          ...
        name: ingress-nginx-controller
        namespace: ingress-nginx
        annotations:
          service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
          service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
          service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "10"
      spec:
        loadBalancerIP: 152.69.xxx.xxx
        ...
        type: LoadBalancer  
      
    • 설정값 설명

      항목설명
      service.beta.kubernetes.io/oci-load-balancer-shape"flexible"Default: "100Mbps"
      flexible 유형을 선택
      service.beta.kubernetes.io/oci-load-balancer-shape-flex-min"10"flexible 유형인 경우 최소 용량 지정
      service.beta.kubernetes.io/oci-load-balancer-shape-flex-max"10"flexible 유형인 경우 최대 용량 지정
    • loadBalancerIP: Reserved Public IP를 사전에 만들어 가지고 있는 경우, 해당 IP를 직접 입력하여, 원하는 IP를 부여합니다.

  4. 다음 명령으로 NGINX Ingress Controller를 설치합니다.

    kubectl apply -f deploy.yaml
    
  5. 설치 확인

    ingress-nginx namespace에 아래와 같이 설치된 것을 확인할 수 있습니다.

    $ kubectl get all -n ingress-nginx
    NAME                                            READY   STATUS      RESTARTS   AGE
    pod/ingress-nginx-admission-create-5prnf        0/1     Completed   0          49s
    pod/ingress-nginx-admission-patch-cz55s         0/1     Completed   0          48s
    pod/ingress-nginx-controller-7d98bbddbd-chlvn   1/1     Running     0          50s
    
    NAME                                         TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
    service/ingress-nginx-controller             LoadBalancer   10.96.29.183   152.xx.xxx.xxx   80:30456/TCP,443:31096/TCP   51s
    service/ingress-nginx-controller-admission   ClusterIP      10.96.71.153   <none>           443/TCP                      50s
    
    NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/ingress-nginx-controller   1/1     1            1           51s
    
    NAME                                                  DESIRED   CURRENT   READY   AGE
    replicaset.apps/ingress-nginx-controller-7d98bbddbd   1         1         1       51s
    
    NAME                                       COMPLETIONS   DURATION   AGE
    job.batch/ingress-nginx-admission-create   1/1           10s        51s
    job.batch/ingress-nginx-admission-patch    1/1           13s        50s
    

Load Balancer IP 확인

  1. Ingress Controller 서비스의 로드밸런서 IP인 EXTERNAL-IP를 확인합니다.

    $ kubectl get svc -n ingress-nginx
    NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.96.29.183   152.xx.xxx.xxx   80:30456/TCP,443:31096/TCP   111s
    ...
    

Load Balancer 자원 확인

아래 내용은 Nginx Ingress Controller 설정변경으로, Worker Node가 둘 이상인 경우, 배포가 성공한 경우에도 OCI 콘솔상에서 Load Balancer의 Health 상태가 Critical로 표시되는 것을 설명하기 위한 내용으로 참고사항입니다.

  1. Load Balancer의 UID를 확인합니다.

    $ kubectl get svc ingress-nginx-controller -o jsonpath='{.metadata.uid}{"\n"}'
    07f0c122-6f5c-4f68-839f-df63af59f2f0
    
  2. OCI 콘솔에 로그하여, Load Balancer 화면으로 이동합니다.

  3. 목록중에서 확인한 UID가 이름으로 생성된 Load Balancer가 보일 것입니다. 고정 IP를 할당한 경우, 해당 IP로 찾아도 됩니다.

    image-20231120132433242

  4. 해당 Load Balancer를 클릭하여 상세화면으로 이동합니다.

  5. 왼쪽 아래 Resource > Backend sets 메뉴로 이동합니다.

  6. Backend sets의 상태 또한 Critical 인 걸 볼 수 있습니다.

    image-20231120132711124

  7. Backend set 중 하나를 클릭합니다. 여기서는 TCP-80을 클릭합니다.

  8. 설정된 Backends를 확인합니다. 여기서 Backend는 Worker Node들입니다. 노드 하나쪽만 OK 상태이고 나머지는 Critical 상태인 걸 알 수 있습니다.

    image-20231120132843852

  9. Ingress-nginx pod가 위치한 Worker Node를 조회해 봅니다.

    $ kubectl get pod -n ingress-nginx -o wide
    NAME                                        READY   STATUS      RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
    ingress-nginx-admission-create-kxgrx        0/1     Completed   0          40m   10.244.0.12   10.0.10.97   <none>           <none>
    ingress-nginx-admission-patch-ng5lw         0/1     Completed   1          40m   10.244.0.13   10.0.10.97   <none>           <none>
    ingress-nginx-controller-7d98bbddbd-2rrct   1/1     Running     0          40m   10.244.0.14   10.0.10.97   <none>           <none>
    
  10. 실제 Pod가 위치한 Worker Node(10.0.10.97)만 Health가 OK 상태입니다. 배포한 NGINX Ingress Controller의 deploy.yaml 파일에 다음 설정의 영향입니다. 해당 설정은 Ingress Controller에 접속하는 클라이언트의 IP를, 서비스 애플리케이션 Pod에서도 유지하여, 애플리케이션 Pod에서 로그 등에서 클라이언트를 추적이 필요한 경우 사용됩니다. 아래 Kubernetes 공식 문서의 관련 내용을 참고하세요.

    externalTrafficPolicy: Local
    
    • 출처 - Kubernetes 공식 문서 - 외부 로드 밸런서 생성하기 > Preserving the client source IP

      .spec.externalTrafficPolicy - 이 서비스가 외부 트래픽을 노드-로컬 또는 클러스터-전체 엔드포인트로 라우팅할지 여부를 나타낸다. 두 가지 옵션이 있다. Cluster (기본) 그리고 Local. Cluster 는 클라이언트 소스 IP를 가리고 다른 노드에 대한 두 번째 홉(hop)을 발생시킬 수 있지만, 전체적인 부하 분산에서 이점이 있다. Local 은 클라이언트 소스 IP를 보존하고 LoadBalancerNodePort 타입의 서비스에서 두 번째 홉(hop) 발생을 피할 수 있지만, 트래픽 분산이 불균형적인 잠재적인 위험이 있다.



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 20 Feb 2023