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, 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. 해당 포트를 통해 연결합니다.
자체 서명 인증서를 사용하여 경고가 표시됩니다.


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

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, NGINX Plus Ingress Controller에 대한 더 많은 내용을 공식 한글 문서 페이지에서 확인하세요.
댓글을 달려면 로그인해야 합니다.