Google 관리 SSL 인증서 사용


이 페이지에서는 인그레스 객체를 사용하여 Google 관리 SSL 인증서로 외부 부하 분산기를 만드는 방법을 설명합니다. 이 인증서는 Google에서 도메인 이름을 프로비저닝, 갱신, 관리하는 도메인 유효성 검사(DV) 인증서입니다. 이 인증서에는 개인 또는 조직의 ID가 표시되지 않습니다.

Google Cloud로 Google 관리 인증서를 만드는 방법은 Google 관리 인증서를 참조하세요.

GKE Google 관리 SSL 인증서는 공개 및 비공개 클러스터를 지원합니다.

Google 관리 인증서로 인그레스 만들기

Google 관리 SSL 인증서를 구성하고 인그레스에 연결하려면 다음을 수행해야 합니다.

  • 인그레스와 동일한 네임스페이스에 ManagedCertificate 객체를 만듭니다.
  • 인그레스에 networking.gke.io/managed-certificates 주석을 추가하여 ManagedCertificate 객체를 인그레스에 연결합니다. 이 주석은 ManagedCertificate 객체의 쉼표로 구분된 목록입니다.

제한사항

Google 관리 인증서는 사용자가 직접 가져오고 관리하는 인증서보다 유연성이 낮습니다. Google 관리 인증서는 와일드 카드가 아닌 도메인을 최대 100개까지 지원합니다. 자체 관리형 인증서와 달리 Google 관리형 인증서는 와일드 카드 도메인을 지원하지 않습니다.

자체 관리형 인증서가 필요하거나 인그레스에 구성하려는 SSL 인증서를 이미 소유한 경우에는 클라이언트와 부하 분산기 간 HTTPS(TLS) 설정을 참조하세요.

인그레스가 지원하는 인증서의 개수와 유형은 Google 관리형 SSL 인증서의 한도에 따라 정의됩니다.

Google 관리형 인증서의 업데이트는 지원되지 않습니다. 자세한 내용은 Google 관리 인증서 수동 업데이트를 참조하세요.

인증 기관에서 직접 인증서를 취소하는 경우 Google에서 인증서를 자동으로 순환하지 않습니다. ManagedCertificate를 삭제하고 새 인증서를 만들어야 합니다.

기본 요건

  • 도메인 이름을 소유하고 있어야 합니다. 도메인 이름은 63자(영문 기준) 이하여야 합니다. Google Domains 또는 다른 등록기관을 이용할 수 있습니다.
  • GKE Standard 클러스터를 사용하는 경우 HttpLoadBalancing 부가기능을 사용 설정해야 합니다.
  • ingressClassName"gce"여야 합니다.
  • 같은 프로젝트와 네임스페이스에 IngressManagedCertificate 리소스를 적용해야 합니다.
  • 예약된(고정) 외부 IP 주소를 만듭니다. 고정 IP 주소를 예약하면 인그레스를 삭제해도 이 주소는 내 소유로 유지됩니다. IP 주소를 예약하지 않으면 주소가 변경되어 도메인의 DNS 레코드를 다시 구성해야 할 수도 있습니다. Google Cloud CLI 또는 Google Cloud 콘솔을 사용하여 예약 IP 주소를 만듭니다.

    gcloud

    예약된 IP 주소를 만들려면 다음 명령어를 실행합니다.

    gcloud compute addresses create ADDRESS_NAME --global
    

    ADDRESS_NAME을 만들고 있는 예약 IP 주소의 이름으로 바꿉니다.

    만든 고정 IP 주소를 찾으려면 다음 명령어를 실행합니다.

    gcloud compute addresses describe ADDRESS_NAME --global
    

    출력은 다음과 비슷합니다.

    address: 203.0.113.32
    ...
    

    Console

    예약 IP 주소를 만들려면 다음 단계를 수행합니다.

    1. Google Cloud Console의 외부 IP 주소 페이지로 이동합니다.

      외부 IP 주소로 이동

    2. IP 주소의 이름을 지정합니다(예시: example-ip-address).

    3. IPv4 또는 IPv6 주소 사용 여부를 지정합니다.

    4. 유형전역 옵션을 선택합니다.

    5. 예약을 클릭합니다. IP 주소가 외부 주소 열에 나열됩니다.

    구성 커넥터

    참고: 이 단계에는 구성 커넥터가 필요합니다. 설치 안내를 따라 클러스터에 구성 커넥터를 설치하세요.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global
    이 매니페스트를 배포하려면 compute-address.yaml로 머신에 다운로드하고 다음을 실행합니다.

    kubectl apply -f compute-address.yaml
    

