자체 TLS 인증서 사용

자체 SSL/TLS 인증서를 사용하도록 Knative serving을 구성하는 방법을 알아봅니다.

또는 Let's Encrypt를 통해 TLS 인증서를 자동으로 만들고 갱신하는 관리형 TLS 인증서 기능을 사용할 수 있습니다.

자체 인증서를 사용하려면 TLS 인증서를 Kubernetes 보안 비밀에 저장한 후 이 보안 비밀을 사용하도록 Cloud Service Mesh의 인그레스 게이트웨이를 구성합니다.

시작하기 전에

  • 이 안내에서는 TLS 인증서가 이미 있다고 가정합니다.
  • 커스텀 도메인을 구성해야 합니다. 자세한 내용은 커스텀 도메인 매핑을 참조하세요.
  • 외부 트래픽을 처리하기 위해 인그레스 게이트웨이를 사용하는 각 Knative serving 서비스를 구성해야 합니다. 이러한 외부에 공개되는 서비스가 TLS 인증서를 사용하도록 구성되지 않으면 서비스는 HTTPS 연결을 확인할 수 없으므로 ready 상태가 될 수 없습니다.

Kubernetes 보안 비밀에 TLS 인증서 저장

인증서를 보안 비밀로 저장하려면 다음 안내를 따르세요.

  1. 터미널을 열고 TLS 인증서가 위치한 디렉터리로 이동합니다.

  2. 다음 명령어를 사용하여 인증서를 저장하는 보안 비밀을 만듭니다.

    kubectl create --namespace INGRESS_NAMESPACE secret tls SECRET_NAME \
      --key PRIVATE_KEY.pem \
      --cert FULL_CHAIN.pem

    다음과 같이 바꿉니다.

    • INGRESS_NAMESPACE를 인그레스 서비스 네임스페이스인 istio-ingressgateway로 바꿉니다. 기본 구성을 사용하여 Cloud Service Mesh를 설치한 경우 istio-system 네임스페이스를 지정합니다.
    • SECRET_NAME을 Kubernetes 보안 비밀에 사용할 이름으로 바꿉니다.
    • PRIVATE_KEY.pem을 인증서 비공개 키가 포함된 파일의 이름으로 바꿉니다.
    • FULL_CHAIN.pem을 공개 인증서가 포함된 파일의 이름으로 바꿉니다.

이제 TLS 인증서용으로 방금 만든 보안 비밀을 사용하도록 인그레스 게이트웨이를 구성할 수 있습니다.

인증서를 사용하도록 인그레스 게이트웨이 구성

TLS 인증서용으로 만든 보안 비밀을 사용하도록 Cloud Service Mesh의 인그레스 게이트웨이를 수정합니다.

  1. 다음 명령어를 실행하여 인그레스 게이트웨이 YAML을 수정 모드로 엽니다.

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving

    기본 인그레스 게이트웨이 구성의 예시는 다음과 같습니다.

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      ...
      # other skipped configuration
      ...
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - '*'
        port:
          name: http
          number: 80
          protocol: HTTP
    
  2. 기존 YAML에 hosts, port, tls 속성을 추가하여 보안 비밀을 사용하도록 인그레스 게이트웨이를 구성합니다.

    • 모든 서비스가 동일한 보안 비밀을 사용하도록 구성하려면: YAML 구성에 다음을 추가하고 "*"hosts 속성 값으로 지정합니다.

      ...
      # other skipped configuration
      ...
      - hosts:
        - "*"
        port:
          name: https
          number: 443
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      SECRET_NAME을 생성된 보안 비밀의 이름으로 바꿉니다.

      예시를 참조하세요.

    • 각 서비스를 개별적으로 구성하려면: YAML 구성에 다음을 추가하고 서비스 이름과 네임스페이스를 사용하여 hosts 속성의 값을 지정합니다.

      각 서비스에 대해 hosts, port, tls 속성 값을 지정합니다.

      ...
      # other skipped configuration
      ...
      - hosts:
        - SERVICE_NAME.SERVICE_NAMESPACE.CUSTOM_DOMAIN
        port:
          number: 443
          name: https-SERVICE_NAME
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      다음과 같이 바꿉니다.

      • SERVICE_NAME를 Knative serving 서비스의 이름으로 바꿉니다. 인그레스 게이트웨이를 사용하여 외부 트래픽을 제공하는 모든 서비스는 개별적으로 구성되어야 합니다.
      • SERVICE_NAMESPACE를 서비스가 실행되는 네임스페이스의 이름으로 바꿉니다.
      • CUSTOM_DOMAIN을 서비스가 사용하도록 구성한 커스텀 도메인으로 바꿉니다.
      • SECRET_NAME을 서비스에 사용할 보안 비밀의 이름으로 바꿉니다. 다양한 TLS 인증서 세트에 여러 보안 비밀을 만든 경우 각 서비스가 사용하는 보안 비밀을 지정할 수 있습니다.

      예시를 참조하세요.

  3. 변경사항을 저장합니다.

이제 HTTPS 프로토콜을 사용하여 배포된 Knative serving 서비스에 액세스할 수 있습니다.

예시

모든 서비스를 구성합니다.

이 예시에서는 TLSsecret 보안 비밀을 사용하도록 모든 서비스를 구성하는 방법을 보여줍니다.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
      - "*"
      port:
        name: http
        number: 80
        protocol: HTTP
    - hosts:
      - "*"
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: TLSsecret
개별 서비스를 구성합니다.

이 예시에서는 인터넷 트래픽을 제공하는 세 가지 서비스를 모두 개별적으로 구성하는 방법을 보여줍니다.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - "*"
    port:
      name: http
      number: 80
      protocol: HTTP
  - hosts:
    - prodservice.prodnamespace.my-custom-domain.com
    port:
      number: 443
      name: https-prodservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - experiment.namespace.my-custom-domain.com
    port:
      number: 443
      name: https-experiment
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - fallbackservice.anothernamespace.my-custom-domain.com
    port:
      number: 443
      name: https-fallbackservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: anotherTLSsecret