본문 바로가기

8/26 Nexters 9주차 : HTTPS 적용

구글 OAuth2.0 로그인을 대외로 오픈하기 위해서는 https 적용이 된 호스트 URL이 필요했다.

따라서 어제 부랴부랴 SSL 인증서를 구입하고 Nginx에 작성하는 시간을 가졌다.

 

nginx.conf

 

 

nginx.conf에 ssl 적용은 nginx 설치 후 default.conf에 가이드되어 있어서 쉽게 적용할 수 있었다. 😊

9번째 줄에서 http로 접근했을 때 https로 리디렉션하는것을 잊지 말자.

 

k8s 배포

ssl이 설정된 nginx를 이미지로 재빌드하여 Pod를 재생성해야한다.

필자가 선택한 방법은 ssl 인증서(.pem 파일들)들을 Secret으로 생성하고 이를 Deployment에서 volumeMount로 주는 것이다.

 

Secret 생성

kubectl create secret generic nginx-ssl --from-file=./certs

 

정상적으로 생성되었다면 조회 시 아래처럼 Secret이 생성되었음을 볼 수 있다.

 

Configmap 설정

현재 프로젝트에 dev와 production 환경을 분리했다. 필자가 구매한 ssl 인증서는 Wildcard*가 아니라서 production 환경에서만 SSL이 적용되어있다. 따라서 nginx.conf 파일도 두 개가 나오게 되어서 환경에 따라 다른 nginx 이미지로 Pod를 생성해야 한다.

* www.*.example.com 하위 도메인까지 https를 적용할 수 있는 SSL 타입

 

그래서 운영용 nginx.conf로 Configmap을 따로 생성했다.

 kubectl create configmap nginx-ssl-conf --from-file=configs/nginx.conf --from-file=configs/variable.conf

 

Deployment 수정

이제 위에서 생성한 Secret과 Configmap을 Pod의 Volume으로 마운트한다.

 

 

 

 

Service에 Port 추가

이제 Service에서 443 포트를 로드밸런서 443 Port에 연결한다.

 

 

 

 

재배포

이미지를 재빌드하여 docker registry에 push했다면 helm upgrade 로 Pod를 재생성하여 https로 접속해본다.

 

잘 적용되었다 😊

 

정리

사실 nginx ssl 적용 건과 관련하여 구글링할 때 많이들 권장하는 방법이 따로 있었다. 

바로 Nginx Ingress Controller 를 사용하는 방법이다.

 

Ingress

클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리함.

인그레스는 부하 분산, SSL 종료, 명칭 기반의 가상 호스팅을 제공할 수 있다. (출처: k8s 공식문서)

 

nginx-ingress 같은 인그레스 컨트롤러는 애노테이션을 이용해서 nginx에서 필요한 설정들을 사용자가 지정해 줄 수 있습니다.
출처: 쿠버네티스 라벨과 애노테이션(kubernetes label, annotation)

 

정석대로라면 Service와 Deployment에서 처리하는게 아니라 Ingress에서 처리하는것 같은데 아직 공부가 부족하여 ㅠㅠ

정확한 설정 방법을 파악하지 못했다. 이후의 개선 리스트로 잡고 차차 개선해나가야겠다.

 

 

참고문서