Google 관리 인증서 설정

  1. ManagedCertificate 객체를 만듭니다. 이 리소스는 SSL 인증서의 도메인을 지정합니다. 와일드 카드 도메인은 지원되지 않습니다.

    다음 매니페스트에서는 ManagedCertificate 객체를 설명합니다. 매니페스트를 managed-cert.yaml로 저장합니다.

    apiVersion: networking.gke.io/v1
    kind: ManagedCertificate
    metadata:
      name: managed-cert
    spec:
      domains:
        - FQDN_1
        - FQDN_2
    

    다음을 바꿉니다.

    • FQDN_1, FQDN_2: 소유하고 있는 정규화된 도메인 이름입니다. 예를 들면 example.comwww.example.com입니다.
  2. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f managed-cert.yaml
    
  3. NodePort 유형의 서비스를 만들어 애플리케이션을 인터넷에 노출합니다.

    다음 매니페스트에서는 NodePort 유형의 서비스를 설명합니다. 매니페스트를 mc-service.yaml로 저장합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: mc-service
    spec:
      selector:
        app: mc-service
      type: NodePort
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    
  4. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f mc-service.yaml
    
  5. 인그레스를 만듭니다.

    다음 매니페스트는 만든 ManagedCertificate을 사용하는 인그레스를 설명합니다. 매니페스트를 managed-cert-ingress.yaml로 저장합니다.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: managed-cert-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: ADDRESS_NAME
        networking.gke.io/managed-certificates: managed-cert
        ingressClassName: "gce"
    spec:
      defaultBackend:
        service:
          name: mc-service
          port:
            number: SERVICE_PORT
    

    다음을 바꿉니다.

    • ADDRESS_NAME: 예약된 IP 주소의 이름입니다.
    • SERVICE_PORT: 서비스 매니페스트의 ports.port 값입니다.
  6. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f managed-cert-ingress.yaml
    
  7. 부하 분산기의 IP 주소를 가져옵니다.

    kubectl get ingress
    

    출력은 다음과 비슷합니다.

    NAME                 HOSTS       ADDRESS         PORTS     AGE
    managed-cert-ingress   *         203.0.113.32     80       54s
    

    부하 분산기의 IP 주소가 ADDRESS 열에 나열됩니다. 예약된 고정 IP 주소를 사용할 경우 이 주소는 부하 분산기의 주소입니다.

    주소가 나열되지 않으면 인그레스 설정이 완료되기를 기다립니다.

  8. 부하 분산기의 IP 주소를 가리키도록 도메인의 DNS 레코드를 구성합니다. Cloud DNS를 사용하는 경우 자세한 내용은 레코드 관리를 참조하세요.

  9. Google 관리 인증서에서 프로비저닝을 완료할 때까지 기다립니다. 여기에는 최대 60분이 걸릴 수 있습니다. 다음 명령어를 사용하여 인증서 상태를 확인할 수 있습니다.

    kubectl describe managedcertificate managed-cert
    

    출력은 다음과 비슷합니다.

    Name:         managed-cert
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  networking.gke.io/v1
    Kind:         ManagedCertificate
    (...)
    Spec:
     Domains:
       FQDN_1
       FQDN_2
    Status:
     CertificateStatus: Active
    (...)
    

    Status.CertificateStatus 필드 값은 인증서가 프로비저닝되었음을 나타냅니다. Status.CertificateStatusActive가 아닌 경우 인증서가 아직 프로비저닝되지 않은 것입니다.

  10. 다음 명령어를 사용하여 인그레스의 이벤트를 확인할 수 있습니다.

    kubectl describe ingress INGRESS_NAME
    

    INGRESS_NAME을 인그레스의 이름으로 바꿉니다.

  11. https:// 프리픽스로 도메인에 방문하여 SSL이 작동하는지 확인합니다. 브라우저에 연결이 안전하다고 표시되며 인증서 세부정보를 볼 수 있습니다.

