Pinniped 및 Dex용 TLS 인증서 구성 및 관리

이 항목에서는 Tanzu Kubernetes Grid Pinniped 및 Dex용 사용자 지정 TLS 인증서를 구성하는 방법을 설명합니다. 또한 Tanzu Kubernetes Grid Dex 인증서를 업데이트하는 방법도 설명합니다.

사용자 지정 TLS 인증서 구성

기본적으로 Tanzu Kubernetes Grid 자체 서명된 Issuer를 사용하여 Pinniped 및 Dex로의 HTTPS 트래픽을 보호하는 TLS 인증서를 생성합니다. 필요에 따라 관리 클러스터를 배포한 후 다음과 같이 기본 구성을 업데이트할 수 있습니다.

  1. 사용자 지정 ClusterIssuer 리소스 또는 고유한 TLS 암호를 설정합니다. 아래의 ClusterIssuer 리소스 또는 TLS 암호 설정을 참조하십시오.
  2. 관리 클러스터용 Pinniped 추가 기능 암호를 다시 배포하여 Pinniped 구성을 업데이트합니다. 아래의 Pinniped 구성 업데이트를 참조하십시오.
참고

Tanzu Kubernetes Grid는 LDAP ID 제공자에 대해서만 Dex를 배포합니다. 관리 클러스터를 생성하거나 생성 후 단계로 구성할 때 OIDC ID 제공자를 구성하는 경우 Dex가 배포되지 않습니다.

ClusterIssuer 리소스 또는 TLS 암호 설정

사용자 지정 ClusterIssuer 리소스를 사용하여 TLS 인증서를 생성하려는 경우:

  1. 관리 클러스터에서 cert-manager가 실행 중인지 확인합니다. 이 구성 요소는 기본적으로 모든 관리 클러스터에서 실행됩니다.
  2. 관리 클러스터에서 기존 ClusterIssuer 리소스의 이름을 가져옵니다. 자세한 내용은 cert-manager 설명서의 발급자 구성을 참조하십시오.
  3. 관리 클러스터용 Pinniped 추가 기능 암호의 values.yaml 섹션에 있는 custom_cluster_issuer 필드에 ClusterIssuer 이름을 지정한 다음 변경 내용을 적용합니다. 지침은 아래의 Pinniped 구성 업데이트를 참조하십시오. 이 섹션의 단계를 완료하면 두 Dex 인증서 체인 모두 ClusterIssuer에 의해 서명됩니다.

