1.2.2.2.5 NGINX Ingress Controller에서 TLS termination(OCI LB 레벨)
SSL 인증서를 secret으로 등록하기
유료 인증서도 등록절차는 동일하니, 여기서는 무료 인증서를 발급 받아 진행합니다.
SSL For Free를 사용하는 경우
-
SSL 인증서를 발급받습니다.
-
압축파일을 풀면 다음 세가지 파일이 포함되어 있습니다.
-
kubectl 사용이 가능한 Cloud Shell 또는 작업환경에 접속합니다.
-
발급받은 인증서 Zip 파일을 업로드 하고, 압축을 해제합니다.
-
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를 사용하는 경우
-
SSL 인증서를 발급받습니다.
-
아래와 같이 생성된 인증서를 볼 수 있습니다.
$ 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
-
kubectl 사용이 가능한 Cloud Shell 또는 작업환경에 접속합니다.
-
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
-
생성결과를 확인합니다.
$ kubectl get secret -n ingress-nginx NAME TYPE DATA AGE ssl-certificate-secret-thekoguryo.xyz kubernetes.io/tls 2 6s
Ingress Controller 설치
-
kubectl 사용이 가능한 Cloud Shell 또는 작업환경에 접속합니다.
-
nginx ingress controller 설치할 파일 deploy.yaml을 다운로드 받습니다.
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.5/deploy/static/provider/cloud/deploy.yaml
-
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 하위에 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: ... 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 ...
-
-
다음 명령으로 NGINX Ingress Controller를 설치합니다.
kubectl apply -f deploy.yaml
-
설치 확인
kubectl get all -n ingress-nginx
-
OCI 콘솔에 로그인합니다.
-
좌측 상단 햄버거 메뉴에서 Networking > Load Balancers로 이동합니다.
-
IP 주소를 통해 ingress controller와 연동된 Load Balancer를 확인후 클릭합니다.
-
생성된 OCI Load Balancer의 Listeners를 확인합니다.
- 프로토콜이 HTTP(80), HTTPS(443)으로 설정되고 HTTPS에는 SSL 인증서가 등록된 것을 볼 수 있습니다.
DNS 등록
-
발급한 SSL 인증서가 와일드카드 인증서가 아닌, 단일 인증서라 편의상 도메인 구입 사이트에서 직접 등록하겠습니다.
-
도메인을 구입한 사이트로 이동합니다.
-
DNS 관리화면에서 A 타입으로 ingress controller의 Public IP를 등록합니다.
-
글로벌하게 DNS 정보가 업데이트되는 것은 시간이 걸릴 수 있습니다.
테스트
-
이전 테스트 앱을 아래 yaml 파일로 일부 수정하여 배포합니다.
-
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
-
https 로 애플리케이션을 접속합니다. 인증서 오류없이 HTTPS로 연결되는 것을 볼 수 있습니다.
-
인증서가 유효한지 확인합니다. 발급한 SSL 인증서가 정상 등록된 것을 알 수 있습니다.
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.