Richtlinien für die Benennung von Storage-Buckets
Bucket-Namen müssen den folgenden Namenskonventionen entsprechen:
- Sie muss innerhalb des Projekts eindeutig sein. Ein Projekt fügt dem Bucket-Namen ein eindeutiges Präfix hinzu, um Konflikte innerhalb der Organisation zu vermeiden. Im unwahrscheinlichen Fall, dass sich ein Präfix und ein Bucket-Name über Organisationen hinweg überschneiden, schlägt die Bucket-Erstellung mit einem
bucket name in use
-Fehler fehl. - Muss mindestens ein und darf höchstens 57 Zeichen enthalten.
- Geben Sie keine personenidentifizierbaren Informationen an.
- DNS-konform sein.
- Muss mit einem Buchstaben beginnen und darf nur Buchstaben, Zahlen und Bindestriche enthalten.
s3cmd-Befehlszeile installieren
Das Tool s3cmd
ist ein Befehlszeilentool zum Verwalten von Objektspeicher.
- Rufen Sie das Verzeichnis auf, aus dem das GDC-Bundle extrahiert wurde, um das Tool herunterzuladen.
Führen Sie die folgenden Befehle aus, um das s3cmd-Image
s3cmd.tar.tar.gz
in ein leeres temporäres Verzeichnis zu extrahieren:tmpdir=$(mktemp -d) gdcloud artifacts extract oci/ $tmpdir \ --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
scp
Kopieren Sie die TAR-Datei auf einen Clientcomputer, auf dem Sies3cmd
für Objektvorgänge verwenden. Entpacken Sie das Image und installieren Sie es.
Wählen Sie eine der folgenden Installationsmethoden aus, um das s3cmd
-Tool zu installieren:
Über eine TAR-Datei installieren
Führen Sie die folgenden Befehle aus, um das Archiv zu entpacken und das
s3cmd
-Paket zu installieren. Sie benötigen das Python-Moduldistutils
, um das Paket zu installieren. Das Modul ist oft Teil des Python-Kernpakets oder Sie können es mit Ihrem Paketmanager installieren.tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz cd /tmp/gpc-system-tar-files/s3cmd sudo python3 setup.py install
Optional: Heruntergeladene Dateien bereinigen:
rm /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz rm -r /tmp/gpc-system-tar-files/s3cmd
Mit Docker-Image installieren
Führen Sie die folgenden Befehle aus, um das
s3cmd
-Image zu installieren:docker load --input s3cmd-docker.tar export S3CFG=/EMPTY_FOLDER_PATH/ alias s3cmd="docker run -it --net=host --mount=type=bind,source=/$S3CFG/,target=/g/ s3cmd-docker:latest -c /g/s3cfg"
Optional: Heruntergeladene Dateien bereinigen:
rm s3cmd-docker.tar
Fügen Sie den Export und den Alias der Datei
.bashrc
hinzu, damit sie nach dem Neustart des Clients erhalten bleiben.
s3cmd-Tool konfigurieren
Verwenden Sie das Tool „s3cmd“ für objektbasierte Vorgänge.
Führen Sie den Befehl s3cmd --configure
aus und geben Sie Folgendes an:
- Zugriffsschlüssel: Geben Sie den Zugriffsschlüssel ein, den Sie im Secret unter Zugriffsanmeldedaten abrufen erhalten haben.
- Geheimer Schlüssel: Geben Sie den geheimen Schlüssel ein, der aus dem Secret unter Zugriffsanmeldedaten abrufen abgerufen wurde.
- Standardregion: Drücken Sie
ENTER
. - S3-Endpunkt: Geben Sie den Endpunkt ein, den Ihr Infrastrukturbetreiber (Infrastructure Operator, IO) bereitstellt.
- Geben Sie für die Bucket-Benennung im DNS-Stil
s3://%(bucket)
ein. - Optional: Geben Sie ein Verschlüsselungspasswort ein, um Dateien während der Übertragung zu schützen.
- Geben Sie unter „Pfad zu GPG“
/usr/bin/gpg
ein. - Geben Sie
Yes
ein, um das HTTPS-Protokoll zu verwenden. - Drücken Sie
Enter
, um die Eingabe des Proxyservernamens zu überspringen.
Storage-Buckets erstellen
Hinweise
In einem Projekt-Namespace werden Bucket-Ressourcen im Administrator-Stammcluster verwaltet. Sie benötigen ein Projekt, um einen Bucket zu erstellen. Informationen zum Erstellen eines neuen Projekts finden Sie unter Projekt erstellen. Sie benötigen die entsprechenden Bucket-Berechtigungen, um die folgenden Vorgänge auszuführen. Weitere Informationen finden Sie unter Bucket-Zugriff gewähren.
Bucket erstellen
Um einen Bucket zu erstellen, wenden Sie eine Bucket-Spezifikation auf Ihren Projekt-Namespace an:
kubectl apply -f bucket.yaml
Hier ist ein Beispiel für eine Bucket-Spezifikation:
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
name: BUCKET_NAME
namespace: NAMESPACE_NAME
spec:
description: DESCRIPTION
storageClass: standard-rwo
bucketPolicy :
lockingPolicy :
defaultObjectRetentionDays: RETENTION_DAY_COUNT
Weitere Informationen finden Sie in der Bucket API-Referenz.
Storage-Buckets auflisten
Führen Sie die folgenden Schritte aus, um alle Buckets aufzulisten, auf die Sie in einem bestimmten Object Storage-Mandanten Zugriff haben:
Führen Sie die folgenden Befehle aus, um alle Buckets aufzulisten:
kubectl get buckets --all-namespaces kubectl get buckets --namespace NAMESPACE_NAME
Storage-Buckets löschen
Sie können Speicher-Buckets mit der CLI löschen. Buckets müssen leer sein, bevor Sie sie löschen können.
Verwenden Sie den Befehl
GET
oderDESCRIBE
im Abschnitt Bucket-Konfiguration ansehen, um den voll qualifizierten Bucket-Namen abzurufen.Wenn der Bucket nicht leer ist, leeren Sie ihn:
s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
Löschen Sie den leeren Bucket:
kubectl delete buckets/BUCKET_NAME --namespace NAMESPACE_NAME
Bucket-Konfiguration ansehen
Verwenden Sie einen der beiden Befehle, um die Konfigurationsdetails für einen Bucket aufzurufen:
kubectl describe buckets/BUCKET_NAME --namespace NAMESPACE_NAME
kubectl get buckets/BUCKET_NAME --namespace NAMESPACE_NAME -o yaml
Aufbewahrungszeitraum für Objekte festlegen
Standardmäßig können Sie Objekte jederzeit löschen. Aktivieren Sie die Objektsperrung mit einem Aufbewahrungszeitraum, um zu verhindern, dass alle Objekte im Bucket für die angegebene Anzahl von Tagen gelöscht werden. Sie können einen Bucket erst löschen, wenn Sie alle Objekte nach Ablauf der Aufbewahrungsdauer gelöscht haben.
Sie müssen die Objektsperre beim Erstellen des Buckets aktivieren. Sie können die Objektsperrung nach dem Erstellen eines Buckets nicht mehr aktivieren oder deaktivieren. Sie können jedoch den Standardzeitraum für die Objektaufbewahrung ändern.
Sie können einen Bucket erstellen, ohne die Objektsperrung zu aktivieren. Wenn Sie die Objektverriegelung aktiviert haben, ist die Angabe einer Standardaufbewahrungsdauer optional.
Wenn Sie die Aufbewahrungsdauer ändern möchten, aktualisieren Sie das Feld Bucket.spec.bucketPolicy.lockingPolicy.defaultObjectRetentionDays
in der Bucket-Ressource.
Das folgende Beispiel zeigt, wie das Feld in der Bucket-Ressource aktualisiert wird:
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
name: BUCKET_NAME
namespace: NAMESPACE_NAME
spec:
description: "This bucket has a default retention period specified."
storageClass: standard-rwo
bucketPolicy :
lockingPolicy :
defaultObjectRetentionDays: RETENTION_DAY_COUNT
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
name: BUCKET_NAME
namespace: NAMESPACE_NAME
spec:
description: "This would enable object locking but not specify a default retention period."
storageClass: standard-rwo
bucketPolicy :
lockingPolicy :
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
name: BUCKET_NAME
namespace: NAMESPACE_NAME
spec:
description: "This bucket does not have locking or retention enabled."
storageClass: standard-rwo
Alle Aktualisierungen der Aufbewahrungsdauer gelten für Objekte, die nach der Aktualisierung im Bucket erstellt wurden. Für bereits vorhandene Objekte ändert sich die Aufbewahrungsdauer nicht.
Wenn Sie die Objektsperrung aktiviert haben und versuchen, ein Objekt zu überschreiben, wird eine neue Version des Objekts hinzugefügt. Sie können beide Objektversionen abrufen.
Weitere Informationen zum Auflisten von Objektversionen finden Sie in der Amazon Web Services-Dokumentation unter ListObjectVersions
:
https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html
Informationen zum Erstellen eines WORM-Buckets (Write-Once, Read-Many) finden Sie im Abschnitt WORM-Bucket.
Bucket-Zugriff gewähren
Sie können anderen Nutzern oder Dienstkonten Bucket-Zugriff gewähren, indem Sie RoleBindings
mit vordefinierten Rollen erstellen und anwenden.
Vordefinierte Rollen
project-bucket-object-viewer::Mit dieser Rolle kann ein Nutzer alle Buckets im Projekt auflisten, Objekte in diesen Buckets auflisten sowie Objekte und Objektmetadaten lesen. Mit dieser Rolle können Sie keine Schreibvorgänge für Objekte ausführen, z. B. Hochladen, Überschreiben oder Löschen.
project-bucket-object-admin::Mit dieser Rolle kann ein Nutzer alle Buckets im Projekt auflisten sowie Schreib- und Lesevorgänge für Objekte ausführen, z. B. Hochladen, Überschreiben oder Löschen.
project-bucket-admin::Mit dieser Rolle können Nutzer alle Buckets im angegebenen Namespace sowie alle Objekte in diesen Buckets verwalten.
Eine vollständige Liste der für diese Rollen gewährten Berechtigungen finden Sie im Abschnitt Berechtigungen für voreingestellte Rollen.
Bitten Sie Ihren Projekt-IAM-Administrator, Ihnen die Rolle „Projekt-IAM-Administrator“ (project-iam-admin
) zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen von Projektrollenbindungen benötigen.
Das folgende Beispiel zeigt, wie Sie eine RoleBinding
erstellen, um einem Nutzer und einem Dienstkonto Zugriff zu gewähren:
Erstellen Sie auf Ihrem System eine YAML-Datei, z. B.
rolebinding-object-admin-all-buckets.yaml
.apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: NAMESPACE_NAME name: readwrite-all-buckets roleRef: kind: Role name: project-bucket-object-admin apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount namespace: NAMESPACE_NAME name: SA_NAME - kind: User namespace: NAMESPACE_NAME name: bob@example.com # Could be bob or bob@example.com based on your organization settings. apiGroup: rbac.authorization.k8s.io ```
Wenden Sie die YAML-Datei an:
kubectl apply \ -f rolebinding-object-admin-all-buckets.yaml
Anmeldedaten für den Bucket-Zugriff abrufen
Wenn Sie Zugriff auf einen Bucket gewähren, werden die Anmeldedaten für den Zugriff in einem Secret erstellt.
Das Format des Secret-Namens ist object-storage-key-SUBJECT_TYPE-SUBJECT_HASH
.
- Für
SUBJECT_TYPE
sind folgende Werte möglich:user
: der Nutzer.sa
: dieServiceAccount
.
SUBJECT_HASH
ist der base32-codierte SHA256-Hash des Betreffnamens.
Beispiel: Der Nutzer bob@foo.com
hat das Secret mit dem Namen:
object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja
Nutzer-Secret aufrufen
Für ein Nutzer-Subjekt befindet sich das Secret im Namespace object-storage-access-keys
im Administratorcluster des Stammclusters.
Suchen Sie den Secret-Namen:
kubectl auth can-i --list --namespace object-storage-access-keys | grep object-storage-key-
Die Ausgabe sollte in etwa so aussehen:
secrets [] [object-storage-key-nl-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja] [get]
Rufen Sie den Inhalt des entsprechenden Secrets ab, um auf Buckets zuzugreifen:
kubectl get -o yaml --namespace object-storage-access-keys secret object-storage-key-rm-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja
Die Ausgabe sollte in etwa so aussehen:
data: access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8= create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3 secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
Decodieren Sie die Zugriffsschlüssel-ID und das Secret:
echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \ && echo \ && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
Die Ausgabe sollte in etwa so aussehen:
0HX3O0YC2J722EJLPJEO Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
Folgen Sie dem Abschnitt s3cmd konfigurieren mit den resultierenden Informationen.
Auf das Secret des Dienstkontos zugreifen
Bei einem Dienstkonto-Subjekt befindet sich das Secret im selben Namespace wie der Bucket. Führen Sie Folgendes aus, um den Namen zu ermitteln:
kubectl get --namespace NAMESPACE_NAME secrets -o=jsonpath=
'{.items[?(@.metadata.annotations.object\.gdc\.goog/subject=="SA_NAME")].metadata.name}'
Die Ausgabe sollte in etwa so aussehen:
object-storage-key-rm-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq
Sie können im Pod als Umgebungsvariablen (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables) oder Dateien (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod) auf das Secret verweisen.
Voreingestellte Rollenberechtigungen
Berechtigungen für „Projekt-Bucket-Objekt-Betrachter“
Diese Rolle gewährt Berechtigungen zum Abrufen und Auflisten von Objekten und Objektmetadaten im Bucket.
Die Rolle project-bucket-object-viewer
hat die folgenden Berechtigungen:
Bucket-API-Berechtigungen:
- Get
- Liste
- Ansehen
Berechtigungen für S3-Objektspeicher:
GetObject
GetObjectAcl
GetObjectVersion
ListBucket
ListBucketVersions
ListBucketMultipartUploads
ListMultipartUploadParts
Berechtigungen vom Typ „Projekt-Bucket-Objekt-Administrator“
Diese Rolle gewährt Berechtigungen zum Einfügen und Löschen von Objekten, Objektversionen und Tags im Bucket. Außerdem werden damit alle Berechtigungen in der project-bucket-object-viewer
gewährt.
Die Rolle project-bucket-object-admin
hat die folgenden Berechtigungen für den Objektspeicher:
Berechtigungen für S3-Objektspeicher:
AbortMultipartUpload
DeleteObject
DeleteObjectVersion
PutObject
RestoreObject
Berechtigungen als Projekt-Bucket-Administrator
Mit dieser Rolle werden Berechtigungen zum Erstellen, Aktualisieren oder Löschen von Bucket
-Ressourcen im Projekt-Namespace erteilt. Außerdem werden alle Berechtigungen in project-bucket-object-admin
gewährt.
Die Rolle project-bucket-object-admin
hat die folgenden Berechtigungen:
Bucket-API-Berechtigungen:
- Erstellen
- Aktualisieren
- Löschen
WORM-Bucket erstellen
Ein WORM-Bucket sorgt dafür, dass Objekte nicht überschrieben werden und für einen Mindestzeitraum aufbewahrt werden. Die Audit-Protokollierung ist ein Beispiel für einen WORM-Bucket.
So erstellen Sie einen WORM-Bucket:
Legen Sie beim Erstellen des Buckets einen Aufbewahrungszeitraum fest. Der folgende Beispiel-Bucket hat beispielsweise eine Aufbewahrungsdauer von 365 Tagen.
apiVersion: object.gdc.goog/v1alpha1 kind: Bucket metadata: name: foo logging-bucket namespace: foo-service spec: description: "Audit logs for foo" storageClass: standard-rwo bucketPolicy : lockingPolicy : defaultObjectRetentionDays: 365
Weisen Sie allen Nutzern, die Lesezugriff benötigen, die Rolle
project-bucket-object-viewer
zu:apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: foo-service name: object-readonly-access roleRef: kind: Role name: project-bucket-object-viewer apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount namespace: foo-service name: foo-log-processor - kind: User name: bob@example.com apiGroup: rbac.authorization.k8s.io
Weisen Sie Nutzern, die Inhalte in den Bucket schreiben müssen, die Rolle
project-bucket-object-admin
zu:apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: foo-service name: object-write-access roleRef: kind: Role name: project-bucket-object-viewer apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount namespace: foo-service name: foo-service-account
Aus Objektspeicher in Dateisystem auf Blockspeicher wiederherstellen
Nichtflüchtiges Volume zuweisen
So stellen Sie Dateien von einem Objektspeicher-Endpunkt wieder her:
Weisen Sie dem Ziel der Wiederherstellung ein nichtflüchtiges Volume (PV) zu. Verwenden Sie einen PersistentVolumeClaim (PVC), um das Volume zuzuweisen, wie im folgenden Beispiel gezeigt:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: restore-pvc namespace: restore-ns spec: storageClassName: standard-rwo accessModes: ReadWriteOnce resources: requests: storage: 1Gi # Need sufficient capacity for full restoration.
Prüfen Sie den Status des PVC:
kubectl get pvc restore-pvc -n restore-ns
Sobald sich der PVC im Status
Bound
befindet, kann er im Pod verwendet werden, in dem er rehydriert wird.Wenn ein
Stateful
-Set das PV schließlich verwendet, müssen Sie die gerenderten StatefulSet-PVCs abgleichen. Die vonStatefulSet
erstellten Pods verwenden die hydrierten Volumes. Das folgende Beispiel zeigt Vorlagen für Volume-Ansprüche in einem StatefulSet namensss
.volumeClaimTemplates: - metadata: name: pvc-name spec: accessModes: [ "ReadWriteOnce" ] storageClassName: standard-rwo resources: requests: storage: 1Gi
Weisen Sie PVCs mit Namen wie
ss-pvc-name-0
undss-pvc-name-1
vorab zu, damit die resultierenden Pods die vorab zugewiesenen Volumes verwenden.
Nichtflüchtiges Volume (Persistent Volume, PV) initialisieren
Nachdem der PVC an ein PV gebunden wurde, starten Sie Job
, um das PV zu füllen:
apiVersion: batch/v1
kind: Job
metadata:
name: transfer-job
namespace: transfer
spec:
template:
spec:
serviceAccountName: data-transfer-sa
volumes:
- name: data-transfer-restore-volume
persistentVolumeClaim:
claimName: restore-pvc
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command: /storage-transfer
args:
- --src_endpoint=https://your-src-endpoint.com
- --src_path=/your-src-bucket
- --src_credentials=transfer/src-secret
- --dst_path=/restore-pv-mnt-path
- --src_type=s3
- --dst_type=local
volumeMounts:
- mountPath: /restore-pv-mnt-path
name: data-transfer-restore-volume
Nachdem Job
abgeschlossen ist, werden die Daten aus dem Object Storage-Bucket in das Volume übertragen. Ein separater Pod kann die Daten mit denselben Standardmechanismen zum Mounten eines Volumes nutzen.