istio와 함께하는 SSL 적용

Ericamoyed·2022년 5월 3일
3

개발한장

목록 보기
18/22

나같은 경우는 이미 SSL 인증서를 한국정보인증? 에서 발급받아서 cert 및 .pem 파일들이 모두 있는 케이스였다.

찾아보니 뭐 다양하다. SSL 인증서가 기존에 없어서 cert-manager라는 걸 활용해서 하는 경우도 있고.. 그리고 istio 미사용에 그냥 kubernetes ingress를 활용하는 경우도 있고..

그래서 내가 정리하려고 한다.

나는 한 클러스터에서 운용해야하는 인증서가 하나가 아니라서 하기 두 링크를 참고했다.

스펙

  • 이미 있는 인증서 + kubernetes ingress 미사용 + istio ingressgateway 사용

방법

  1. 로컬에 있는 인증서 서버로 옮기기.
    다양한 방식이 있겠지만 나는 주로 scp를 이용한다.
    scp -r {fileNameA} {userName}@{serverHost}:{yourDirectory}/{fileNameA}

  2. 인증서 기반으로 secret 만들기. 나는 하나만 할게 아니라서 istio-ingressgateway-certs가 아니라 중간에 서비스명을 끼워넣은걸로 만들었다.

 kubectl create secret tls istio-ingressgateway-{serviceName}-certs --key {yourKeyFileName}.pem --cert {yourCertFileName}.pem 
  • 이 때 keyFile에는 passphrase가 안걸려있어야한다. 있으면 decrypt된애로 secret을 생성해주자.
openssl rsa -in <encrypted_private.key>  -out <decrypted_private.key>
  • kubectl get secret을 통해 진짜 생겼는지 함 확인해봅시다.
  1. 아까 말한것처럼 secret 명이 일반적인 istio-ingressgateway-certs 가 아니다. 따라서 나의 커스터마이징된 secret 명을 ingressgateway deployment가 알아들을수 있도록 patch해줘야한다.
  • 공식문서에는 patch.json 만들어서 command에서 적용해주는데.. 난 이상하게 계속 Illegal Argument가 떠서 그냥 간다.
  • patch.json 작성
[{
  "op": "add",
  "path": "/spec/template/spec/containers/0/volumeMounts/0",
  "value": {
    "mountPath": "/etc/istio/ingressgateway-{serviceName}-certs",
    "name": "ingressgateway-{serviceName}-certs",
    "readOnly": true
  }
},
{
  "op": "add",
  "path": "/spec/template/spec/volumes/0",
  "value": {
  "name": "ingressgateway-{serviceName}-certs",
    "secret": {
      "secretName": "istio-ingressgateway-{serviceName}-certs",
      "optional": true
    }
  }
}]

그리고 얘를 데려다가 주소창에 복붙해서 일렬로 만들고..
kubectl patch --type=json deploy istio-ingressgateway -p '{여기}'
여기에 넣어준다.
오호. 그러면 patch 끝! 이라고 나온다.

  1. 이제 gateway 설정을 해줘야한다. 우리 443 포트도 열여야지 https가 들어오지 않겠는가. 기존엔 이렇게 돼있다.
spec:
  servers:
  - hosts:
    - {Domain1}
    - {Domain2}
    - {Domain3}
    port:
      name: http
      number: 80
      protocol: HTTP

이제 우리는 여기에 https라는 애도 gw에서 받아주도록 바꿔줄거다.

spec:
  servers:
  - hosts:
    - {Domain1}
    - {Domain2}
    - {Domain3}
    port:
      name: http
      number: 80
      protocol: HTTP
  - hosts:
    - {Domain2}
    port:
      name: https
      number: 443
      protocol: HTTPS
    tls:
      mode: SIMPLE
      privateKey: /etc/istio/ingressgateway-{serviceName}-certs/tls.key
      serverCertificate: /etc/istio/ingressgateway-{serviceName}-certs/tls.crt
  • Domain2에 대해서 발급된 인증서라 hosts 에 Domain2만 넣어줬다. Domain2에 대해서는 이제 http, https 접근 모두 가능해지는 것이다!
  1. 그러면 끝이당 https 접근이 가능해졌다!

자문자답 Q&A

  • gateway만 설정하면 되나요..? virtualservice도 해야할거같은데 !!
    • 기존에 virtualService.destinationRule 설정 부분의 param이 http라.. 얘도 https로 바꿔야하지 않나? 의심이 들수 있겠지만 !
spec:
  hosts:
    - {Domain1}
  gateways:
    - {Gateway}
  http: <- 요기 !
    - route:
        - destination:
            host: {Host}
            subset: {subset}
          weight: 100
  • https://istio.io/latest/docs/reference/config/networking/virtual-service/#VirtualService
  • 요 링크 http 부분을 참고해보면
    HTTP routes will be applied to
    platform service ports named ‘http-’/‘http2-’/‘grpc-*’,
    gateway ports with protocol HTTP/HTTP2/GRPC/ TLS-terminated-HTTPS 
    and service entry ports using HTTP/HTTP2/GRPC protocols.
    TLS-terminated-HTTPS 도 http에 설정된 라우팅 룰을 타므로 걱정 안해도 된다 =)

참고

https://istio.io/v1.3/docs/tasks/traffic-management/ingress/secure-ingress-mount/
https://support.f5.com/csp/article/K94561586

profile
꿈많은 개발자, 일상 기록을 곁들인

0개의 댓글