TheKoguryo's 기술 블로그

 Version 2024.04.01
1.2.2.2.5 NGINX Ingress Controller에서 TLS termination(OCI LB 레벨)
SSL 인증서를 secret으로 등록하기

유료 인증서도 등록절차는 동일하니, 여기서는 무료 인증서를 발급 받아 진행합니다.

SSL For Free를 사용하는 경우

  1. SSL 인증서를 발급받습니다.

  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
    

Let’s Encrypt를 사용하는 경우

  1. SSL 인증서를 발급받습니다.

  2. 아래와 같이 생성된 인증서를 볼 수 있습니다.

    $ ls -la /home/opc/.acme.sh/thekoguryo.xyz
    total 32
    drwxrwxr-x. 2 opc opc  177 Jan 19 06:24 .
    drwx------. 7 opc opc  153 Jan 19 06:24 ..
    -rw-rw-r--. 1 opc opc 3751 Jan 19 06:24 ca.cer
    -rw-rw-r--. 1 opc opc 5536 Jan 19 06:24 fullchain.cer
    -rw-rw-r--. 1 opc opc 1785 Jan 19 06:24 thekoguryo.xyz.cer
    -rw-rw-r--. 1 opc opc  618 Jan 19 06:24 thekoguryo.xyz.conf
    -rw-rw-r--. 1 opc opc 1025 Jan 19 06:24 thekoguryo.xyz.csr
    -rw-rw-r--. 1 opc opc  208 Jan 19 06:24 thekoguryo.xyz.csr.conf
    -rw-------. 1 opc opc 1679 Jan 19 06:24 thekoguryo.xyz.key
    
  3. kubectl 사용이 가능한 Cloud Shell 또는 작업환경에 접속합니다.

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

    kubectl create namespace ingress-nginx
    kubectl create secret tls ssl-certificate-secret-thekoguryo.xyz --key thekoguryo.xyz.key --cert thekoguryo.xyz.cer -n ingress-nginx
    
  5. 생성결과를 확인합니다.

    $ kubectl get secret -n ingress-nginx
    NAME                                    TYPE                DATA   AGE
    ssl-certificate-secret-thekoguryo.xyz   kubernetes.io/tls   2      6s
    
Ingress Controller 설치
  1. kubectl 사용이 가능한 Cloud Shell 또는 작업환경에 접속합니다.

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

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

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

      • oci.oraclecloud.com/load-balancer-type: "lb" 을 추가하여 OCI Load Balancer를 사용하고 관련 설정을 추가합니다.
      • service.beta.kubernetes.io/oci-load-balancer-backend-protocol: "HTTP" Listener를 HTTP 프로토콜은 지정합니다.
      • SSL 포트와 SSL 인증서를 등록해 줍니다.
    • spec.ports 하위에 httpstargetPorthttp로 변경합니다.

      ---
      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:
        ...
        ports:
        - appProtocol: http
          name: http
          port: 80
          protocol: TCP
          targetPort: http
        - appProtocol: https
          name: https
          port: 443
          protocol: TCP
          targetPort: http
        ...
        type: LoadBalancer      
        loadBalancerIP: 152.69.234.225 # Reserved Public IP
      ...
      
    • 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 기반 테스트앱 설치

    • SSL 인증서 검증을 위해 host에 도메인명을 입력합니다.

      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-20240119210028591

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

    image-20240119210125708

    image-20240119210216190



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

Last updated on 18 Jan 2024