Reportez-vous à ces instructions pour provisionner un cluster TKG basé sur une ClusterClass personnalisée. Notez que ces instructions sont spécifiques aux environnements vSphere 8 U1.
Conditions requises
La procédure de provisionnement d'un cluster TKG basé sur une ClusterClass personnalisée est disponible à partir de la version vSphere 8 U1. Si vous utilisez vSphere 8 U2, reportez-vous à la section Exemple v1beta1 : cluster basé sur une ClusterClass personnalisée (workflow vSphere 8 U2 et ultérieur).
- Environnement vSphere 8 U1
- Gestion de la charge de travail activée
- Superviseur configuré
- Client Ubuntu avec Outils de l'interface de ligne de commande Kubernetes pour vSphere installé
Partie 1 : Créer une ClusterClass personnalisée
tanzukubernetescluster
.
- Créez un Espace de noms vSphere nommé custom-ns.
- Connectez-vous à Superviseur.
- Basculez le contexte sur l'Espace de noms vSphere nommé custom-ns.
- Obtenir la ClusterClass par défaut.
kubectl get clusterclass tanzukubernetescluster -o json
- Créez une ClusterClass personnalisée nommée custom-cc en clonant la ClusterClass par défaut.
kubectl get clusterclass tanzukubernetescluster -o json | jq '.metadata.name="custom-cc"' | kubectl apply -f -
Résultat attendu :clusterclass.cluster.x-k8s.io/custom-cc created
- Obtenez la ClusterClass personnalisée.
kubectl get clusterclass custom-cc -o json
Si nécessaire, vous pouvez utiliser l'affichage less pour afficher la ClusterClass personnalisée.
kubectl get clusterclass custom-cc -o json | less
Note : Exécutez la commande « q » pour quitter l'affichage less.
Étape 2 : Créer les objets Superviseur requis pour provisionner le cluster TKG
- Créez l'émetteur du certificat d'extensions auto-signé.
#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
Résultat attendu :issuer.cert-manager.io/self-signed-extensions-issuer created
- Créez le secret pour le certificat d'autorité de certification des extensions.
#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
Résultat attendu :certificate.cert-manager.io/ccc-cluster-extensions-ca created
- Créez l'émetteur pour le certificat d'autorité de certification des extensions.
#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
Résultat attendu :issuer.cert-manager.io/ccc-cluster-extensions-ca-issuer created
- Créez le secret pour le certificat du service d'authentification.
#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
Résultat attendu :certificate.cert-manager.io/ccc-cluster-auth-svc-cert created
- Vérifiez la création des émetteurs et des certificats.
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
Étape 3 : créer un cluster TKG basé sur la ClusterClass personnalisée
Variable | Description |
---|---|
vmClass | Reportez-vous à la section Utilisation de classes de machines virtuelles avec des clusters de Service TKG. |
storageClass | Reportez-vous à la section Configurer le stockage persistant pour l'Espace de noms vSphere. |
ntp | Serveur NTP utilisé pour activer le Superviseur. |
extensionCert | Généré automatiquement après la création du « certificat d'extension de l'autorité de certification » dans la section précédente. |
clusterEncryptionConfigYaml | la section ci-dessous décrit le processus d'obtention de ce fichier |
- Créez le secret de chiffrement.
#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
Résultat attendu :secret/ccc-cluster-encryption created
- Récupérez le serveur NTP à partir du Superviseur.
kubectl -n vmware-system-vmop get configmap vmoperator-network-config -o jsonpath={.data.ntpservers}
- Construisez le manifeste
cluster-with-ccc.yaml
pour provisionner le cluster.#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==
Dans le manifeste du cluster, vérifiez ou mettez à jour les champs suivants :Paramètre Description metadata.name
Nom du cluster v1beta1. spec.topology.class
Nom de la ClusterClass personnalisée. spec.topology.version
Version de Version de Tanzu Kubernetes spec.topology.variables.storageClass.value
Stratégie de stockage attachée à l'Espace de noms vSphere dans lequel le cluster sera provisionné spec.topology.variables.ntp.value
Adresse du serveur NTP spec.topology.variables.extensionCert.value.contentSecret.name
Vérifier spec.topology.variables.clusterEncryptionConfigYaml.value
Remplissez la valeur data.key
avec la valeur du secret ClusterEncryptionConfig. - Créez le cluster en fonction de la ClusterClass personnalisée.
kubectl apply -f cluster-with-ccc.yaml -n custom-ns
Résultat attendu :cluster.cluster.x-k8s.io/ccc-cluster created
À l'aide de vSphere Client, vérifiez que le cluster est créé.
- Connectez-vous au cluster 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
Partie 4 : Créer les objets de Superviseur requis pour gérer un cluster TKG
Paramètre | Valeur |
---|---|
Authentification | Les valeurs d'authentification doivent être collectées et mises à jour dans un fichier nommé values.yaml |
Codé en Base64 | Le fichier values.yaml sera codé dans une chaîne base64 |
guest-cluster-auth-service-data-values.yaml | Cette chaîne sera ajoutée au fichier guest-cluster-auth-service-data-values.yaml téléchargé à partir de CCC_config_yamls.tar.gz avant d'appliquer le fichier. |
Secret GuestClusterAuthSvcDataValues | Enfin, le fichier de démarrage du cluster invité doit être modifié pour référencer le secret GuestClusterAuthSvcDataValues récemment créé. |
- Changez de contexte pour utiliser l'Espace de noms vSphere où le cluster est provisionné.
kubectl config use-context custom-ns
- Obtenez la valeur
authServicePublicKeys
.kubectl -n vmware-system-capw get configmap vc-public-keys -o jsonpath="{.data.vsphere\.local\.json}"
Copiez le résultat dans un fichier texte nommévalues.yaml
.authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}'
- Obtenez l'UID du cluster pour mettre à jour
authServicePublicKeys
.kubectl get cluster -n custom-ns ccc-cluster -o yaml | grep uid
- Dans la section
authServicePublicKeys
du fichiervalues.yaml
, ajoutez l'UID du cluster à la valeur «client_id
».Syntaxe :
vmware-tes:vc:vns:k8s:clusterUID
Par exemple :vmware-tes:vc:vns:k8s:7d95b50b-4fd4-4642-82a3-5dbfe87f499c
- Obtenez la valeur de certificat (remplacez ccc-cluster par le nom de cluster choisi).
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.crt}" | base64 -d
- Ajoutez le certificat au fichier
values.yaml
.Ajoutez le contenu du certificat sous la section
authServicePublicKeys
.Note : Le certificat doit comporter 4 espaces en retrait pour éviter un échec.Par exemple :authServicePublicKeys: '{"issuer_url":"https://...SShrDw=="]}]}}' ceritificate: | -----BEGIN CERTIFICATE----- MIIDPTCCAiWgAwIBAgIQMibGSjeuJelQoPxCof/+xzANBgkqhkiG9w0BAQsFADAg ... sESk/RDTB1UAvi8PD3zcbEKZuRxuo4IAJqFFbAabwULhjUo0UwT+dIJo1gLf5/ep VoIRJS7j6VT98WbKyZp5B4I= -----END CERTIFICATE-----
- Obtenez la valeur privateKey.
kubectl -n custom-ns get secret ccc-cluster-auth-svc-cert -o jsonpath="{.data.tls\.key}"
- Vérifiez votre fichier
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=
- Hachez le fichier
values.yaml
en utilisant le codage Base64 pour collecter la sortie du fichierguest-cluster-auth-service-data-values.yaml
.base64 -i values.yaml -w 0
- Créez le fichier
guest-cluster-auth-service-data-values.yaml
.Voici un modèle pour le secret.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
Reportez-vous au tableau suivant pour remplir les valeurs secrètes attendues.Paramètre Valeur data.values.yaml
Chaîne codée en Base64 de
values.yaml
metadata.labels.cluster-name
Nom du cluster, tel que
ccc-cluster
metadata.labels.package-name
guest-cluster-auth-service.tanzu.vmware.com.version
Pour obtenir cette valeur, exécutez la commande
kubectl get tkr v1.26.5---vmware.2-fips.1-tkg.1 -o yaml
Modifier la version de TKR en fonction de la version que vous utilisez
metadata.name
Nom du cluster, tel que
ccc-cluster
- Créez le secret
guest-cluster-auth-service-data-values.yaml
.kubectl apply -f guest-cluster-auth-service-data-values.yaml -n custom-ns
- Modifiez le fichier de démarrage du cluster pour référencer le secret.
kubectl edit clusterbootstrap ccc-cluster -n custom-ns
- Ajoutez les lignes suivantes sous la ligne
guest-cluster-auth-service.tanzu.vmware.com.version :
.valuesFrom: secretRef: ccc-cluster-guest-cluster-auth-service-data-values
Par exemple :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
- Enregistrez et quittez pour appliquer les modifications de clusterbootstrap.
Partie 5 : Configurer la sécurité de l'espace
Si vous utilisez TKR versions 1.25 et ultérieures, configurez la sécurité de l'espace pour l'Espace de noms vSphere nommé custom-ns
. Reportez-vous à la section Configurer PSA pour TKR 1.25 et versions ultérieures.
- Obtenez le fichier kubeconfig du cluster TKG.
kubectl -n custom-ns get secret ccc-cluster-kubeconfig -o jsonpath="{.data.value}" | base64 -d > ccc-cluster-kubeconfig
- Créez le fichier
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
- Appliquer la stratégie de sécurité de l'espace.
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f psp.yaml
- Connectez-vous au cluster 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
- Répertoriez les espaces de noms.
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
Partie 6 : synchroniser les rôles SSO vSphere avec le cluster TKG personnalisé
La liaison RoleBinding pour les utilisateurs vCenter Single Sign-On créés dans l'Espaces de noms vSphere doit être synchronisée entre le Superviseur et le cluster TKG pour que les développeurs puissent gérer les charges de travail du cluster.
sync-cluster-edit-rolebinding.yaml
, puis l'application au cluster TKG à l'aide de son fichier kubeconfig.
- Collectez les liaisons RoleBinding existantes à partir du Superviseur.
kubectl get rolebinding -n custom-ns -o yaml
- Dans la liste d'objets RoleBindings renvoyée, identifiez ceux dont le
roleRef.name
est égal à « edit ».Par exemple :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: ""
- Créez un fichier nommé
sync-cluster-edit-rolebinding.yaml
pour ajouter toutes les liaisons RoleBinding supplémentaires autres que la valeur par défaut [email protected]. Par exemple :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]
Note : Dans le champmetadata.name
, le rôle d'utilisateur est précédé devmware-system-auth-sync-
pour tous les utilisateurs. Les entrées metadata.name et subjects.name devront être modifiées pour tous les rôles autres que les rôles par défaut. - Appliquez la configuration sync-cluster-edit-rolebinding.yaml pour synchroniser les liaisons RoleBindings.
KUBECONFIG=ccc-cluster-kubeconfig kubectl apply -f sync-cluster-edit-rolebinding.yaml