NGINX Ingress Controller SSL/TLS 구성 튜토리얼

이 포스트에서는 Kubernetes 클러스터에 배포 중인 NGINX Ingress Controller 에 SSL/TLS 설정을 하는 방법을 설명합니다.

목차

1. NGINX Ingress Controller SSL/TLS
2. 자체 서명 인증서로 SSL/TLS구성

3. 유효한 인증서로 SSL/TLS 구성

1. NGINX Ingress Controller SSL/TLS

NGINX Ingress Controller SSL/TLS secure

NGINX Ingress Controller, NGINX Plus Ingress Controller는 SSL/TLS 설정을 통해 보안을 강화할 수 있습니다. SSL/TLS 설정을 통해 데이터를 암호화하여 통신의 안전을 보장하고 웹 사이트의 신뢰도를 향상시킬 수 있습니다. NGINX Ingress Controller의 Ingress를 통한 SSL/TLS 연결은 443번 포트를 통해 지원됩니다.

NGINX Ingress Controller의 SSL/TLS 설정을 위해서는 Ingress 설정을 적용할 도메인에 대한 인증서 파일(cert, key)이 필요합니다. 인증서 파일은 공인 인증 기관(Certificate Authority/CA)에서 인증서를 구입하거나 Let’s Encrypt와 같은 무료 SSL/TLS 인증서 발급 기관을 사용할 수 있습니다.
인증서 파일을 통해 kubernetes 클러스터에 시크릿을 생성하고, Ingress 파일에 해당 시크릿을 적용시켜 SSL/TLS 설정을 구성할 수 있습니다.

2. 자체 서명 인증서 사용하여 SSL/TLS 구성

SSL/TLS 설정을 테스트하기 위해 자체 서명 인증서를 생성하고, SSL/TLS 구성을 하겠습니다.
NGINX Ingress Controller와 Ingress를 통해 연결될 파드/서비스는 사전에 구성했습니다.

1. openssl 명령어를 통해 자체 서명 인증서를 생성합니다.

# openssl req -x509 -nodes -days <유효기간> -newkey rsa:2048 -keyout <key 파일 이름> -out <cert 파일 이름>
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Test
Organizational Unit Name (eg, section) []:Test cert
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:example@example.com

2. 생성한 파일을 통해 TLS 시크릿을 생성합니다.

# kubectl create secret tls <시크릿 이름> --key <key 파일> --cert <cert 파일>
# kubectl create secret tls test-secret --key tls.key --cert tls.crt

3. 생성한 시크릿을 확인합니다.

# k get secret
NAME          TYPE                DATA   AGE
test-secret   kubernetes.io/tls   2      10s

4. 생성한 시크릿을 적용할 Ingress 파일을 작성하고, 배포합니다.
tls 항목을 작성하여 SSL/TLS 설정을 적용할 주소와, 설정에 적용할 시크릿을 지정합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  name: ingress-tls
spec:
  tls:                                   # tls 설정
  - hosts:
    - example.com
    secretName: test-secret              # 생성한 시크릿 이름 지정
  rules:
  - host: example.com
    http:
      paths:
        - path: /backend1
          pathType: Prefix
          backend:
            service:
              name: backend1-svc
              port:
                number: 80
        - path: /backend2
          pathType: Prefix
          backend:
            service:
              name: backend2-svc
              port:
                number: 80

5. 배포한 Ingress를 확인합니다. 443번 포트가 설정된 것을 확인할 수 있습니다.

# k get ingress

NAME          CLASS    HOSTS         ADDRESS   PORTS     AGE
ingress-tls   <none>   example.com             80, 443   3s

6. TLS 연결을 위해 사전에 배포된 Ingress Controller의 서비스를 확인합니다.
443번 포트는 32253번 포트를 통해 노출된 것을 확인할 수 있습니다.

k get svc -n nginx-ingress

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                             AGE
nginx-ingress   NodePort   10.102.97.200   <none>        80:30348/TCP,443:32253/TCP,8080:30575/TCP,9113:32200/TCP   13d

7. 해당 포트를 통해 연결합니다.

자체 서명 인증서를 사용하여 경고가 표시됩니다.

NGINX Ingress Controller SSL/TLS 연결

인증서 확인 시 인증서 생성 시 입력한 값을 확인할 수 있습니다.

3. 유효한 인증서 사용하여 SSL/TLS 구성

1. 유효한 인증서 파일로 TLS 시크릿을 생성합니다. Certbot(Let’s Encrypt)을 통해 사전에 발급한 유효한 인증서를 사용했습니다.

# kubectl create secret tls <시크릿 이름> --key <key 파일> --cert <cert 파일>
# kubectl create secret tls dev-secret --key privkey.pem --cert cert.pem

2. 생성한 시크릿을 확인합니다.

# k get secret 

NAME          TYPE                DATA   AGE
dev-secret    kubernetes.io/tls   2      29m

3. 생성한 시크릿을 적용할 Ingress 파일을 작성하고, 배포합니다.
tls 항목을 작성하여 SSL/TLS 설정을 적용할 주소와, 설정에 적용할 시크릿을 지정합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
  name: ingress-devops
spec:
  tls:
  - hosts:
    - devopssong.nginxstore.kr
    secretName: dev-secret
  rules:
  - host: devopssong.nginxstore.kr
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: backend2-svc
              port:
                number: 80

4. 배포한 Ingress를 확인합니다. 443번 포트가 설정된 것을 확인할 수 있습니다.

# k get ingress

NAME             CLASS    HOSTS                      ADDRESS   PORTS     AGE
ingress-devops   <none>   devopssong.nginxstore.kr             80, 443   3s

5. TLS 연결을 위해 사전에 배포된 Ingress Controller의 서비스를 확인합니다.
443번 포트는 32253번 포트를 통해 노출된 것을 확인할 수 있습니다.

# k get svc -n nginx-ingress

NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                             AGE
nginx-ingress   NodePort   10.102.97.200   <none>        80:30348/TCP,443:32253/TCP,8080:30575/TCP,9113:32200/TCP   13d

6. 해당 포트를 통해 연결합니다. 자체 서명 인증서와 다르게 경고가 표시되지 않습니다.

NGINX Ingress Controller SSL/TLS 연결

인증서 정보를 확인할 수 있습니다.

NGINX Ingress Controller, NGINX Plus Ingress Controller에 대한 더 많은 내용을 공식 한글 문서 페이지에서 확인하세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required