본문 바로가기

DevOps/쿠버네티스(Kubernetes)

[쿠버네티스 #7] Kubernetes ingress를 이용한 tls 적용 (let's encrypt)

728x90

오랜만입니다. 반갑습니다.

 

오늘은 쿠버네티스 환경에 tls를 한 번 적용시켜보겠습니다. 

 

ssl(sercure socket layer)/tls(transport layer security)에 대한 기본 지식을 어느정도 알고 있으면 좋을 거 같습니다. 

 

본 예제에서는 인증서 발급으로 let's encrypt를 사용하였습니다. 

 

기본적으로 let' encrypt를 이용한 인증서 발급에는 세 가지 방법이 있습니다.

standalon, webroot, dns 

본 예제에서는 webroot를 이용한 방법으로 테스트하였습니다.

 

기본적으로 webroot를 이용한 인증서 발급에는 다음 그림과 같은 순서로 이루어집니다.

 

 

webroot를 이용한 인증서 발급 방식

1. 웹서버에서 let's encyrpt에 사용할 도메인에 대한 인증을 요청하고

2. let's encrypt에서는 해당 도메인에 대한 접속 가능 여부를 판단하여 인증서를 발급합니다.

3. 우리는 이 인증서를 바탕으로 웹 서버에 내용을 수정하는 것으로 https 접속이 가능하게 합니다.

 

 

이게 기본적인 인증서 발급 방식인데 

 

kubernetes에서는 위 처럼 발급 받기가 애매합니다. (pod안에서 웹서버가 돌아갈테니까.. ) 

 

따라서 우리는 별도의 웹 서버를 따로 띄워놓고 도메인에 대한 인증서만 발급 받은 뒤 이 인증서를 쿠버네티스에 적용시키는 방법을 택할 겁니다.

 

 

우선 별도의 인증서를 받기 위해 apache 이미지를 서버에 띄웁니다.

 

https://hub.docker.com/_/httpd

 

httpd - Docker Hub

Supported tags and respective Dockerfile links Quick reference Where to get help:the Docker Community Forums, the Docker Community Slack, or Stack Overflow Where to file issues:https://github.com/docker-library/httpd/issues Maintained by:the Docker Communi

hub.docker.com

사용된 이미지는 해당 이미지입니다.

 

 

-------------------20.09.28 수정사항--------------

 

기존 httpd 이미지 실행 명령어가 안먹힌다는것을 깨달았습니다. 왜인지는 모르겠지만 볼륨을 바꿔줘야하네요 

$ docker run -dit --name <컨테이너병> -p 8083:80 -p 8084:443 -v "$PWD":/usr/local/apache2/htdocs/ httpd:latest

 

20.10.05 추가 주의사항

포트포워딩에 대해서 놓친사항이있습니다. 렛츠인크립트는 무조건적으로 <도메인>:80 :443으로 접근이되기때문에 이 점 유의하셔야합니다. 

 

----------------------------------------------------

 

 

포트포워딩은 80과 443 두 개를 해줘야합니다. 

 

컨테이너 안으로 들어갑시다.

 

$ docker exec –ti <컨테이너명> /bin/bash

 

이제 컨테이너 안에서 인증서를 발급받읍시다.

 

certbot 설치
$
sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot

인증서 발급
certbot certonly --webroot -w /usr/local/apache2/htdocs -d <도메인명>

이메일 입력 등이 뜨는데 대충 입력해 줍시다.

 

이렇게 성공하게되면 /etc/letsencrypt 디렉토리가 생깁니다.

 

해당 디렉토리를 컨테이너 밖으로 옮겨줍시다.

 

크게 두 가지 방법이 있는데 그냥 github 레포하나를 만들어서 옮기거나 볼륨공유를 통해 옮기는 것을 추천합니다.

 

자 이제 인증서가 발급됐으니 거의 끝났습니다. 쿠버네티스에 적용하는 일만 남았어요

 

대략 해당 그림처럼 적용이 되는데 인증서를 통해 secret을 만들어줘야합니다.

 

 

시크릿 생성
kubectl
create secret tls <secret이름> \
--key letsencrypt/live/<도메인>/privkey.pem \
--cert letsencrypt/live/<도메인>/fullchain.pem \
-n <네임스페이스>

옮긴 letsencrypt 폴더에서 키경로를 찾아서 명령어를 입력해 줍시다.

 

생성된 시크릿

자 시크릿이 생성되었으면 ingress.yaml파일을 편집해 줍시다.

 

apiVersion: networking.k8s.io/v1beta1

kind: Ingress

metadata:

  name: service-loadbalancing

  namespace: ingress-nginx

spec:

  rules:

  - host: <도메인 이름>

    http:

      paths:

        - path: /

          backend:

            serviceName: <이미지>

            servicePort: 9000

        - path: /index

          backend:

            serviceName: <이미지>

            servicePort: 9001

  tls:

  - hosts:

    - <도메인 이름>

    secretName: nginx-tls2

 

ingress.yaml을 배포해줍시다.

 

kubectl apply -f ingress.yaml

 

자 해당 도메인으로 접속해보면 깔끔하게 https로 접속이 되는 것을 확인할 수 있습니다.

반응형