자체 관리형 인증서에서 Google 관리형 인증서로 이전

자체 관리형 SSL 인증서에서 Google 관리형 SSL 인증서로 인그레스를 이전하는 경우, Google 관리형 SSL 인증서가 활성화되기 전에 자체 관리형 SSL 인증서를 삭제하지 마세요. Google 관리형 SSL 인증서는 성공적으로 프로비저닝된 후 자동으로 활성화됩니다. Google 관리형 SSL 인증서가 활성화되면 자가 관리형 SSL 인증서를 삭제할 수 있습니다.

다음 안내에 따라 자가 관리형에서 Google 관리형 SSL 인증서로 이전하세요.

  1. Google 관리 인증서 설정 섹션의 설명대로 인그레스에 새 Google 관리 인증서를 추가합니다.
  2. Google 관리 인증서 리소스가 활성 상태가 되기를 기다립니다. 다음 명령어로 인증서 상태를 확인합니다.

    kubectl describe managedcertificate managed-cert
    
  3. Active 상태가 되면 인그레스를 업데이트하여 자체 관리형 인증서에 대한 참조를 삭제합니다.

Google 관리 인증서 삭제

클러스터에서 Google 관리 인증서를 삭제하려면 ManagedCertificate 객체를 삭제하고 해당 리소스를 참조하는 인그레스 주석을 삭제해야 합니다.

  1. ManagedCertificate 객체를 삭제합니다.

    kubectl delete -f managed-cert.yaml
    

    출력은 다음과 비슷합니다.

    managedcertificate.networking.gke.io "managed-cert" deleted
    
  2. 인그레스에서 주석을 삭제합니다.

    kubectl annotate ingress managed-cert-ingress networking.gke.io/managed-certificates-
    

    명령어 끝부분의 빼기 기호 -를 확인합니다.

  3. 부하 분산기용으로 예약한 고정 IP 주소를 해제합니다.

    Google Cloud CLI, Google Cloud Console 또는 구성 커넥터를 사용하여 예약 IP 주소를 해제할 수 있습니다.

    gcloud

    다음 명령어를 사용하여 예약 IP 주소를 해제합니다.

    gcloud compute addresses delete ADDRESS_NAME --global
    

    ADDRESS_NAME을 IP 주소의 이름으로 바꿉니다.

    Console

    예약 IP 주소를 해제하려면 다음 단계를 수행합니다.

    1. Google Cloud Console의 외부 IP 주소 페이지로 이동합니다.

      외부 IP 주소로 이동

    2. 해제하려는 IP 주소 옆에 있는 체크박스를 선택합니다.

    3. IP 주소 해제를 클릭합니다.

    구성 커넥터

    참고: 이 단계에는 구성 커넥터가 필요합니다. 설치 안내를 따라 클러스터에 구성 커넥터를 설치하세요.

    apiVersion: compute.cnrm.cloud.google.com/v1beta1
    kind: ComputeAddress
    metadata:
      name: example-ip-address
    spec:
      location: global

    이 매니페스트를 배포하려면 compute-address.yaml로 머신에 다운로드하고 다음을 실행합니다.

    kubectl delete -f compute-address.yaml
    

문제 해결하기

이 섹션에서는 Google 관리 인증서로 문제를 해결하는 방법에 대한 정보를 제공합니다.

ManagedCertificate 및 인그레스 리소스의 이벤트 확인

허용된 인증서 수를 초과하면 TooManyCertificates 이유가 있는 이벤트가 ManagedCertificate에 추가됩니다. 다음 명령어를 사용하여 ManagedCertificate 객체의 이벤트를 확인할 수 있습니다.

kubectl describe managedcertificate CERTIFICATE_NAME

CERTIFICATE_NAMEManagedCertificate의 이름으로 바꿉니다.

존재하지 않는 ManagedCertificate를 인그레스에 연결하면 MissingCertificate 이유가 포함된 이벤트가 인그레스에 추가됩니다. 다음 명령어를 사용하여 인그레스의 이벤트를 확인할 수 있습니다.

kubectl describe ingress INGRESS_NAME

INGRESS_NAME을 인그레스의 이름으로 바꿉니다.

도메인이 여러 부하 분산기의 IP 주소로 확인될 경우 관리형 인증서가 프로비저닝되지 않음

