Dev / App

K8s Network - Ingress HTTPS (self-signed)

K8s Network

3 min read
K8s Network - Ingress HTTPS (self-signed)

Ingress https

https 프로토콜을 통한 통신은 선택이 아닌 필수가 되었습니다.
K8s를 통한 서비스를 구성할 때도 예외는 아니며, ingress 리소스 생성 시, tls 필드를 구성하면 http > https로 설정이 가능합니다.

ingress https 동작 흐름 - TLS 종료

외부에서 ingress controller pod로 요청을 보내고, 받을 때까지 https 통신을 하며,
ingress controller pod에서 백엔드까지는 http 통신을 합니다.

인증서 생성

helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.service.type=NodePort \
  --set controller.service.nodePorts.http=32080 \
  --set controller.service.nodePorts.https=32443

인증서가 적용될 도메인을 지정하고, 인증서 및 키를 생성합니다.

DOMAIN="https.test.com"
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=$DOMAIN/O=$DOMAIN"

생성된 내용을 토대로 tls 타입의 K8s Secret 오브젝트로 생성합니다.

kubectl create secret tls my-tls-secret \
--cert=tls.crt \
--key=tls.key
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  tls:
  - hosts:
      - https.test.com
    secretName: my-tls-secret
  rules:
    - host: https.test.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  number: 80
curl 테스트할 호스트에, 아래와 같이 도메인 <> IP 매치가 필요합니다.
echo "공인IP https.test.com" | sudo tee -a /etc/hosts
curl 테스트 시, tls handshake 과정이 발생하는 것을 확인 가능하며,
curl -vk https://https.test.com:32443/
https.test.com 도메인에 self-signed 인증서가 적용됨을 알 수 있습니다.

nginx도 정상적으로 호출됩니다.

Share This Post

Check out these related posts

개발팀의 애자일 도입 이야기2

개발팀의 애자일 도입 이야기 1

Lambda@Edge 고급 로깅 제어 기능