고유한 TLS 암호를 직접 지정하려면 다음을 수행합니다.

  1. Pinniped 서비스의 IP 주소 또는 DNS 호스트 이름인 pinniped-supervisor를 검색하고 LDAP ID 제공자를 사용하는 경우 Dex 서비스의 dexsvc:

    • pinniped-supervisor 서비스:

      • 서비스 유형이 LoadBalancer(로드 밸런서가 있는 vSphere(예: AWS(Amazon Web Services) 또는 Azure))로 설정된 경우 다음을 실행하여 서비스의 외부 주소를 검색합니다.

        kubectl get service pinniped-supervisor -n pinniped-supervisor
        
      • 서비스 유형이 NodePort(로드 밸런서가 없는 vSphere)로 설정된 경우 서비스의 IP 주소는 vSphere 제어부 끝점과 동일합니다. IP 주소를 검색하려면 다음 명령을 실행할 수 있습니다.

        kubectl get configmap cluster-info -n kube-public -o yaml
        
    • (LDAP만 해당) dexsvc 서비스:

      • 서비스 유형이 LoadBalancer(로드 밸런서가 있는 vSphere(예: AWS(Amazon Web Services) 또는 Azure))로 설정된 경우 다음을 실행하여 서비스의 외부 주소를 검색합니다.

        kubectl get service dexsvc -n tanzu-system-auth
        
      • 서비스 유형이 NodePort(로드 밸런서가 없는 vSphere)로 설정된 경우 서비스의 IP 주소는 vSphere 제어부 끝점과 동일합니다. IP 주소를 검색하려면 다음 명령을 실행할 수 있습니다.

        kubectl get configmap cluster-info -n kube-public -o yaml
        
  2. OIDC ID 제공자를 사용하는 경우 pinniped-supervisor 네임스페이스에 kubernetes.io/tls 암호를 생성합니다. LDAP ID 제공자를 사용하는 경우 이름이 같은 kubernetes.io/tls 암호를 두 개 생성합니다. 하나는 tanzu-system-auth 네임스페이스의 Pinniped 서비스용, 다른 하나는 pinniped-supervisor 네임스페이스의 Dex 서비스용입니다. TLS 암호를 생성하려면 다음을 실행합니다.

    kubectl create secret generic SECRET-NAME -n SECRET-NAMESPACE --type kubernetes.io/tls --from-file tls.crt=FILENAME-1.crt --from-file tls.key=FILENAME-2.pem --from-file ca.crt=FILENAME-3.pem
    

    자리 표시자 텍스트를 다음과 같이 바꿉니다.

    • SECRET-NAME은 암호에 선택하는 이름입니다. 예: my-secret.
    • SECRET-NAMESPACE는 암호를 생성할 네임스페이스입니다. Pinniped의 경우 pinniped-supervisor, Dex의 경우 tanzu-system-auth여야 합니다.
    • FILENAME-*tls.crt, tls.key 또는 ca.crt의 이름입니다. Pinniped용 TLS 암호에 지정하는 TLS 인증서에는 위의 단계에서 Pinniped 서비스의 IP 또는 DNS 호스트 이름이 포함되어야 합니다. 마찬가지로 Dex용 TLS 인증서에는 위에서 검색한 Dex 서비스의 IP 주소 또는 DNS 호스트 이름이 포함되어야 합니다. ca.crt 필드는 필수이며, TLS 인증서를 확인하는 데 사용되는 CA 번들이 포함되어 있습니다.

    예를 들어 Pinniped용 최종 암호는 다음과 유사합니다.

    apiVersion: v1
    kind: Secret
    metadata:
     name: my-secret
     namespace: pinniped-supervisor
    type: kubernetes.io/tls
    data:
     tls.crt: |       MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
     tls.key: |       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
     ca.crt:  |       MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
    

    암호가 올바르게 생성된 경우 openssl x509 -in tls.crt -texttls.crt 를 디코딩하면 주체 대체 이름 필드에 IP 주소 또는 DNS 호스트 이름이 표시됩니다.

  3. 관리 클러스터용 Pinniped 추가 기능 암호의 values.yaml 섹션에 있는 custom_tls_secret 필드에 암호 이름을 지정한 다음 변경 내용을 적용합니다. 지침은 아래의 Pinniped 구성 업데이트를 참조하십시오.

  4. Pinniped 서비스의 DNS 호스트 이름을 구성하려면 관리 클러스터의 Pinniped 추가 기능 암호에 있는 values.yaml 섹션의 pinniped.supervisor_svc_external_dns 필드에 Pinniped Supervisor와 연결된 FQDN을 지정합니다. pinniped.supervisor_svc_external_dns 값은 https://로 시작해야 합니다. 자세한 내용은 자동 관리 패키지 values.yaml 설정을 참조하십시오. 그런 다음 변경 내용을 적용합니다. 지침은 아래의 Pinniped 구성 업데이트를 참조하십시오. 이 호스트 이름에 DNS를 별도로 구성해야 합니다(예: DNS 제공자에 A 레코드를 생성하여 Pinniped Supervisor 서비스의 IP 주소로 확인합니다. 이 호스트 이름은 Pinniped Supervisor에 구성하는 TLS 인증서에서 주체 대체 이름으로 표시되어야 합니다.

Pinniped 구성 업데이트

