vSphere IaaS control plane는 TLS(Transport Layer Security) 암호화를 사용하여 구성 요소 간의 통신을 보호합니다. 감독자의 TKG에는 이 암호화 인프라를 지원하는 여러 TLS 인증서가 포함되어 있습니다. 감독자 인증서 순환은 수동입니다. TKG 인증서 순환은 자동화되어 있지만 필요한 경우 수동으로 수행할 수 있습니다.
TKG 서비스 클러스터에 대한 TLS 인증서 정보
vSphere IaaS control plane는 TLS 인증서를 사용하여 다음 구성 요소 간의 통신을 보호합니다.
vSphere IaaS control plane 환경에서 사용되는 각 TLS 인증서에 대한 자세한 내용 및 전체 목록은 KB 문서
vSphere with Tanzu 인증서 가이드를 참조하십시오.
- vCenter Server
- 감독자 제어부 노드
- vSphere 포드의 작업자 노드로 작동하는 ESXi 호스트
- TKG 클러스터 노드(제어부 및 작업자 모두)
트러스트 도메인 | 설명 |
---|---|
vCenter 트러스트 도메인 | 이 트러스트 도메인의 TLS 인증서에 대한 기본 서명자는 vCenter Server에 내장된 VMCA(VMware Certificate Authority)입니다. |
Kubernetes 트러스트 도메인 | 이 트러스트 도메인의 TLS 인증서에 대한 기본 서명자는 Kubernetes CA(인증 기관)입니다. |
TLS 인증서 순환
TLS 인증서 순환 절차는 인증서가
감독자에 사용되는지 또는 TKG 서비스 클러스터에 사용되는지에 따라 다릅니다.
- 감독자 인증서 순환
-
감독자용 TLS 인증서는 VMCA 인증서에서 파생됩니다. 감독자 인증서에 대한 자세한 내용은 KB 문서 vSphere with Tanzu 인증서 가이드를 참조하십시오.
감독자 인증서 순환은 수동입니다. WCP Cert Manager 도구를 사용하여 감독자 인증서를 교체하는 방법에 대한 지침은 KB 문서 vSphere with Tanzu 감독자 인증서 교체를 참조하십시오.
- TKG 2.0 클러스터 인증서 순환
-
일반적으로 TKG 클러스터에 대한 TLS 인증서는 수동으로 순환할 필요가 없습니다. TKG 클러스터를 업데이트하면 롤링 업데이트 프로세스가 TLS 인증서를 자동으로 순환하기 때문입니다.
TKG 클러스터에 대한 TLS 인증서가 만료되지 않았고 이러한 인증서를 수동으로 순환해야 하는 경우에는 다음 섹션의 단계를 완료하면 됩니다.
TKG 서비스 클러스터에 대한 TLS 인증서를 수동으로 순환
이 지침에서는 TKG 클러스터 관리에 대한 고급 지식과 경험이 있다고 가정합니다. 또한 이 지침에서는 TLS 인증서가 만료되지 않았다고 가정합니다. 인증서가 만료된 경우 다음 단계를 완료하지 마십시오.
- 이 단계를 실행하려면 SSH를 통해 감독자 노드 중 하나에 연결합니다. Kubernetes 관리자 및 시스템 사용자로 TKG 서비스 클러스터에 연결의 내용을 참조하십시오.
- TKG 클러스터 이름을 가져옵니다.
export CLUSTER_NAMESPACE="tkg-cluster-ns" kubectl get clusters -n $CLUSTER_NAMESPACE NAME PHASE AGE VERSION tkg-cluster Provisioned 43h
- TKG 클러스터 kubeconfig를 가져옵니다.
export CLUSTER_NAME="tkg-cluster" kubectl get secrets -n $CLUSTER_NAMESPACE $CLUSTER_NAME-kubeconfig -o jsonpath='{.data.value}' | base64 -d > $CLUSTER_NAME-kubeconfig
- TKG 클러스터 SSH 키를 가져옵니다.
kubectl get secrets -n $CLUSTER_NAMESPACE $CLUSTER_NAME-ssh -o jsonpath='{.data.ssh-privatekey}' | base64 -d > $CLUSTER_NAME-ssh-privatekey chmod 600 $CLUSTER_NAME-ssh-privatekey
- 인증서 순환 전에 환경을 확인합니다.
export KUBECONFIG=$CLUSTER_NAME-kubeconfig
kubectl get nodes -o wide
kubectl get nodes \ -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}' \ -l node-role.kubernetes.io/master= > nodes
for i in `cat nodes`; do printf "\n######\n" ssh -o "StrictHostKeyChecking=no" -i $CLUSTER_NAME-ssh-privatekey -q vmware-system-user@$i hostname ssh -o "StrictHostKeyChecking=no" -i $CLUSTER_NAME-ssh-privatekey -q vmware-system-user@$i sudo kubeadm certs check-expiration done;
이전 명령의 예제 결과:
tkg-cluster-control-plane-k8bqh [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Oct 04, 2023 23:00 UTC 363d no apiserver Oct 04, 2023 23:00 UTC 363d ca no apiserver-etcd-client Oct 04, 2023 23:00 UTC 363d etcd-ca no apiserver-kubelet-client Oct 04, 2023 23:00 UTC 363d ca no controller-manager.conf Oct 04, 2023 23:00 UTC 363d no etcd-healthcheck-client Oct 04, 2023 23:00 UTC 363d etcd-ca no etcd-peer Oct 04, 2023 23:00 UTC 363d etcd-ca no etcd-server Oct 04, 2023 23:00 UTC 363d etcd-ca no front-proxy-client Oct 04, 2023 23:00 UTC 363d front-proxy-ca no scheduler.conf Oct 04, 2023 23:00 UTC 363d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Oct 01, 2032 22:56 UTC 9y no etcd-ca Oct 01, 2032 22:56 UTC 9y no front-proxy-ca Oct 01, 2032 22:56 UTC 9y no
- TKG 2.0 클러스터에 대한 TLS 인증서를 순환합니다.
다음 단계를 진행하기 전에 컨텍스트를 다시 감독자로 전환합니다.
unset KUBECONFIG kubectl config current-context kubernetes-admin@kubernetes
kubectl get kcp -n $CLUSTER_NAMESPACE $CLUSTER_NAME-control-plane -o jsonpath='{.apiVersion}{"\n"}' controlplane.cluster.x-k8s.io/v1beta1
kubectl get kcp -n $CLUSTER_NAMESPACE $CLUSTER_NAME-control-plane NAME CLUSTER INITIALIZED API SERVER AVAILABLE REPLICAS READY UPDATED UNAVAILABLE AGE VERSION tkg-cluster-control-plane tkg-cluster true true 3 3 3 0 43h v1.21.6+vmware.1
kubectl patch kcp $CLUSTER_NAME-control-plane -n $CLUSTER_NAMESPACE --type merge -p "{\"spec\":{\"rolloutAfter\":\"`date +'%Y-%m-%dT%TZ'`\"}}" kubeadmcontrolplane.controlplane.cluster.x-k8s.io/tkg-cluster-control-plane patched
시스템 롤아웃 시작됨:kubectl get machines -n $CLUSTER_NAMESPACE NAME CLUSTER NODENAME PROVIDERID PHASE AGE VERSION tkg-cluster-control-plane-k8bqh tkg-cluster tkg-cluster-control-plane-k8bqh vsphere://420a2e04-cf75-9b43-f5b6-23ec4df612eb Running 43h v1.21.6+vmware.1 tkg-cluster-control-plane-l7hwd tkg-cluster tkg-cluster-control-plane-l7hwd vsphere://420a57cd-a1a0-fec6-a741-19909854feb6 Running 43h v1.21.6+vmware.1 tkg-cluster-control-plane-mm6xj tkg-cluster tkg-cluster-control-plane-mm6xj vsphere://420a67c2-ce1c-aacc-4f4c-0564daad4efa Running 43h v1.21.6+vmware.1 tkg-cluster-control-plane-nqdv6 tkg-cluster Provisioning 25s v1.21.6+vmware.1 tkg-cluster-workers-v8575-59c6645b4-wvnlz tkg-cluster tkg-cluster-workers-v8575-59c6645b4-wvnlz vsphere://420aa071-9ac2-02ea-6530-eb59ceabf87b Running 43h v1.21.6+vmware.1
시스템 롤아웃 완료됨:kubectl get machines -n $CLUSTER_NAMESPACE NAME CLUSTER NODENAME PROVIDERID PHASE AGE VERSION tkg-cluster-control-plane-m9745 tkg-cluster tkg-cluster-control-plane-m9745 vsphere://420a5758-50c4-3172-7caf-0bbacaf882d3 Running 17m v1.21.6+vmware.1 tkg-cluster-control-plane-nqdv6 tkg-cluster tkg-cluster-control-plane-nqdv6 vsphere://420ad908-00c2-4b9b-74d8-8d197442e767 Running 22m v1.21.6+vmware.1 tkg-cluster-control-plane-wdmph tkg-cluster tkg-cluster-control-plane-wdmph vsphere://420af38a-f9f8-cb21-e05d-c1bcb6840a93 Running 10m v1.21.6+vmware.1 tkg-cluster-workers-v8575-59c6645b4-wvnlz tkg-cluster tkg-cluster-workers-v8575-59c6645b4-wvnlz vsphere://420aa071-9ac2-02ea-6530-eb59ceabf87b Running 43h v1.21.6+vmware.1
- TKG 2.0 클러스터에 대한 수동 인증서 순환을 확인합니다.
다음 명령을 실행하여 인증서 순환을 확인합니다.
export KUBECONFIG=$CLUSTER_NAME-kubeconfig kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME tkg-cluster-control-plane-m9745 Ready control-plane,master 15m v1.21.6+vmware.1 10.244.0.55 <none> VMware Photon OS/Linux 4.19.198-1.ph3-esx containerd://1.4.11 tkg-cluster-control-plane-nqdv6 Ready control-plane,master 21m v1.21.6+vmware.1 10.244.0.54 <none> VMware Photon OS/Linux 4.19.198-1.ph3-esx containerd://1.4.11 tkg-cluster-control-plane-wdmph Ready control-plane,master 9m22s v1.21.6+vmware.1 10.244.0.56 <none> VMware Photon OS/Linux 4.19.198-1.ph3-esx containerd://1.4.11 tkg-cluster-workers-v8575-59c6645b4-wvnlz Ready <none> 43h v1.21.6+vmware.1 10.244.0.51 <none> VMware Photon OS/Linux 4.19.198-1.ph3-esx containerd://1.4.11 kubectl get nodes \ -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}' \ -l node-role.kubernetes.io/master= > nodes for i in `cat nodes`; do printf "\n######\n" ssh -o "StrictHostKeyChecking=no" -i $CLUSTER_NAME-ssh-privatekey -q vmware-system-user@$i hostname ssh -o "StrictHostKeyChecking=no" -i $CLUSTER_NAME-ssh-privatekey -q vmware-system-user@$i sudo kubeadm certs check-expiration done;
업데이트된 만료 날짜를 보여주는 예제 결과입니다.###### tkg-cluster-control-plane-m9745 [check-expiration] Reading configuration from the cluster... [check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED admin.conf Oct 06, 2023 18:18 UTC 364d no apiserver Oct 06, 2023 18:18 UTC 364d ca no apiserver-etcd-client Oct 06, 2023 18:18 UTC 364d etcd-ca no apiserver-kubelet-client Oct 06, 2023 18:18 UTC 364d ca no controller-manager.conf Oct 06, 2023 18:18 UTC 364d no etcd-healthcheck-client Oct 06, 2023 18:18 UTC 364d etcd-ca no etcd-peer Oct 06, 2023 18:18 UTC 364d etcd-ca no etcd-server Oct 06, 2023 18:18 UTC 364d etcd-ca no front-proxy-client Oct 06, 2023 18:18 UTC 364d front-proxy-ca no scheduler.conf Oct 06, 2023 18:18 UTC 364d no CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED ca Oct 01, 2032 22:56 UTC 9y no etcd-ca Oct 01, 2032 22:56 UTC 9y no front-proxy-ca Oct 01, 2032 22:56 UTC 9y no
- Kubelet 인증서를 확인합니다.
kubelet 구성의
rotateCertificates
매개 변수가 기본 구성인true
로 설정되어 있다는 가정 하에 Kubelet 인증서를 순환할 필요가 없습니다.이 구성은 다음 명령을 사용하여 확인할 수 있습니다.kubectl get nodes \ -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}' \ -l node-role.kubernetes.io/master!= > workernodes for i in `cat workernodes`; do printf "\n######\n" ssh -o "StrictHostKeyChecking=no" -i $CLUSTER_NAME-ssh-privatekey -q vmware-system-user@$i hostname ssh -o "StrictHostKeyChecking=no" -i $CLUSTER_NAME-ssh-privatekey -q vmware-system-user@$i sudo grep rotate /var/lib/kubelet/config.yaml done;
예제 결과:###### tkg-cluster-workers-v8575-59c6645b4-wvnlz rotateCertificates: true