In diesem Thema wird erläutert, wie Sie persistente Volumes und Speicherklassen verwenden, um dynamischen Speicher für Arbeitslastcluster von Tanzu Kubernetes Grid (TKG) zu implementieren.
Innerhalb eines Kubernetes-Clusters stellen PV-Objekte PersistentVolume
(PV) gemeinsam genutzten Speicher für Cluster-Pods bereit, die von Pod-Lebenszyklen nicht betroffen sind. Speicher wird dem PV über ein PVC-Objekt (PersistentVolumeClaim
) bereitgestellt, das definiert, wie viel und wie der Pod auf den zugrunde liegenden Speicher zugreift. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter Persistent Volumes.
Clusteradministratoren können StorageClass
-Objekte definieren, mit denen Clusterbenutzer dynamisch PVC- und PV-Objekte mit unterschiedlichen Speichertypen und Regeln erstellen können. Tanzu Kubernetes Grid bietet auch Standardobjekte StorageClass
, mit denen Benutzer persistenten Speicher in einer schlüsselfertigen Umgebung bereitstellen können.
StorageClass
-Objekte enthalten ein Feld provisioner
, das das interne oder externe Dienst-Plug-In identifiziert, das PVs bereitstellt, sowie ein Feld parameters
, das die Kubernetes-Speicherklasse mit auf Infrastrukturebene definierten Speicheroptionen verknüpft, wie z. B. VM-Speicherrichtlinien in vSphere. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter Storage Classes.
Tanzu Kubernetes Grid unterstützt StorageClass
-Objekte für verschiedene Speichertypen, die von Kubernetes-internen („In-Tree“)- oder externen Plug-Ins („Out-of-Tree“) bereitgestellt werden.
Speichertypen
HinweisvSphere CSI bietet keine Unterstützung für Storage DRS und unterstützt Storage vMotion mit Bedingungen, die in der vSphere CSI-Dokumentation unter vSphere Functionality Supported by vSphere Container Storage Plug-in beschrieben sind.
vSphere CSI unterstützt Storage vMotion mit Bedingungen. Weitere Einzelheiten finden Sie im CSI-Dokument.
Informationen zu vSphere CNS-, Amazon EBS- und Azure Disk-Standardspeicherklassen finden Sie unter Standardspeicherklassen.
Externe Bereitstellung
In TKG v2.3 verwenden alle Standardspeicherklassen die externe Speicherbereitstellung („Out-of-Tree“) und nicht die Bereitstellung in der Struktur („In-Tree“).
provisioner
-Werte des StorageClass
-Objekts werden nicht kubernetes.io
vorangestellt.Tanzu Kubernetes Grid stellt StorageClass
-Standardobjekte bereit, mit denen Benutzer von Arbeitslastclustern persistenten Speicher in ihrer Infrastruktur in einer schlüsselfertigen Umgebung bereitstellen können, ohne dass StorageClass
-Objekte, die von einem Clusteradministrator erstellt wurden, benötigt werden.
Die Variable ENABLE_DEFAULT_STORAGE_CLASS
ist in der Clusterkonfigurationsdatei, die an die --file
-Option von tanzu cluster create
übergeben wurde, standardmäßig auf true
gesetzt, um die Standardspeicherklasse für einen Arbeitslastcluster zu aktivieren.
WichtigÄndern Sie die standardmäßigen Speicherklassendefinitionen nicht. Um eine Speicherklasse anzupassen, erstellen Sie eine neue
StorageClass
-Definition mit einem anderenname
, anstatt das von TKG erstellte Standardobjekt zu ändern.
Die Standarddefinitionen von Tanzu Kubernetes Grid für Speicherklassen sind:
vSphere CNS
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: default
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: csi.vsphere.vmware.com
parameters:
storagePolicyName: optional
Weitere Informationen finden Sie in den vSphere CSI-Speicherklassenparametern in der Kubernetes-Dokumentation.
Amazon EBS
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: default
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
Weitere Informationen finden Sie in den Speicherklassenparametern unter Amazon-EBS-CSI-Treiber in der AWS-Dokumentation.
Azure-Festplatte
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: default
annotations:
storageclass.beta.kubernetes.io/is-default-class: "true"
labels:
kubernetes.io/cluster-service: "true"
provisioner: disk.csi.azure.com
parameters:
kind: Managed
storageaccounttype: Standard_LRS
cachingmode: ReadOnly
volumeBindingMode: WaitForFirstConsumer
Weitere Informationen finden Sie in den Speicherklassenparametern unter CSI-Treiber für Azure-Datenträger in der Azure-Dokumentation.
Azure-Datei
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: azure-file
labels:
kubernetes.io/cluster-service: "true"
provisioner: file.csi.azure.com
mountOptions:
- dir_mode=0777
- file_mode=0777
- uid=0
- gid=0
- mfsymlinks
- cache=strict
- actimeo=30
allowVolumeExpansion: true
parameters:
skuName: Premium_LRS
Weitere Informationen finden Sie in den Speicherklassenparametern unter Azure-Datei in der Kubernetes-Dokumentation.
vSphere-Administratoren können vSphere CNS einrichten und Speicherrichtlinien für VMDK-Speicher (Virtual Disk Storage) basierend auf den Anforderungen von Tanzu Kubernetes Grid-Clusterbenutzern erstellen.
Sie können entweder vSAN oder lokales VMFS (Virtual Machine File System) für persistenten Speicher in einem Kubernetes-Cluster wie folgt verwenden:
vSAN-Speicher:
Um eine Speicherrichtlinie für vSAN-Speicher im vSphere Client zu erstellen, navigieren Sie zu Startseite (Home) > Richtlinien und Profile (Policies and Profiles) > VM-Speicherrichtlinien (VM Storage Policies) und klicken Sie auf Erstellen (Create), um den Assistenten VM-Speicherrichtlinie erstellen (Create VM Storage Policy) zu starten.
Befolgen Sie die Anweisungen unter Erstellen einer Speicherrichtlinie für Kubernetes in der vSphere-Dokumentation. Stellen Sie Folgendes sicher:
storagePolicyName
-Wert in StorageClass
-Objekten.Lokaler VMFS-Speicher:
Um eine Speicherrichtlinie für den lokalen Speicher zu erstellen, wenden Sie ein Tag auf den Speicher an und erstellen Sie wie folgt eine Speicherrichtlinie basierend auf dem Tag:
Wählen Sie aus dem vSphere-Menü ganz oben Tags und benutzerdefinierte Attribute (Tags & Custom Attributes).
Wählen Sie im Fensterbereich Tags die Option Kategorien (Categories) aus und klicken Sie auf Neu (New).
Geben Sie einen Kategorienamen ein, z. B. tkg-storage
. Verwenden Sie die Kontrollkästchen, um ihn mit Datencenter (Datacenter) und den Speicherobjekten Ordner (Folder) und Datenspeicher (Datastore) zu verknüpfen. Klicken Sie auf Erstellen.
Wählen Sie in der Ansicht Speicher (Storage) ganz oben Ihr VMFS-Volume aus und klicken Sie im Fensterbereich Übersicht (Summary) auf Tags > Zuweisen (Assign)….
Klicken Sie im Popup-Fenster Tag zuweisen (Assign Tag) auf Tag hinzufügen (Add Tag).
Geben Sie im Popup-Fenster Tag erstellen (Create Tag) einen Namen für das Tag ein, z. B. tkg-storage-ds1
, und weisen Sie ihm die von Ihnen erstellte Kategorie unter Kategorie (Category) zu. Klicken Sie auf OK.
Wählen Sie unter Tag zuweisen (Assign Tag) das Tag aus und klicken Sie auf Zuweisen (Assign).
Wählen Sie in vSphere ganz oben VM-Speicherrichtlinien (VM Storage Policies) > Speicherrichtlinie erstellen (Create a Storage Policy) aus. Es wird ein Konfigurationsassistent gestartet.
Geben Sie im Fensterbereich Name und Beschreibung (Name and description) einen Namen für Ihre Speicherrichtlinie ein. Notieren Sie sich den Namen der Speicherrichtlinie zu Referenzzwecken als storagePolicyName
-Wert in StorageClass
-Objekten.
Aktivieren Sie im Fensterbereich Richtlinienstruktur (Policy structure) unter Datenspeicherspezifische Regeln (Datastore specific rules) die Option Tag-basierte Platzierungsregeln aktivieren (Enable tag-based placement rules).
Klicken Sie im Fensterbereich Tag-basierte Platzierung (Tag based placement) auf Tag-Regel hinzufügen (Add Tag Rule) und konfigurieren Sie Folgendes:
Use storage tagged with
Bestätigen und konfigurieren Sie andere Fensterbereiche oder übernehmen Sie nach Bedarf Standardeinstellungen und klicken Sie dann auf Überprüfen und fertig stellen (Review and finish). Beenden Sie über Fertigstellen (Finish) den Vorgang, um die Speicherrichtlinie zu erstellen.
Clusteradministratoren können eine neue Speicherklasse wie folgt erstellen:
StorageClass
verwendet werden soll.
StorageClass
-Konfiguration als .yaml
-Datei mit provisioner
, parameters
und anderen Optionen.
storagePolicyName
auf den Namen der vSphere Speicherrichtlinie als Zeichenfolge mit doppelten Anführungszeichen setzen.kubectl create -f
.kubectl describe storageclass <storageclass metadata.name>
ausführen.Ein Beispiel finden Sie unter Enabling Dynamic Provisioning in der Kubernetes-Dokumentation.
Informationen und Ressourcen zu vSphere CSI finden Sie in der Dokumentation zum VMware vSphere Container Storage Plug-In.
Um persistenten Speicher für ihre Clusterknoten bereitzustellen, der keine der oben beschriebenen Standardspeicherklassen verwendet, fügen Clusterbenutzer wie folgt eine benutzerdefinierte Speicherklasse in eine Pod-Konfiguration ein:
Legen Sie den Kontext von kubectl
auf den Cluster fest. Beispiel:
kubectl config use-context my-cluster-admin@my-cluster
Wählen Sie eine Speicherklasse aus oder erstellen Sie sie.
kubectl get storageclass
aus.Erstellen Sie einen PVC und das zugehörige PV:
PersistentVolumeClaim
-Konfiguration als .yaml
-Datei mit spec.storageClassName
-Option, die auf den Wert metadata.name
Ihres StorageClass
-Objekt gesetzt ist. Ein Beispiel finden Sie unter Enabling Dynamic Provisioning in der Kubernetes-Dokumentation.kubectl create -f
.kubectl describe pvc <pvc metadata.name>
aus, um den PVC zu überprüfen.kubectl describe pvc
nach der Meldung Successfully provisioned volume
aufgeführt wird.kubectl describe pv <pv unique name>
aus, um den PV zu überprüfen.Erstellen Sie einen Pod mithilfe des PVC:
Pod
-Konfiguration als .yaml
-Datei, die spec.volumes
so festlegt, dass Ihr PVC unter persistentVolumeClaim.claimName
enthalten ist. Ein Beispiel finden Sie unter Dynamically Provision a Block Volume with vSphere Container Storage Plug-In in der Dokumentation zum vSphere Container Storage Plug-In.kubectl create -f
.kubectl get pod <pod metadata.name>
aus, um den Pod zu überprüfen.Um die Volumeerweiterung für vSphere CSI-Speicher, der von Arbeitslastclustern verwendet wird, zu aktivieren, müssen Sie einen csi-resizer
-Sidecar-Pod zu den CSI-Prozessen des Clusters hinzufügen.
Die CSI-Konfiguration für Arbeitslastcluster ist als geheimer Kubernetes-Schlüssel codiert. Bei diesem Verfahren wird der Prozess csi-resizer
hinzugefügt, indem der geheime CSI-Konfigurationsschlüssel überarbeitet wird. Dabei wird dem geheimen Schlüssel eine stringData
-Definition hinzugefügt, die zwei codierte Konfigurationsdatenzeichenfolgen kombiniert: eine values.yaml
-Zeichenfolge, die die vorherigen CSI-Konfigurationsdaten des geheimen Schlüssels enthält, und eine neue overlays.yaml
-Zeichenfolge, die den csi-resizer
-Pod bereitstellt.
HinweisDie Online-Erweiterung von Volumes wird in vSphere 7.0 ab Update 2 unterstützt. Weitere Informationen finden Sie unter Volume-Erweiterung in vSphere with Tanzu.
Melden Sie sich beim Verwaltungscluster für den Arbeitslastcluster an, den Sie ändern, und führen Sie tanzu cluster list
aus, wenn Sie den Namen des Arbeitslastclusters abrufen müssen.
Rufen Sie den Namen des geheimen CSI-Schlüssels für den Arbeitslastcluster ab, indem Sie Bezeichnungsselektoren vsphere-csi
und den Clusternamen verwenden:
$ kubectl get secret \
-l tkg.tanzu.vmware.com/cluster-name=NAME_OF_WORKLOAD_CLUSTER \
-l tkg.tanzu.vmware.com/addon-name=vsphere-csi
my-wc-vsphere-csi-secret
Speichern Sie eine Sicherung des Inhalts des geheimen Schlüssels im YAML-Format unter vsphere-csi-secret.yaml
:
kubectl get secret my-wc-vsphere-csi-secret -o yaml > vsphere-csi-secret.yaml
Geben Sie den aktuellen Inhalt des geheimen Schlüssels erneut aus, wobei die Werte data.values
mit base64
als einfache YAML-Datei dekodiert werden.
$ kubectl get secret my-wc-vsphere-csi-secret -o jsonpath={.data.values\\.yaml} | base64 -d
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
vsphereCSI:
CSIAttacherImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-attacher
tag: v3.0.0_vmware.1
pullPolicy: IfNotPresent
vsphereCSIControllerImage:
repository: projects.registry.vmware.com/tkg
path: csi/vsphere-block-csi-driver
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
livenessProbeImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-livenessprobe
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
vsphereSyncerImage:
repository: projects.registry.vmware.com/tkg
path: csi/volume-metadata-syncer
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
CSIProvisionerImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-provisioner
tag: v2.0.0_vmware.1
pullPolicy: IfNotPresent
CSINodeDriverRegistrarImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-node-driver-registrar
tag: v2.0.1_vmware.1
pullPolicy: IfNotPresent
namespace: kube-system
clusterName: wc-1
server: 10.170.104.114
datacenter: /dc0
publicNetwork: VM Network
username: <MY-VSPHERE-USERNAME>
password: <MY-VSPHERE-PASSWORD>
Öffnen Sie vsphere-csi-secret.yaml
in einem Editor und führen Sie die folgenden Schritte aus, damit der Inhalt wie der folgende Code aussieht:
values.yaml
, bei der es sich um eine lange Zeichenfolge handelt.stringData
definiert und rücken Sie values.yaml
ein, damit sie zum ersten Element wird.data.values
aus dem vorherigen Schritt.data.values
ein und rücken Sie sie als Wert von values.yaml
ein.values.yaml
eine weitere stringData
-Definition für overlays.yaml
hinzu, wie unten gezeigt. Ändern Sie keine anderen Definitionen in der Datei.apiVersion: v1
stringData:
values.yaml: |
#@data/values
#@overlay/match-child-defaults missing_ok=True
---
vsphereCSI:
CSIAttacherImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-attacher
tag: v3.0.0_vmware.1
pullPolicy: IfNotPresent
vsphereCSIControllerImage:
repository: projects.registry.vmware.com/tkg
path: csi/vsphere-block-csi-driver
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
livenessProbeImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-livenessprobe
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
vsphereSyncerImage:
repository: projects.registry.vmware.com/tkg
path: csi/volume-metadata-syncer
tag: v2.1.1_vmware.1
pullPolicy: IfNotPresent
CSIProvisionerImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-provisioner
tag: v2.0.0_vmware.1
pullPolicy: IfNotPresent
CSINodeDriverRegistrarImage:
repository: projects.registry.vmware.com/tkg
path: csi/csi-node-driver-registrar
tag: v2.0.1_vmware.1
pullPolicy: IfNotPresent
namespace: kube-system
clusterName: wc-1
server: 10.170.104.114
datacenter: /dc0
publicNetwork: VM Network
username: <MY-VSPHERE-USERNAME>
password: <MY-VSPHERE-PASSWORD>
overlays.yaml: |
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"kind": "Deployment", "metadata": {"name": "vsphere-csi-controller"}})
---
spec:
template:
spec:
containers:
#@overlay/append
- name: csi-resizer
image: projects.registry.vmware.com/tkg/kubernetes-csi_external-resizer:v1.0.0_vmware.1
args:
- "--v=4"
- "--timeout=300s"
- "--csi-address=$(ADDRESS)"
- "--leader-election"
env:
- name: ADDRESS
value: /csi/csi.sock
volumeMounts:
- mountPath: /csi
name: socket-dir
kind: Secret
...
Führen Sie kubectl apply
aus, um den geheimen Schlüssel des Clusters mit den überarbeiteten Definitionen zu aktualisieren und erstellen Sie den Pod csi-controller
neu:
kubectl apply -f vsphere-csi-secret.yaml
So überprüfen Sie, ob der vsphere-csi-controller
und der externe Resizer auf dem Cluster funktionieren:
Bestätigen Sie, dass vsphere-csi-controller
auf dem Arbeitslastcluster mit sechs fehlerfreien Pods ausgeführt wird:
$ kubectl get pods -n kube-system -l app=vsphere-csi-controller
NAME READY STATUS RESTARTS AGE
vsphere-csi-controller-<ID-HASH> 6/6 Running 0 6m49s
Überprüfen Sie die Protokolle der vsphere-csi-controller
, um zu sehen, ob der externe Resizer gestartet wurde.
$ kubectl logs vsphere-csi-controller-<ID-HASH> -n kube-system -c csi-resizer
I0308 23:44:45.035254 1 main.go:79] Version : v1.0.0-0-gb22717d
I0308 23:44:45.037856 1 connection.go:153] Connecting to unix:///csi/csi.sock
I0308 23:44:45.038572 1 common.go:111] Probing CSI driver for readiness
I0308 23:44:45.040579 1 csi_resizer.go:77] CSI driver name: "csi.vsphere.vmware.com"
W0308 23:44:45.040612 1 metrics.go:142] metrics endpoint will not be started because `metrics-address` was not specified.
I0308 23:44:45.042184 1 controller.go:117] Register Pod informer for resizer csi.vsphere.vmware.com
I0308 23:44:45.043182 1 leaderelection.go:243] attempting to acquire leader lease kube-system/external-resizer-csi-vsphere-vmware-com...
I0308 23:44:45.073383 1 leaderelection.go:253] successfully acquired lease kube-system/external-resizer-csi-vsphere-vmware-com
I0308 23:44:45.076028 1 leader_election.go:172] new leader detected, current leader: vsphere-csi-controller-87d7dcf48-jcht2
I0308 23:44:45.079332 1 leader_election.go:165] became leader, starting
I0308 23:44:45.079638 1 controller.go:241] Starting external resizer csi.vsphere.vmware.com
Weitere Informationen zum Erweitern von vSphere CSI-Speichervolumes im Online- oder Offlinemodus finden Sie unter Volume-Erweiterung in vSphere with Tanzu.
Für Arbeitslastcluster, die aus einem eigenständigen Verwaltungscluster erstellt wurden, können Sie die topologiefähige Bereitstellung von lokalen Speichervolumes konfigurieren. Topologiefähige Volumebereitstellung ermöglicht Kubernetes, intelligente Entscheidungen bei der dynamischen Bereitstellung von Volumes zu treffen. Kubernetes erhält die Scheduler-Eingabe an der besten Stelle, an der ein Volume für einen Pod bereitgestellt werden kann.
Erstellen Sie eine Verfügbarkeitszone (Availability Zone, AZ):
Folgen Sie den Anweisungen unter Ausführen von Clustern in mehreren Verfügbarkeitszonen, um Folgendes in vSphere zu erstellen:
Fügen Sie Regeln hinzu, um die VM-Gruppe in der Hostgruppe einzuschränken.
Eine VM-Gruppe und Hostgruppe wird verwendet, um die Verfügbarkeitsbereiche im Arbeitslastcluster auszuführen.
HinweisDie Grenzwertregeln gelten nur für Konfigurationen von lokalen Volumes. Sie müssen keine Grenzwertregeln erstellen, wenn Sie die Bereitstellung in mehreren Verfügbarkeitszonen durchführen.
Stellen Sie die benutzerdefinierten Ressourcendefinitionen (CRDs) VSphereFailureDomain
und VSphereDeploymentZone
im eigenständigen Verwaltungscluster bereit.
Die Verfügbarkeitszone verweist auf eine VSphereDeploymentZone
und dann auf eine Hostgruppe in vSphere.
Fügen Sie eine neue Verfügbarkeitszone hinzu. Sie können eine neue Verfügbarkeitszone hinzufügen, indem Sie eine ytt
-Overlay-Konfiguration oder die Tanzu CLI verwenden.
ytt
ytt
-Overlay-Konfiguration in einem Legacy-Cluster und in einem klassischen Cluster. Informationen zum Herunterladen und Installieren von
ytt
finden Sie unter
Installieren der Carvel-Tools.
Legacy-Cluster
#@overlay/match by=overlay.subset({"kind":"MachineDeployment", "metadata":{"name": "${CLUSTER_NAME}-md-0"}})
---
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
name: #@ "{}-md-0".format(data.values.CLUSTER_NAME)
spec:
clusterName: #@ data.values.CLUSTER_NAME
replicas: #@ data.values.WORKER_MACHINE_COUNT_0
selector:
matchLabels: null
strategy:
type: #@ verify_and_configure_machine_deployment_rollout_strategy(data.values.WORKER_ROLLOUT_STRATEGY)
template:
metadata:
labels:
node-pool: #@ "{}-worker-pool".format(data.values.CLUSTER_NAME)
spec:
clusterName: #@ data.values.CLUSTER_NAME
version: #@ data.values.KUBERNETES_VERSION
bootstrap:
configRef:
name: #@ "{}-md-0".format(data.values.CLUSTER_NAME)
apiVersion: bootstrap.cluster.x-k8s.io/v1beta1
kind: KubeadmConfigTemplate
infrastructureRef:
name: #@ "{}-md-0".format(data.values.CLUSTER_NAME)
apiVersion: infrastructure.cluster.x-k8s.io/v1beta1
kind: AWSMachineTemplate
failureDomain: #@ default_az_0
Klassischer Cluster
workers:
machineDeployments:
#@overlay/match by=overlay.index(0)
- class: tkg-worker
name: md-0
replicas: #@ data.values.WORKER_MACHINE_COUNT_0
#@overlay/match missing_ok=True
failureDomain: #@ default_az_0
metadata:
annotations:
run.tanzu.vmware.com/resolve-os-image: #@ "ami-region={},os-name={},os-arch={}".format(data.values.AWS_REGION, data.values.OS_NAME, data.values.OS_ARCH)
Legacy-Cluster
tanzu cl node-pool set cl-name -f node-pool.yaml
# node-pool.yaml
name: vsphere-wc-1-manual-node-pool
replicas: 1
az: "rack4"
Klassischer Cluster
Weitere Informationen finden Sie im Abschnitt zum „set“-Befehl (Erstellen) unter Konfiguration von Knotenpools für ClusterClass-basierte Cluster.