변경 내용을 적용하려면 아래 단계에 따라 Pinniped 구성을 업데이트합니다.

  1. 관리 클러스터의 Pinniped 추가 기능 암호를 파일에 저장하고 암호의 values.yaml 섹션에서 Base64로 인코딩된 문자열을 디코딩합니다.

    kubectl get secret CLUSTER-NAME-pinniped-package -n tkg-system -o jsonpath="{.data.values\.yaml}" | base64 -d > FILENAME.yaml
    

    자리 표시자 텍스트를 다음과 같이 바꿉니다.

    • CLUSTER-NAME은 관리 클러스터의 이름입니다.
    • FILENAME은 암호에 사용할 파일 이름입니다. 예: values.yaml.
  2. 디코딩된 텍스트에서 다음 중 하나를 수행합니다.

    • 위에서 ClusterIssuer 리소스를 준비한 경우 custom_cluster_issuer 필드에 리소스의 이름을 지정합니다. 예:

      ---
      infrastructure_provider: vsphere
      tkg_cluster_role: management
      custom_cluster_issuer: "my-cluster-issuer-name"
      pinniped:
       cert_duration: 2160h
       cert_renew_before: 360h
       supervisor_svc_endpoint: https://10.168.217.220:31234
       supervisor_ca_bundle_data: LS0tLS1CRUdJTiBDRVJUSUZJQ0F……
      ...
      
    • 위에서 고유한 TLS 암호를 준비한 경우 custom_tls_secret 필드에 암호의 이름을 지정합니다. 예:

      ---
      infrastructure_provider: vsphere
      tkg_cluster_role: management
      custom_tls_secret: "my-tls-secret-name"
      pinniped:
       cert_duration: 2160h
       cert_renew_before: 360h
       supervisor_svc_endpoint: https://10.168.217.220:31234
       supervisor_ca_bundle_data: LS0tLS1CRUdJTiBDRVJUSUZJQ0F……
      ...
      

      custom_tls_secret 필드를 구성하면 custom_cluster_issuer는 무시됩니다.

      Pinniped 서비스의 DNS 호스트 이름을 구성하려면 pinniped.supervisor_svc_external_dns 필드에서 Pinniped Supervisor에 사용할 FQDN을 지정합니다. 예를 들면 다음과 같습니다.

      ...
      pinniped:
      cert_duration: 2160h
      cert_renew_before: 360h
      supervisor_svc_endpoint: https://0.0.0.0:31234
      supervisor_ca_bundle_data: ca_bundle_data_of_supervisor_svc
      supervisor_svc_external_ip: 0.0.0.0
      supervisor_svc_external_dns: https://pinniped.example.com
      ...
      
  3. values.yaml 섹션을 다시 인코딩하고 Pinniped 추가 기능 암호를 업데이트합니다. 이 명령은 환경 OS에 따라 다릅니다. 예:

    Linux:

    kubectl patch secret CLUSTER-NAME-pinniped-package -n tkg-system -p "{\"data\":{\"values.yaml\":\"$(base64 -w 0 < values.yaml)\"}}" --type=merge
    

    macOS:

    kubectl patch secret CLUSTER-NAME-pinniped-package -n tkg-system -p "{\"data\":{\"values.yaml\":\"$(base64 < values.yaml)\"}}" --type=merge
    
  4. 변경 내용이 성공적으로 적용되었는지 확인합니다.

    1. pinniped 애플리케이션의 상태를 가져옵니다.

      kubectl get app CLUSTER-NAME-pinniped -n tkg-system
      

      반환된 상태가 조정 실패인 경우 다음 명령을 실행하여 실패 세부 정보를 가져옵니다.

      kubectl get app CLUSTER-NAME-pinniped -n tkg-system -o yaml
      
    2. tanzu mc kubeconfig get --export-file ./KUBECONFIG-MC-CLUSTER-NAME 명령을 실행하여 관리 클러스터용 kubeconfig 파일을 생성합니다. 그런 다음 kubeconfig를 사용하여 kubectl get pods --kubeconfig ./KUBECONFIG-MC-CLUSTER-NAME과 같은 명령을 실행합니다. 또한 관리 클러스터가 워크로드 클러스터를 관리하는 경우 tanzu cluster kubeconfig get <WORKLOAD-CLUSTER-NAME> --export-file ./KUBECONFIG-WORKLOAD-CLUSTER-NAME을 실행한 다음, 기존 클러스터 각각에 대해 kubectl get pods --kubeconfig ./KUBECONFIG-WORKLOAD-CLUSTER-NAME를 실행합니다.

Dex 서비스 인증서 및 Dex CA 인증서 업데이트

LDAP ID 관리를 사용하는 클러스터에서는 다음과 같은 경우 Dex 인증서를 업데이트할 수 있습니다.

  • Dex CA 인증서가 업데이트되었거나 만료되었습니다.
  • Dex CA와 연결된 개인 키가 손상되었습니다.

사전 요구 사항

