이 항목에서는 Tanzu Kubernetes Grid Pinniped 및 Dex용 사용자 지정 TLS 인증서를 구성하는 방법을 설명합니다. 또한 Tanzu Kubernetes Grid Dex 인증서를 업데이트하는 방법도 설명합니다.
기본적으로 Tanzu Kubernetes Grid 자체 서명된 Issuer
를 사용하여 Pinniped 및 Dex로의 HTTPS 트래픽을 보호하는 TLS 인증서를 생성합니다. 필요에 따라 관리 클러스터를 배포한 후 다음과 같이 기본 구성을 업데이트할 수 있습니다.
ClusterIssuer
리소스 또는 고유한 TLS 암호를 설정합니다. 아래의 ClusterIssuer
리소스 또는 TLS 암호 설정을 참조하십시오.참고Tanzu Kubernetes Grid는 LDAP ID 제공자에 대해서만 Dex를 배포합니다. 관리 클러스터를 생성하거나 생성 후 단계로 구성할 때 OIDC ID 제공자를 구성하는 경우 Dex가 배포되지 않습니다.
ClusterIssuer
리소스 또는 TLS 암호 설정사용자 지정 ClusterIssuer
리소스를 사용하여 TLS 인증서를 생성하려는 경우:
cert-manager
가 실행 중인지 확인합니다. 이 구성 요소는 기본적으로 모든 관리 클러스터에서 실행됩니다.ClusterIssuer
리소스의 이름을 가져옵니다. 자세한 내용은 cert-manager 설명서의 발급자 구성을 참조하십시오.values.yaml
섹션에 있는 custom_cluster_issuer
필드에 ClusterIssuer
이름을 지정한 다음 변경 내용을 적용합니다. 지침은 아래의 Pinniped 구성 업데이트를 참조하십시오. 이 섹션의 단계를 완료하면 두 Dex 인증서 체인 모두 ClusterIssuer
에 의해 서명됩니다.고유한 TLS 암호를 직접 지정하려면 다음을 수행합니다.
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
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 -text
로 tls.crt
를 디코딩하면 주체 대체 이름 필드에 IP 주소 또는 DNS 호스트 이름이 표시됩니다.
관리 클러스터용 Pinniped 추가 기능 암호의 values.yaml
섹션에 있는 custom_tls_secret
필드에 암호 이름을 지정한 다음 변경 내용을 적용합니다. 지침은 아래의 Pinniped 구성 업데이트를 참조하십시오.
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 추가 기능 암호를 파일에 저장하고 암호의 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
.디코딩된 텍스트에서 다음 중 하나를 수행합니다.
위에서 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
...
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
변경 내용이 성공적으로 적용되었는지 확인합니다.
pinniped
애플리케이션의 상태를 가져옵니다.
kubectl get app CLUSTER-NAME-pinniped -n tkg-system
반환된 상태가 조정 실패인 경우 다음 명령을 실행하여 실패 세부 정보를 가져옵니다.
kubectl get app CLUSTER-NAME-pinniped -n tkg-system -o yaml
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
를 실행합니다.
LDAP ID 관리를 사용하는 클러스터에서는 다음과 같은 경우 Dex 인증서를 업데이트할 수 있습니다.
이 절차를 수행하기 전에 다음이 있는지 확인합니다.
kubectl get service dexsvc -n tanzu-system-auth
명령을 사용하여 Dex 서비스의 주소를 얻었습니다.현재 워크로드 클러스터 컨텍스트에 있는 경우 kubectl
컨텍스트를 관리 클러스터로 변경합니다. 자세한 내용은 워크로드 클러스터 kubeconfig 검색을 참조하십시오.
현재 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
)을 저장할 이름입니다.cert-manager
가 암호를 다시 생성할 수 있도록 현재 Dex 서비스 인증서 암호를 삭제합니다.
kubectl delete secret -n tanzu-system-auth dex-cert-tls
다음은 샘플 출력입니다.
secret "dex-cert-tls" deleted
새 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
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
새 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
)을 저장할 이름입니다.이전 인증서와 새 인증서를 비교하여 새 인증서가 생성되었는지 확인합니다.
diff /tmp/OLD-FILE /tmp/NEW-FILE
형식 설명:
OLD-FILE
은 이전 Dex 서비스 인증서의 이름입니다.NEW-FILE
은 새 Dex 서비스 인증서의 이름입니다.현재 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
)을 저장할 이름입니다.
현재 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
)을 저장할 이름입니다.
현재 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
)을 저장할 이름입니다.
cert-manager
가 암호를 다시 생성할 수 있도록 Dex CA 인증서 암호를 삭제합니다.
kubectl delete secret -n tanzu-system-auth dex-ca-key-pair
다음은 샘플 출력입니다.
secret "dex-ca-key-pair" deleted
새 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
cert-manager
가 암호를 다시 생성할 수 있도록 현재 Dex 서비스 인증서 암호를 삭제합니다.
kubectl delete secret -n tanzu-system-auth dex-cert-tls
다음은 샘플 출력입니다.
secret "dex-cert-tls" deleted
새 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
Pinniped 배포 후 작업을 삭제합니다.
kubectl delete job -n pinniped-supervisor pinniped-post-deploy-job
다음은 샘플 출력입니다.
job.batch "pinniped-post-deploy-job" deleted
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
새 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
)을 저장할 이름입니다.
새 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
)을 저장할 이름입니다.
이전 인증서와 새 CA 인증서를 비교하여 새 인증서가 생성되었는지 확인합니다.
diff /tmp/OLD-FILE /tmp/NEW-FILE
형식 설명:
OLD-FILE
은 이전 Dex CA 인증서의 이름입니다.NEW-FILE
은 이전 Dex CA 인증서의 이름입니다.이전 인증서와 새 서비스 인증서를 비교하여 새 서비스 인증서가 생성되었는지 확인합니다.
diff /tmp/OLD-FILE /tmp/NEW-FILE
형식 설명:
OLD-FILE
은 이전 Dex 서비스 인증서의 이름입니다.NEW-FILE
은 이전 Dex 서비스 인증서의 이름입니다.이전 CA 데이터와 새 CA 데이터를 비교하여 새 데이터가 생성되었는지 확인합니다.
diff /tmp/OLD-FILE /tmp/NEW-FILE
형식 설명:
OLD-FILE
은 이전 Dex CA 데이터 파일입니다.NEW-FILE
은 이전 Dex CA 데이터 파일입니다.