Ingress Controller TLS 적용
Ingress Controller 를 활용한 웹서비스에 TLS 를 적용하는 방법 중 가장 쉬운 방법은 Ingress Controller 에 TLS 를 적용하는 방법입니다. 이 방법은 client 와 Ingress Controller 까지 https 로 통신하고 Ingress Controller 와 web server 와는 http 로 통신하게 됩니다.
아래의 방법은 Ingress Controller 는 미리 설치되어 있다고 가정합니다.
먼저, letsencrypt 로 접속하여 3개월간 무료로 인증서를 받는 방법을 알아봅니다.
1. 필요 패키지 설치 (Ubuntu 16.04 기준)
# apt-get update
# apt-get install software-properties-common
# add-apt-repository universe
# sudo add-apt-repository ppa:certbot/certbot
# sudo apt-get update
# sudo apt-get install certbot python-certbot-nginx
2. 인증서 다운로드
중요한 것은 인터넷에서 해당 도메인으로 로컬 서버에 접속이 되어야 하며 (Inbound 가능) standalone 을 사용할 때 로컬에 80 포트는 unbind 되어 있어야 합니다. 아래와 같은 경우는 외부에서 cloudnativeday.kr, www.cloudnativeday.kr, test.cloudnativeday.kr 도메인이 갖는 ip address 가 내 로컬 서버여야 한다는 의미입니다. 정확히는 해당 ip address 로 외부에서 내 서버로 연결이 가능해야 합니다.
# certbot certonly --standalone --cert-name cloudnativeday.kr -d cloudnativeday.kr,www.cloudnativeday.kr,test.cloudnativeday.kr
인증서 발급이 완료되면 다음과 같은 디렉토리에 인증서가 생성되어 보입니다. archive 디렉토리와 심볼릭 링크가 있는 live 디렉토리가 있는데 live 디렉토리를 활용합니다. 그리고, crt 는 fullchain.pem 을, key 는 private.pem 을 사용합니다.
# ls -al /etc/letsencrypt/archive/cloudnativeday.kr/
total 24
drwxr-xr-x 2 root root 4096 Apr 7 21:31 .
drwx------ 3 root root 4096 Apr 7 21:31 ..
-rw-r--r-- 1 root root 1931 Apr 7 21:31 cert1.pem
-rw-r--r-- 1 root root 1647 Apr 7 21:31 chain1.pem
-rw-r--r-- 1 root root 3578 Apr 7 21:31 fullchain1.pem
-rw------- 1 root root 1704 Apr 7 21:31 privkey1.pem
# ls -al /etc/letsencrypt/live/cloudnativeday.kr/
total 12
drwxr-xr-x 2 root root 4096 Apr 7 21:31 .
drwx------ 3 root root 4096 Apr 7 21:31 ..
lrwxrwxrwx 1 root root 41 Apr 7 21:31 cert.pem -> ../../archive/cloudnativeday.kr/cert1.pem
lrwxrwxrwx 1 root root 42 Apr 7 21:31 chain.pem -> ../../archive/cloudnativeday.kr/chain1.pem
lrwxrwxrwx 1 root root 46 Apr 7 21:31 fullchain.pem -> ../../archive/cloudnativeday.kr/fullchain1.pem
lrwxrwxrwx 1 root root 44 Apr 7 21:31 privkey.pem -> ../../archive/cloudnativeday.kr/privkey1.pem
-rw-r--r-- 1 root root 692 Apr 7 21:31 README
인증서를 성공적으로 생성하고 나면, Ingress Controller 에서 사용하기위해서 인증서를 secret tls 타입으로 생성합니다.
3. secret tls 생성
# kubectl create secret tls cloudnativeday-certs --key /etc/letsencrypt/live/cloudnativeday.kr/privkey.pem --cert /etc/letsencrypt/live/cloudnativeday.kr/fullchain.pem --namespace cloudnative
타입은 secret tls 로 하고, key 는 private.pem 을, cert 는 fullchain.pem 을 사용합니다.
4. tls ingress 생성
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: cloudnative-kr
namespace: cloudnative
spec:
tls:
- secretName: cloudnativeday-certs
hosts:
- cloudnativeday.kr
- www.cloudnativeday.kr
rules:
- host: cloudnativeday.kr
http:
paths:
- backend:
serviceName: nginx-cloudnative
servicePort: 80
path: /
- host: www.cloudnativeday.kr
http:
paths:
- backend:
serviceName: nginx-cloudnative
servicePort: 80
path: /
http 로 들어오면 자동으로 https 로 redirect 됩니다. 왜냐하면 기본 값이 nginx.ingress.kubernetes.io/ssl-redirect: "true" 이기 때문입니다. 일반 http 와 다른 부분은 tls 부분입니다. secret 과 인증서가 적용될 도메인명을 적으면 됩니다.