이 절차를 수행하기 전에 다음이 있는지 확인합니다.

  • LDAP IDP를 사용하여 Pinniped 추가 기능을 구성했습니다. 자세한 내용은 ID 제공자 - LDAP를 참조하십시오.
  • kubectl get service dexsvc -n tanzu-system-auth 명령을 사용하여 Dex 서비스의 주소를 얻었습니다.

Dex 서비스 인증서 업데이트

  1. 현재 워크로드 클러스터 컨텍스트에 있는 경우 kubectl 컨텍스트를 관리 클러스터로 변경합니다. 자세한 내용은 워크로드 클러스터 kubeconfig 검색을 참조하십시오.

  2. 현재 Dex 서비스 인증서를 다운로드합니다.

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    형식 설명:

    • ADDRESS는 Tanzu Kubernetes Grid Dex 서비스 주소입니다.
    • OLD-FILE은 서비스 인증서 텍스트 파일(예: before.txt)을 저장할 이름입니다.
  3. cert-manager가 암호를 다시 생성할 수 있도록 현재 Dex 서비스 인증서 암호를 삭제합니다.

    kubectl delete secret -n tanzu-system-auth  dex-cert-tls
    

    다음은 샘플 출력입니다.

    secret "dex-cert-tls" deleted
    
  4. 새 Dex 서비스 인증서가 생성되었는지 확인합니다.

    kubectl get secret -n tanzu-system-auth
    

    다음은 샘플 출력입니다.

    $kubectl get secret -n tanzu-system-auth
    NAME                  TYPE                                  DATA   AGE
    default-token-cg8f2   kubernetes.io/service-account-token   3      6m5s
    dex-ca-key-pair       kubernetes.io/tls                     3      5m50s
    dex-cert-tls          kubernetes.io/tls                     3      2s
    dex-token-p96gl       kubernetes.io/service-account-token   3      6m3s
    
  5. Dex 포드를 다시 시작합니다.

    kubectl delete pod -n tanzu-system-auth -l app=dex
    

    다음은 샘플 출력입니다.

    $ kubectl delete pod -n tanzu-system-auth -l app=dex
    pod DEX-POD deleted
    
  6. 새 Dex 서비스 인증서를 다운로드합니다.

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null  | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    형식 설명:

    • ADDRESS는 Tanzu Kubernetes Grid Dex 서비스 주소입니다.
    • NEW-FILE은 새 서비스 인증서 텍스트 파일(예: after.txt)을 저장할 이름입니다.
  7. 이전 인증서와 새 인증서를 비교하여 새 인증서가 생성되었는지 확인합니다.

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    형식 설명:

    • OLD-FILE은 이전 Dex 서비스 인증서의 이름입니다.
    • NEW-FILE은 새 Dex 서비스 인증서의 이름입니다.

