Google Distributed Cloud (GDC) 经过网闸隔离的设备可将任意数据传输到 Google Distributed Cloud 经过网闸隔离的环境,也可从该环境传输任意数据。您可以手动启动转移,也可以将转移设置为按设定的时间间隔自动进行。
转移示例:
- 下载软件更新或更新后的客户工作负载
- 上传客户数据、设备指标或设备安全、审核和操作日志
- 备份数据快照
storage-transfer 工具用于转移数据,并以映像形式分发,以便在集群上运行的容器中使用。
数据源
存储空间转移工具可灵活调整 GDC 网闸隔离设备的运行条件。S3 兼容 API 可以访问外部公开的存储目标和内部存储目标。该工具还支持本地文件系统和 Cloud Storage 源。
操作员负责维护对访问密钥和任何其他凭据、密文或敏感数据的控制权,这些数据是用于对 GDC 空气隔离设备进行身份验证以将其连接到外部网络所必需的。运营商还负责外部网络的配置。
如需了解如何创建和访问外部存储空间,请参阅创建存储分区。
本地存储空间
本地存储空间包含在 Pod 的容器环境中,包括临时文件系统或已装载的卷。在装载卷时,绑定到 pod 的 ServiceAccount 必须有权访问所有装载目标。
S3 存储空间
可通过 S3 兼容 API 访问网络可用存储空间。该服务可以是外部服务,也可以仅在集群网络内公开。您必须提供一个可访问的网址和使用 Kubernetes Secret 装载的标准凭据。
通过 S3 API 访问多节点和对象存储定义的数据。如需在 GDC 气隙隔离设备中设置多节点存储和对象存储,请参阅相关部分。
云端存储空间
您必须提供一个可访问的网址,以及通过使用 Secret 装载的标准凭据。
如果访问具有统一访问权限控制的 Cloud Storage 存储桶,则必须将 --bucket-policy-only
标志设置为 true
。
凭据
无论是使用 S3 还是 GCS 源或目标定义,都需要 Kubernetes Secret 才能使用 Storage Transfer Service。这些凭据可以通过远程服务账号或用户账号提供。
在作业或 CronJob 定义中使用 Secret 时,JobSpec 必须附加到有权访问 Secret 的 Kubernetes 服务账号。
创建供转移使用的 ServiceAccount,然后使用角色和角色绑定向该 ServiceAccount 添加读取和写入 Secret 的权限。如果您的默认命名空间服务账号或自定义服务账号已拥有权限,您可以选择不创建服务账号。
apiVersion: v1
kind: ServiceAccount
metadata:
name: transfer-service-account
namespace: NAMESPACE
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: read-secrets-role
namespace: NAMESPACE
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-secrets-rolebinding
namespace: NAMESPACE
subjects:
- kind: ServiceAccount
name: transfer-service-account
namespace: NAMESPACE
roleRef:
kind: Role
name: read-secrets-role
apiGroup: rbac.authorization.k8s.io
远程服务账号
如需获取 Cloud Storage 服务账号凭据以进行转移,请参阅 https://developers.google.com/workspace/guides/create-credentials#create_credentials_for_a_service_account。这些凭据必须存储在 service-account-key
字段的 Secret 中。
示例如下:
apiVersion: v1
data:
service-account-key: BASE_64_ENCODED_VERSION_OF_CREDENTIAL_FILE_CONTENTS
kind: Secret
metadata:
name: gcs-secret
namespace: NAMESPACE
type: Opaque
用户账号
您可以使用用户账号对 S3 兼容存储分区进行身份验证,但不能对 Cloud Storage 存储分区进行身份验证。您必须将 --src_type
或 --dst_type
实参指定为 s3
。
kubectl create secret -n NAMESPACE generic S3_CREDENTIAL_SECRET_NAME \
--from-literal=access-key-id=ACCESS_KEY_ID
--from-literal=access-key=ACCESS_KEY
替换以下内容:
NAMESPACE
:您将在其中创建作业定义的命名空间的名称。SECRET_NAME
:您要创建的 Secret 的名称。ACCESS_KEY_ID
:在 Google Cloud 控制台的访问密钥字段中找到的值。在为对象存储配置时,此参数称为 access-key-id。ACCESS_KEY
: Google Cloud 控制台中密钥字段中的值。在为对象存储配置时,这是密钥或 Secret。
证书
在作业中提供证书以进行验证,该证书位于包含 ca.crt
数据密钥的 Kubernetes Secret 中。
apiVersion: v1
kind: Secret
metadata:
name: SRC_CERTIFICATE_SECRET_NAME
namespace: NAMESPACE
data:
ca.crt : BASE_64_ENCODED_SOURCE_CERTIFICATE
---
apiVersion: v1
kind: Secret
metadata:
name: DST_CERTIFICATE_SECRET_NAME
namespace: NAMESPACE
data:
ca.crt : BASE_64_ENCODED_DESTINATION_CERTIFICATE # Can be same OR different than source certificate.
可以使用 src_ca_certificate_reference
和 dst_ca_certificate_reference
实参以 NAMESPACE/SECRET_NAME
格式通过引用向该工具提供证书。例如:
...
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
...
- --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
- --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
对于设备中的 S3 存储空间,您可以直接使用 trust-store-root-ext
Secret 作为 CA 证书。例如:
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
- --src_type=s3
- --src_ca_certificate_reference=NAMESPACE/trust-store-root-ext
可选:定义 LoggingTarget 以在 Loki 中查看日志
默认情况下,来自作业的日志只能在 Kubernetes 资源中查看,在可观测性堆栈中不可用,必须使用 LoggingTarget 进行配置才能查看。
apiVersion: logging.gdc.goog/v1alpha1
kind: LoggingTarget
metadata:
namespace: NAMESPACE # Same namespace as your transfer job
name: logtarg1
spec:
# Choose matching pattern that identifies pods for this job
# Optional
# Relationship between different selectors: AND
selector:
# Choose pod name prefix(es) to consider for this job
# Observability platform will scrape all pods
# where names start with specified prefix(es)
# Should contain [a-z0-9-] characters only
# Relationship between different list elements: OR
matchPodNames:
- data-transfer-job # Choose the prefix here that matches your transfer job name
serviceName: transfer-service
定义内置作业
用户可以管理自己的作业资源。对于一次性数据转移,请定义作业。作业会创建一个 Pod 来运行 storage-transfer 容器。
作业示例:
apiVersion: batch/v1
kind: Job
metadata:
name: data-transfer-job
namespace: NAMESPACE
spec:
template:
spec:
restartPolicy: Never
serviceAccountName: transfer-service-account,
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
- --src_path=/src
- --src_type=local
- --dst_endpoint=https://your-dst-endpoint.com
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_path=/FULLY_QUALIFIED_BUCKET_NAME/BUCKET_PATH
- --dst_type=gcs
- --bucket_policy_only=true
- --bandwidth_limit=10M #Optional of the form '10K', '100M', '1G' bytes per second
volumeMounts:
- mountPath: /src
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: data-transfer-source
定义内置 CronJob
用户管理自己定义的 CronJob 资源。使用内置的 CronJob 可以定期安排数据转移。
实现自动化数据传输的 CronJob 示例:
apiVersion: batch/v1
kind: CronJob
metadata:
name: data-transfer-cronjob
namespace: NAMESPACE
spec:
schedule: "* * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
serviceAccountName: transfer-service-account
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
command:
- /storage-transfer
args:
- --src_path=LOCAL_PATH
- --src_type=local
- --dst_endpoint=https://your-dst-endpoint.com
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_path=/FULLY_QUALIFIED_BUCKET_NAME/BUCKET_PATH
- --dst_type=gcs
- --bucket_policy_only=true
volumeMounts:
- mountPath: LOCAL_PATH
name: source
restartPolicy: Never
volumes:
- name: source
persistentVolumeClaim:
claimName: data-transfer-source
Google 建议将 concurrencyPolicy
设置为 Forbid
,以防止数据争用。
CronJob、Secret 和 PersistentVolumeClaim 必须位于同一命名空间中。
确定数据作业的优先级
您可以通过多种方式(这些方式并非互斥)为数据作业设置优先级。您可以在 CronJob 定义中设置频率较低的作业时间表。
还可以使用 InitContainers(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)对作业进行排序,这些作业始终按定义顺序运行。不过,所有容器都必须成功运行。使用 InitContainers 可为某个作业赋予更高的优先级,或通过定义两个或更多具有镜像源和目标定义的 InitContainers 来管理数据争用。
实现有序数据传输的 jobTemplate
示例:
apiVersion: batch/v1
kind: CronJob
metadata:
name: ordered-data-transfer-cronjob
namespace: NAMESPACE
spec:
schedule: "* * * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: job-complete
image: whalesay
command: ["sh", "-c", "echo Job Completed."]
initContainers:
- name: A-to-B
image: gcr.io/private-cloud-staging/storage-transfer:latest
command: [/storage-transfer]
args:
- --src_type=s3
- --src_endpoint=ENDPOINT_A
- --src_path=/example-bucket
- --src_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
- --dst_type=s3
- --dst_endpoint=ENDPOINT_B
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
- --dst_path=/example-bucket
- name: B-to-A
image: gcr.io/private-cloud-staging/storage-transfer:latest
command: [/storage-transfer]
args:
- --src_type=s3
- --src_endpoint=ENDPOINT_B
- --src_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
- --src_path=/example-bucket
- --dst_type=s3
- --dst_endpoint=ENDPOINT_A
- --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
- --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
- --dst_path=/example-bucket
容器 A-to-B
在 B-to-A
之前运行。此示例同时实现了双向同步和作业排序。