传输数据

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_referencedst_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-BB-to-A 之前运行。此示例同时实现了双向同步和作业排序。