Dex CA 인증서 업데이트

  1. 현재 Dex CA 인증서를 다운로드합니다.

    kubectl get secret -n tanzu-system-auth dex-cert-tls -o jsonpath={.data.ca\\.crt} | base64 -d | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    여기서 OLD-FILE은 서비스 인증서 텍스트 파일(예: ca-before.txt)을 저장할 이름입니다.

  2. 현재 Dex 서비스 인증서를 다운로드합니다.

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    형식 설명:

    • ADDRESS는 Tanzu Kubernetes Grid Dex 서비스 주소입니다.

    • OLD-FILE은 서비스 인증서 텍스트 파일(예: cert-before.txt)을 저장할 이름입니다.

  3. 현재 Dex CA 데이터를 다운로드합니다.

    kubectl get oidcidentityprovider upstream-oidc-identity-provider -n pinniped-supervisor -o jsonpath={.spec.tls.certificateAuthorityData} | base64 -d  | openssl x509 -noout -text > /tmp/OLD-FILE.txt
    

    여기서 OLD-FILE은 서비스 인증서 텍스트 파일(예: ca-data-before.txt)을 저장할 이름입니다.

  4. cert-manager가 암호를 다시 생성할 수 있도록 Dex CA 인증서 암호를 삭제합니다.

    kubectl delete secret -n tanzu-system-auth dex-ca-key-pair
    

    다음은 샘플 출력입니다.

    secret "dex-ca-key-pair" deleted
    
  5. 새 Dex CA 인증서가 생성되었는지 확인합니다.

    kubectl get secret -n tanzu-system-auth
    

    다음은 샘플 출력입니다.

    $ kubectl get secret -n tanzu-system-auth
    NAME                  TYPE                                  DATA   AGE
    default-token-cg8f2   kubernetes.io/service-account-token   3      25m
    dex-ca-key-pair       kubernetes.io/tls                     3      18s
    dex-cert-tls          kubernetes.io/tls                     3      17s
    dex-token-p96gl       kubernetes.io/service-account-token   3      25m
    
    
  6. cert-manager가 암호를 다시 생성할 수 있도록 현재 Dex 서비스 인증서 암호를 삭제합니다.

    kubectl delete secret -n tanzu-system-auth  dex-cert-tls
    

    다음은 샘플 출력입니다.

    secret "dex-cert-tls" deleted
    
  7. 새 Dex 서비스 인증서가 생성되었는지 확인합니다.

    kubectl get secret -n tanzu-system-auth
    

    다음은 샘플 출력입니다.

    kubectl get secret -n tanzu-system-auth
    NAME                  TYPE                                  DATA   AGE
    default-token-cg8f2   kubernetes.io/service-account-token   3      6m5s
    dex-ca-key-pair       kubernetes.io/tls                     3      5m50s
    dex-cert-tls          kubernetes.io/tls                     3      2s
    dex-token-p96gl       kubernetes.io/service-account-token   3      6m3s
    
  8. Pinniped 배포 후 작업을 삭제합니다.

    kubectl delete job -n pinniped-supervisor pinniped-post-deploy-job
    

    다음은 샘플 출력입니다.

    job.batch "pinniped-post-deploy-job" deleted
    
  9. Pinniped 추가 기능을 업데이트하여 변경 내용을 빠르게 동기화하고 추가 기능에서 변경 내용을 조정할 때까지 몇 분 정도 기다립니다.

    kubectl patch app pinniped -n tkg-system -p '{"spec":{"syncPeriod":"30s"}}' --type merge
    
    kubectl wait app pinniped -n tkg-system --for condition=ReconcileSucceeded --timeout 5m
    
  10. 새 Dex CA 인증서를 다운로드합니다.

    kubectl get secret -n tanzu-system-auth dex-cert-tls -o jsonpath={.data.ca\\.crt} | base64 -d | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    여기서 NEW-FILE은 새 Dex CA 인증서 텍스트 파일(예: ca-after.txt)을 저장할 이름입니다.

  11. 새 Dex 서비스 인증서를 다운로드합니다.

    openssl s_client -connect ADDRESS:PORT -showcerts </dev/null  | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    형식 설명:

    • ADDRESS는 Tanzu Kubernetes Grid Dex 서비스 주소입니다.
    • NEW-FILE은 새 Dex 서비스 인증서 텍스트 파일(예: after.txt)을 저장할 이름입니다.

    • 새 Dex CA 데이터를 다운로드합니다.

    kubectl get oidcidentityprovider upstream-oidc-identity-provider -n pinniped-supervisor -o jsonpath={.spec.tls.certificateAuthorityData} | base64 -d  | openssl x509 -noout -text > /tmp/NEW-FILE.txt
    

    여기서 NEW-FILE은 새 Dex CA 데이터 텍스트 파일(예: ca-data-after.txt)을 저장할 이름입니다.

  12. 이전 인증서와 새 CA 인증서를 비교하여 새 인증서가 생성되었는지 확인합니다.

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    형식 설명:

    • OLD-FILE은 이전 Dex CA 인증서의 이름입니다.
    • NEW-FILE은 이전 Dex CA 인증서의 이름입니다.
  13. 이전 인증서와 새 서비스 인증서를 비교하여 새 서비스 인증서가 생성되었는지 확인합니다.

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    형식 설명:

    • OLD-FILE은 이전 Dex 서비스 인증서의 이름입니다.
    • NEW-FILE은 이전 Dex 서비스 인증서의 이름입니다.
  14. 이전 CA 데이터와 새 CA 데이터를 비교하여 새 데이터가 생성되었는지 확인합니다.

    diff /tmp/OLD-FILE /tmp/NEW-FILE
    

    형식 설명:

    • OLD-FILE은 이전 Dex CA 데이터 파일입니다.
    • NEW-FILE은 이전 Dex CA 데이터 파일입니다.
check-circle-line exclamation-circle-line close-line
Scroll to top icon