도메인이 여러 부하 분산기(여러 인그레스 객체)의 IP 주소로 확인되면 ManagedCertificate 객체 한 개를 만들고 모든 인그레스 객체에 연결해야 합니다. 대신 여러 ManagedCertificate 객체를 만들고 개별 인그레스에 각각 연결하면 인증 기관이 도메인의 소유권을 확인하지 못하고 일부 인증서가 프로비저닝되지 않을 수 있습니다. 확인을 성공하려면 도메인이 확인되는 모든 IP 주소 아래에 인증서가 표시되어야 합니다.

특히 도메인이 다른 인그레스 객체로 구성된 IPv4 및 IPv6 주소로 확인되면 ManagedCertificate 객체 한 개를 만들고 두 인그레스 모두에 연결해야 합니다.

Google 관리 인증서와 인그레스 간의 통신 중단

관리형 인증서는 ingress.gcp.kubernetes.io/pre-shared-cert 주석을 사용하여 인그레스와 통신합니다. 예를 들어 다음 경우에는 이 통신을 중단할 수 있습니다.

  • ingress.gcp.kubernetes.io/pre-shared-cert 주석을 삭제하는 자동화 프로세스를 실행합니다.
  • 인그레스 스냅샷을 저장한 후 스냅샷에서 인그레스를 삭제하고 복원합니다. 그동안 ingress.gcp.kubernetes.io/pre-shared-cert 주석에 나열된 SslCertificate 리소스가 삭제되었을 수 있습니다. 인그레스에 연결된 인증서가 없으면 인그레스가 작동하지 않습니다.

Google 관리 인증서와 인그레스 간의 통신이 중단된 경우 ingress.gcp.kubernetes.io/pre-shared-cert 주석의 콘텐츠를 삭제하고 시스템이 조정될 때까지 기다립니다. 반복을 방지하려면 주석이 의도치 않게 수정되거나 삭제되지 않도록 해야 합니다.

Google 관리 인증서를 만들 때 검증 오류

ManagedCertificate 정의는 ManagedCertificate 객체가 생성되기 전에 검증됩니다. 검증이 실패하면 ManagedCertificate 객체가 생성되지 않고 오류 메시지가 출력됩니다. 아래에서는 여러 오류 메시지와 원인을 설명합니다.

spec.domains in body should have at most 100 items

ManagedCertificate 매니페스트가 spec.domains 필드에 도메인을 100개 넘게 나열합니다. Google 관리 인증서는 도메인을 최대 100개까지만 지원합니다.

spec.domains in body should match '^(([a-zA-Z0-9]+|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.)+[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9]\.?$'

spec.domains 필드에 지정한 도메인 이름 또는 와일드 카드 도메인 이름이 잘못되었습니다. ManagedCertificate 객체는 와일드 카드 도메인(예: *.example.com)을 지원하지 않습니다.

spec.domains in body should be at most 63 chars long

지정한 도메인 이름이 너무 깁니다. Google 관리 인증서에서 지원하는 도메인 이름은 최대 63자입니다.

Google 관리형 인증서 수동 업데이트

새 도메인의 인증서가 프로비저닝될 때까지 이전 도메인의 인증서가 계속 작동하도록 인증서를 수동으로 업데이트하려면 다음 단계를 따르세요.

  1. 새 도메인에 대한 ManagedCertificate을 만듭니다.
  2. 쉼표로 구분된 목록을 사용하여 ManagedCertificate 이름을 인그레스의 networking.gke.io/managed-certificates 주석에 추가합니다. 이전 인증서 이름을 삭제하지 마세요.
  3. ManagedCertificate이 활성 상태가 될 때까지 기다립니다.
  4. 인그레스에서 이전 인증서를 분리하고 삭제합니다.

ManagedCertificate를 만들면 Google Cloud에서 Google 관리 SSL 인증서를 만듭니다. 이 인증서를 업데이트할 수 없습니다. ManagedCertificate를 업데이트하면 Google Cloud에서 Google 관리 SSL 인증서를 삭제하고 다시 만듭니다.

GKE 클러스터에 보안 HTTPS 암호화 인그레스를 제공하려면 보안 인그레스 예시를 참조하세요.

다음 단계