TheKoguryo's 기술 블로그

 Version 2023.11.20

4.1.5.2 NGINX Ingress Controller에서 TLS termination(OCI LB 레벨)

NGINX Ingress Controller 설치

SSL 인증서를 secret으로 등록하기
  1. SSL 인증서를 발급받습니다. 여기서는 Self-Signed 인증서가 아닌 무료 인증서를 사용하겠습니다.

  2. 압축파일을 풀면 다음 세가지 파일이 포함되어 있습니다.

    image-20230228193616137

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

  4. 발급받은 인증서 Zip 파일을 업로드 하고, 압축을 해제합니다.

  5. ingress가 설치될 namespace에 인증서 파일을 이용하여, secret을 만듭니다.

    kubectl create namespace ingress-nginx
    kubectl create secret tls ssl-certificate-secret-thekoguryo.xyz --key private.key --cert certificate.crt -n ingress-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 들을 추가합니다.

      • SSL 포트와 SSL 인증서를 등록해 줍니다.
      • WAF, WAA 등도 동작을 위해 OCI Load Balancer 유형으로 하고, Listener를 HTTP 프로토콜은 지정합니다.
    • spec.ports 하위에 https의 targetPort를 http로 변경합니다.

      ---
      apiVersion: v1
      kind: Service
      metadata:
        labels:
          ...
        name: ingress-nginx-controller
        namespace: ingress-nginx
        annotations:
          oci.oraclecloud.com/load-balancer-type: "lb"
          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"
          service.beta.kubernetes.io/oci-load-balancer-backend-protocol: "HTTP"
          service.beta.kubernetes.io/oci-load-balancer-ssl-ports: "443"
          service.beta.kubernetes.io/oci-load-balancer-tls-secret: ssl-certificate-secret-thekoguryo.xyz    
      spec:
        loadBalancerIP: 152.69.xxx.xxx
        ...
        ports:
        - appProtocol: http
          name: http
          port: 80
          protocol: TCP
          targetPort: http
        - appProtocol: https
          name: https
          port: 443
          protocol: TCP
          targetPort: http
        ...
        type: LoadBalancer      
      ...
      
    • OCI Load Balancer의 설정가능한 annotations 전체 항목

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

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

    kubectl get all -n ingress-nginx
    
  6. OCI 콘솔에 로그인합니다.

  7. 좌측 상단 햄버거 메뉴에서 Networking > Load Balancers로 이동합니다.

  8. IP 주소를 통해 ingress controller와 연동된 Load Balancer를 확인후 클릭합니다.

  9. 생성된 OCI Load Balancer의 Listeners를 확인합니다.

    • 프로토콜이 HTTP(80), HTTPS(443)으로 설정되고 HTTPS에는 SSL 인증서가 등록된 것을 볼 수 있습니다.

    image-20230702215429379

DNS 등록
  1. 발급한 SSL 인증서가 와일드카드 인증서가 아닌, 단일 인증서라 편의상 도메인 구입 사이트에서 직접 등록하겠습니다.

  2. 도메인을 구입한 사이트로 이동합니다.

  3. DNS 관리화면에서 A 타입으로 ingress controller의 Public IP를 등록합니다.

    image-20230228204901502

  4. 글로벌하게 DNS 정보가 업데이트되는 것은 시간이 걸릴 수 있습니다.

테스트
  1. 이전 테스트 앱을 아래 yaml 파일로 일부 수정하여 배포합니다.

    • 4.1.2 Path 기반 테스트앱 설치

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress-path-basic
      spec:
        ingressClassName: nginx
        rules:
        - host: www.thekoguryo.xyz
          http:
            paths:
            - path: /blue
              pathType: Prefix
              backend:
                service:
                  name: nginx-blue-svc
                  port:
                    number: 80
            - path: /green
              pathType: Prefix
              backend:
                service:
                  name: nginx-green-svc
                  port:
                    number: 80
      
  2. https 로 애플리케이션을 접속합니다. 인증서 오류없이 HTTPS로 연결되는 것을 볼 수 있습니다.

    image-20230228205332782

  3. 인증서가 유효한지 확인합니다. 발급한 SSL 인증서가 정상 등록된 것을 알 수 있습니다.

    image-20230228205600566

    image-20230228205619609



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

Last updated on 28 Feb 2023