자체 SSL/TLS 인증서를 사용하도록 Knative serving을 구성하는 방법을 알아봅니다.
또는 Let's Encrypt를 통해 TLS 인증서를 자동으로 만들고 갱신하는 관리형 TLS 인증서 기능을 사용할 수 있습니다.
자체 인증서를 사용하려면 TLS 인증서를 Kubernetes 보안 비밀에 저장한 후 이 보안 비밀을 사용하도록 Cloud Service Mesh의 인그레스 게이트웨이를 구성합니다.
시작하기 전에
- 이 안내에서는 TLS 인증서가 이미 있다고 가정합니다.
- 커스텀 도메인을 구성해야 합니다. 자세한 내용은 커스텀 도메인 매핑을 참조하세요.
- 외부 트래픽을 처리하기 위해 인그레스 게이트웨이를 사용하는 각 Knative serving 서비스를 구성해야 합니다. 이러한 외부에 공개되는 서비스가 TLS 인증서를 사용하도록 구성되지 않으면 서비스는 HTTPS 연결을 확인할 수 없으므로
ready
상태가 될 수 없습니다.
Kubernetes 보안 비밀에 TLS 인증서 저장
인증서를 보안 비밀로 저장하려면 다음 안내를 따르세요.
터미널을 열고 TLS 인증서가 위치한 디렉터리로 이동합니다.
다음 명령어를 사용하여 인증서를 저장하는 보안 비밀을 만듭니다.
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을 공개 인증서가 포함된 파일의 이름으로 바꿉니다.
- INGRESS_NAMESPACE를 인그레스 서비스 네임스페이스인
이제 TLS 인증서용으로 방금 만든 보안 비밀을 사용하도록 인그레스 게이트웨이를 구성할 수 있습니다.
인증서를 사용하도록 인그레스 게이트웨이 구성
TLS 인증서용으로 만든 보안 비밀을 사용하도록 Cloud Service Mesh의 인그레스 게이트웨이를 수정합니다.
다음 명령어를 실행하여 인그레스 게이트웨이 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
기존 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 인증서 세트에 여러 보안 비밀을 만든 경우 각 서비스가 사용하는 보안 비밀을 지정할 수 있습니다.
변경사항을 저장합니다.
이제 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