Consulte estas instrucciones para aprovisionar un clúster de TKG basado en una ClusterClass personalizada. Tenga en cuenta que estas instrucciones son específicas para entornos de vSphere 8 U1.
Requisitos previos
El procedimiento para aprovisionar un clúster de TKG basado en una ClusterClass personalizada está disponible a partir de la versión vSphere 8 U1. Si utiliza vSphere 8 U2, consulte Ejemplo de v1beta1: clúster basado en una ClusterClass personalizada (flujo de trabajo de vSphere 8 U2 y versiones posteriores).
- Entorno de vSphere 8 U1
- Administración de cargas de trabajo habilitada
- Supervisor configurados
- Cliente de Ubuntu con Herramientas de la CLI de Kubernetes para vSphere instalado
Parte 1: Crear el ClusterClass personalizado
tanzukubernetescluster
.
- Cree un espacio de nombres de vSphere denominado custom-ns.
- Inicie sesión en Supervisor.
- Cambie el contexto al espacio de nombres de vSphere denominado custom-ns.
- Obtenga la ClusterClass predeterminada.
kubectl get clusterclass tanzukubernetescluster -o json
- Cree una ClusterClass personalizada denominada custom-cc mediante la clonación de la ClusterClass predeterminada.
kubectl get clusterclass tanzukubernetescluster -o json | jq '.metadata.name="custom-cc"' | kubectl apply -f -
Resultado esperado:clusterclass.cluster.x-k8s.io/custom-cc created
- Obtenga la ClusterClass personalizada.
kubectl get clusterclass custom-cc -o json
Si fuera necesario, puede utilizar "less" para ver la ClusterClass personalizada.
kubectl get clusterclass custom-cc -o json | less
Nota: Introduzca el comando "q" para salir de "less".
Parte 2: Crear objetos de Supervisor necesarios para aprovisionar el clúster de TKG
- Cree el emisor del certificado de extensiones autofirmado.
#self-signed-extensions-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: self-signed-extensions-issuer spec: selfSigned: {}
kubectl apply -f self-signed-extensions-issuer.yaml -n custom-ns
Resultado esperado:issuer.cert-manager.io/self-signed-extensions-issuer created
- Cree el secreto para el certificado de CA de las extensiones.
#extensions-ca-certificate.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ccc-cluster-extensions-ca spec: commonName: kubernetes-extensions duration: 87600h0m0s isCA: true issuerRef: kind: Issuer name: self-signed-extensions-issuer secretName: ccc-cluster-extensions-ca usages: - digital signature - cert sign - crl sign
kubectl apply -f extensions-ca-certificate.yaml -n custom-ns
Resultado esperado:certificate.cert-manager.io/ccc-cluster-extensions-ca created
- Cree el emisor del certificado de CA de las extensiones.
#extensions-ca-issuer.yaml apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: ccc-cluster-extensions-ca-issuer spec: ca: secretName: ccc-cluster-extensions-ca
kubectl apply -f extensions-ca-issuer.yaml -n custom-ns
Resultado esperado:issuer.cert-manager.io/ccc-cluster-extensions-ca-issuer created
- Cree el secreto para el certificado del servicio de autenticación.
#auth-svc-cert.yaml apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ccc-cluster-auth-svc-cert spec: commonName: authsvc dnsNames: - authsvc - localhost - 127.0.0.1 duration: 87600h0m0s issuerRef: kind: Issuer name: ccc-cluster-extensions-ca-issuer secretName: ccc-cluster-auth-svc-cert usages: - server auth - digital signature
kubectl apply -f auth-svc-cert.yaml -n custom-ns
Resultado esperado:certificate.cert-manager.io/ccc-cluster-auth-svc-cert created
- Compruebe la creación de los emisores y los certificados.
kubectl get issuers -n custom-ns NAME READY AGE ccc-cluster-extensions-ca-issuer True 2m57s self-signed-extensions-issuer True 14m
kubectl get certs -n custom-ns NAME READY SECRET AGE ccc-cluster-auth-svc-cert True ccc-cluster-auth-svc-cert 34s ccc-cluster-extensions-ca True ccc-cluster-extensions-ca 5m
Parte 3: Crear un clúster de TKG basado en la ClusterClass personalizada
Variable | Descripción |
---|---|
vmClass | Consulte Uso de clases de máquinas virtuales con clústeres de Servicio TKG. |
storageClass | Consulte Configurar el almacenamiento persistente para el espacio de nombres de vSphere. |
ntp | Servidor NTP utilizado para habilitar Supervisor. |
extensionCert | Se genera automáticamente después de crear el "certificado de CA de extensiones" en la sección anterior. |
clusterEncryptionConfigYaml | la siguiente sección revisará el proceso de obtención de este archivo |
- Cree el secreto de cifrado.
#encryption-secret.yaml apiVersion: v1 data: key: all3dzZpODFmRmh6MVlJbUtQQktuN2ViQzREbDBQRHlxVk8yYXRxTW9QQT0= kind: Secret metadata: name: ccc-cluster-encryption type: Opaque
kubectl apply -f encryption-secret.yaml -n custom-ns
Resultado esperado:secret/ccc-cluster-encryption created
- Recopile el servidor NTP de Supervisor.
kubectl -n vmware-system-vmop get configmap vmoperator-network-config -o jsonpath={.data.ntpservers}
- Cree el manifiesto de
cluster-with-ccc.yaml
para aprovisionar el clúster.#cluster-with-ccc.yaml apiVersion: cluster.x-k8s.io/v1beta1 kind: Cluster metadata: name: ccc-cluster spec: clusterNetwork: pods: cidrBlocks: - 193.0.0.0/16 serviceDomain: managedcluster1.local services: cidrBlocks: - 198.201.0.0/16 topology: class: custom-cc version: v1.26.5---vmware.2-fips.1-tkg.1 controlPlane: metadata: {} replicas: 3 workers: machineDeployments: - class: node-pool metadata: { } name: node-pool-workers replicas: 3 variables: - name: vmClass value: guaranteed-medium - name: storageClass value: tkg-storage-profile - name: ntp value: time.acme.com - name: extensionCert value: contentSecret: key: tls.crt name: ccc-cluster-extensions-ca - name: clusterEncryptionConfigYaml value: LS0tCm...Ht9Cg==
En el manifiesto del clúster, compruebe o actualice los siguientes campos:Parámetro Descripción metadata.name
Nombre del clúster v1beta1. spec.topology.class
Nombre de la ClusterClass personalizada. spec.topology.version
Versión de versión de Tanzu Kubernetes spec.topology.variables.storageClass.value
StoragePolicy asociada al espacio de nombres de vSphere en el que se aprovisionará el clúster spec.topology.variables.ntp.value
Dirección del servidor NTP spec.topology.variables.extensionCert.value.contentSecret.name
Verificar spec.topology.variables.clusterEncryptionConfigYaml.value
Rellene con el valor de data.key
del secreto ClusterEncryptionConfig - Cree el clúster en función de la ClusterClass personalizada.
kubectl apply -f cluster-with-ccc.yaml -n custom-ns
Resultado esperado:cluster.cluster.x-k8s.io/ccc-cluster created
Mediante vSphere Client, compruebe que se ha creado el clúster.
- Inicie sesión en el clúster de TKG.
kubectl vsphere login --server=xxx.xxx.xxx.xxx --vsphere-username [email protected] --tanzu-kubernetes-cluster-name ccc-cluster --tanzu-kubernetes-cluster-namespace custom-ns
Parte 4: Crear objetos de Supervisor necesarios para administrar el clúster de TKG
Parámetro | Valor |
---|---|
Autenticación | Los valores de autenticación deben recopilarse y actualizarse en un archivo denominado values.yaml |
Codificado en Base64 | El archivo values.yaml se codificará en forma de cadena en base64 |
guest-cluster-auth-service-data-values.yaml | Esta cadena se agregará al archivo guest-cluster-auth-service-data-values.yaml descargado de CCC_config_yamls.tar.gz antes de aplicar el archivo |
Secreto GuestClusterAuthSvcDataValues | Por último, el arranque del clúster invitado debe modificarse para que haga referencia al secreto GuestClusterAuthSvcDataValues recién creado. |
- Cambie el contexto a la instancia de espacio de nombres de vSphere en la que se aprovisiona el clúster.
kubectl config use-context custom-ns
- Obtenga el valor de
authServicePublicKeys
.kubectl -n vmware-system-capw get configmap vc-public-keys -o jsonpath="{.data.vsphere\.local\.json}"
Copie el resultado en un archivo de texto denominadovalues.yaml
.authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}'
- Obtenga el UID del clúster para actualizar las
authServicePublicKeys
.kubectl get cluster -n custom-ns ccc-cluster -o yaml | grep uid
- En la sección
authServicePublicKeys
del archivovalues.yaml
, anexe el UID del clúster al valor "client_id
".Sintaxis:
vmware-tes:vc:vns:k8s:clusterUID
Por ejemplo:vmware-tes:vc:vns:k8s:7d95b50b-4fd4-4642-82a3-5dbfe87f499c
- Obtenga el valor del certificado (reemplace ccc-cluster por el nombre de clúster seleccionado).
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.crt}" | base64 -d
- Agregue el certificado a
values.yaml
.Agregue el contenido del certificado debajo de la sección
authServicePublicKeys
.Nota: El certificado debe tener una sangría de 4 espacios para evitar errores.Por ejemplo:authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}' ceritificate: | -----BEGIN CERTIFICATE----- MIIDPTCCAiWgAwIBAgIQMibGSjeuJelQoPxCof/+xzANBgkqhkiG9w0BAQsFADAg ... sESk/RDTB1UAvi8PD3zcbEKZuRxuo4IAJqFFbAabwULhjUo0UwT+dIJo1gLf5/ep VoIRJS7j6VT98WbKyZp5B4I= -----END CERTIFICATE-----
- Obtenga el valor de privateKey.
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.key}"
- Compruebe su archivo
values.yaml
.authServicePublicKeys: '{"issuer_url":"https://10.197.79.141/openidconnect/vsphere.local","client_id":"vmware-tes:vc:vns:k8s:7d95...499c",...SShrDw=="]}]}}' certificate: | -----BEGIN CERTIFICATE----- MIIDPTCCAiWgAwIBAgIQWQyXAQDRMhgrGre8ysVN0DANBgkqhkiG9w0BAQsFADAg ... uJSBP49sF0nKz5nf7w+BdYE= -----END CERTIFICATE----- privateKey: LS0tLS1CRUdJTi...VktLS0tLQo=
- Obtenga el valor hash del archivo
values.yaml
para la codificación en Base64 para recopilar la salida del archivoguest-cluster-auth-service-data-values.yaml
.base64 -i values.yaml -w 0
- Cree el archivo
guest-cluster-auth-service-data-values.yaml
.A continuación se muestra una plantilla para el secreto.apiVersion: v1 data: values.yaml: YXV0a...ExRbz0K kind: Secret metadata: labels: tkg.tanzu.vmware.com/cluster-name: ccc-cluster tkg.tanzu.vmware.com/package-name: guest-cluster-auth-service.tanzu.vmware.com.1.3.0+tkg.2-vmware name: ccc-cluster-guest-cluster-auth-service-data-values type: Opaque
Consulte la siguiente tabla para rellenar los valores secretos esperados.Parámetro Valor data.values.yaml
Cadena de
values.yaml
codificada en Base64metadata.labels.cluster-name
Nombre del clúster, como
ccc-cluster
metadata.labels.package-name
guest-cluster-auth-service.tanzu.vmware.com.version
Para obtener este valor, ejecute el comando
kubectl get tkr v1.26.5---vmware.2-fips.1-tkg.1 -o yaml
Cambie la versión de TKR según la versión que esté utilizando
metadata.name
Nombre del clúster, como
ccc-cluster
- Cree el secreto
guest-cluster-auth-service-data-values.yaml
.kubectl apply -f guest-cluster-auth-service-data-values.yaml -n custom-ns
- Edite el arranque del clúster para hacer referencia al secreto.
kubectl edit clusterbootstrap ccc-cluster -n custom-ns
- Agregue las siguientes líneas debajo de la línea
guest-cluster-auth-service.tanzu.vmware.com.version:
.valuesFrom: secretRef: ccc-cluster-guest-cluster-auth-service-data-values
Por ejemplo:spec: additionalPackages: - refName: guest-cluster-auth-service.tanzu.vmware.com.1.3.0+tkg.2-vmware valuesFrom: secretRef: ccc-cluster-guest-cluster-auth-service-data-values
- Guarde y salga para aplicar las modificaciones de clusterbootstrap.
Parte 5: Configurar la seguridad de pods
Si utiliza TKR 1.25 y versiones posteriores, configure la seguridad de pods para el espacio de nombres de vSphere denominado custom-ns
. Consulte Configurar PSA para TKR 1.25 y versiones posteriores.
- Recopile el kubeconfig del clúster de TKG.
kubectl -n custom-ns get secret ccc-cluster-kubeconfig -o jsonpath="{.data.value}" | base64 -d > ccc-cluster-kubeconfig
- Cree el archivo
psp.yaml
.apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: tanzu-system-kapp-ctrl-restricted spec: privileged: false allowPrivilegeEscalation: false requiredDropCapabilities: - ALL volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim hostNetwork: false hostIPC: false hostPID: false runAsUser: rule: MustRunAsNonRoot seLinux: rule: RunAsAny supplementalGroups: rule: MustRunAs ranges: - min: 1 max: 65535 fsGroup: rule: MustRunAs ranges: - min: 1 max: 65535 readOnlyRootFilesystem: false
- Aplique la directiva de seguridad de pods.
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f psp.yaml
- Inicie sesión en el clúster de TKG.
kubectl vsphere login --server=10.197.154.66 --vsphere-username [email protected] --insecure-skip-tls-verify --tanzu-kubernetes-cluster-name ccc-cluster --tanzu-kubernetes-cluster-namespace custom-ns
- Enumere los espacios de nombres.
KUBECONFIG=ccc-cluster-kubeconfig kubectl get ns -A
NAME STATUS AGE default Active 13d kube-node-lease Active 13d kube-public Active 13d kube-system Active 13d secretgen-controller Active 13d tkg-system Active 13d vmware-system-antrea Active 13d vmware-system-cloud-provider Active 13d vmware-system-csi Active 13d vmware-system-tkg Active 13d
Parte 6: Sincronizar funciones de SSO de vSphere con el clúster de TKG personalizado
El objeto Rolebinding para los usuarios de vCenter Single Sign-On que están integrados en los espacios de nombres de vSphere debe sincronizarse desde Supervisor con el clúster de TKG para que los desarrolladores administren las cargas de trabajo del clúster.
sync-cluster-edit-rolebinding.yaml
y, a continuación, se aplique al clúster de TKG mediante su KUBECONFIG.
- Recopile los RoleBindings existentes en Supervisor.
kubectl get rolebinding -n custom-ns -o yaml
- En la lista de objetos RoleBinding devuelta, identifique los que tengan
roleRef.name
igual a "editar".Por ejemplo:apiVersion: v1 items: - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T18:44:45Z" name: ccc-cluster-8lr5x-ccm namespace: custom-ns ownerReferences: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 blockOwnerDeletion: true controller: true kind: ProviderServiceAccount name: ccc-cluster-8lr5x-ccm uid: b5fb9f01-9a55-4f69-8673-fadc49012994 resourceVersion: "108766602" uid: eb93efd4-ae56-4d9f-a745-d2782885e7fb roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ccc-cluster-8lr5x-ccm subjects: - kind: ServiceAccount name: ccc-cluster-8lr5x-ccm namespace: custom-ns - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T18:44:45Z" name: ccc-cluster-8lr5x-pvcsi namespace: custom-ns ownerReferences: - apiVersion: vmware.infrastructure.cluster.x-k8s.io/v1beta1 blockOwnerDeletion: true controller: true kind: ProviderServiceAccount name: ccc-cluster-8lr5x-pvcsi uid: d9342f8f-13d2-496d-93cb-b24edfacb5c1 resourceVersion: "108766608" uid: fd1820c7-7993-4299-abb7-bb67fb17f1fd roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ccc-cluster-8lr5x-pvcsi subjects: - kind: ServiceAccount name: ccc-cluster-8lr5x-pvcsi namespace: custom-ns - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T16:58:06Z" labels: managedBy: vSphere name: wcp:custom-ns:group:vsphere.local:administrators namespace: custom-ns resourceVersion: "108714148" uid: d74a98c7-e7da-4d71-b1d5-deb60492d429 roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected] - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: "2023-08-25T16:58:21Z" labels: managedBy: vSphere name: wcp:custom-ns:user:vsphere.local:administrator namespace: custom-ns resourceVersion: "108714283" uid: 07f7dbba-2670-4100-a59b-c09e4b2edd6b roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: sso:[email protected] kind: List metadata: resourceVersion: ""
- Cree un archivo denominado
sync-cluster-edit-rolebinding.yaml
para agregar los RoleBindings adicionales que no sean el valor predeterminado [email protected]. Por ejemplo:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: run.tanzu.vmware.com/vmware-system-synced-from-supervisor: "yes" name: vmware-system-auth-sync-wcp:custom-ns:group:vsphere.local:administrators roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected] apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: run.tanzu.vmware.com/vmware-system-synced-from-supervisor: "yes" name: vmware-system-auth-sync-wcp:custom-ns:group:SSODOMAIN.COM:testuser roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: sso:[email protected]
Nota: En el campometadata.name
, la función de usuario se antepone convmware-system-auth-sync-
para todos los usuarios. Las entradas metadata.name y subjects.name requerirán modificaciones para todas las funciones no predeterminadas. - Aplique la configuración sync-cluster-edit-rolebinding.yaml para sincronizar los RoleBindings.
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f sync-cluster-edit-rolebinding.yaml