データ転送

Google Distributed Cloud(GDC)エアギャップ アプライアンス デバイスは、Google Distributed Cloud エアギャップ環境との間で任意のデータを転送します。転送は手動で開始することも、設定された間隔で自動的に実行されるように設定することもできます。

転送の例:

  • ソフトウェア アップデートまたは更新された顧客ワークロードをダウンロードする
  • 顧客データ、デバイス指標、デバイスのセキュリティ、監査、オペレーション ログをアップロードする
  • バックアップ データのスナップショット

storage-transfer ツールはデータを転送し、クラスタで実行中のコンテナで使用するイメージに分散されます。

データソース

storage-transfer ツールを使用すると、GDC エアギャップ アプライアンスの動作条件を柔軟に設定できます。S3 互換 API は、外部に公開されたストレージ ターゲットと内部ストレージ ターゲットにアクセスできます。このツールは、ローカル ファイル システムと Cloud Storage のソースもサポートしています。

オペレーターは、GDC エアギャップ アプライアンスを外部ネットワークに接続するための認証に必要なアクセスキー、その他の認証情報、シークレット、機密データの制御を維持する責任を負います。オペレーターは、外部ネットワークの構成も担当します。

外部ストレージの作成とアクセスについては、ストレージ バケットの作成を参照してください。

ローカル ストレージ

ローカル ストレージは Pod のコンテナ環境に含まれており、一時ファイル システムやマウントされたボリュームが含まれます。ボリュームをマウントするときに、Pod にバインドされた ServiceAccount がすべてのマウント ターゲットにアクセスできる必要があります。

S3 ストレージ

ネットワークで使用可能なストレージには、S3 互換 API を介してアクセスできます。サービスは、外部に公開することも、クラスタ ネットワーク内でのみ公開することもできます。アクセス可能な URL と、Kubernetes Secret を使用してマウントされた標準化された認証情報を提供する必要があります。

マルチノードとオブジェクト ストレージで定義されたデータには、S3 API を介してアクセスします。GDC エアギャップ アプライアンス内でのマルチノード ストレージオブジェクト ストレージの設定については、関連するセクションをご覧ください。

クラウド ストレージ

Secret を使用してマウントされたアクセス可能な URL と標準化された認証情報を指定する必要があります。

均一なアクセス制御で Cloud Storage バケットにアクセスする場合は、--bucket-policy-only フラグを true に設定する必要があります。

認証情報

S3 または GCS の移行元または移行先の定義に storage-transfer サービスを使用するには、Kubernetes Secret が必要です。これらは、リモート サービス アカウントまたはユーザー アカウントで指定できます。

Job または CronJob の定義で Secret を使用する場合は、JobSpec を Secret にアクセスできる Kubernetes ServiceAccount に関連付ける必要があります。

転送で使用される ServiceAccount を作成し、ロールとロール バインディングを使用してシークレットの読み取りと書き込みを行う権限を ServiceAccount に追加します。デフォルトの Namespace の ServiceAccount またはカスタム ServiceAccount にすでに権限が付与されている場合は、ServiceAccount を作成しないように選択できます。

  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 フィールドのシークレットに保存する必要があります。

以下に例を示します。

apiVersion: v1
data:
  service-account-key: BASE_64_ENCODED_VERSION_OF_CREDENTIAL_FILE_CONTENTS
kind: Secret
metadata:
  name: gcs-secret
  namespace: NAMESPACE
type: Opaque

ユーザー アカウント

Cloud Storage バケットではなく、S3 互換バケットで認証にユーザー アカウントを使用できます。--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: Job 定義を作成する Namespace の名前。
  • SECRET_NAME: 作成する Secret の名前。
  • ACCESS_KEY_ID: Google Cloud コンソールの [アクセスキー] フィールドに表示される値。Object Storage 用に構成する場合、これは access-key-id と呼ばれます。
  • ACCESS_KEY: Google Cloud コンソールの Secret フィールドにある値。Object Storage 用に構成する場合、これは secret-key または 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.

証明書は、NAMESPACE/SECRET_NAME 形式の引数 src_ca_certificate_referencedst_ca_certificate_reference を使用してツールを参照することで提供できます。次に例を示します。

...
      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 シークレットを 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

省略可: Loki でログを表示するように LoggingTarget を定義する

デフォルトでは、Job のログは 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

組み込み Job を定義する

ユーザーは独自のジョブリソースを管理します。1 回限りのデータ転送の場合は、Job を定義します。Job は、storage-transfer コンテナを実行する Pod を作成します。

Job の例:

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

データ競合を防ぐため、concurrencyPolicyForbid に設定することをおすすめします。CronJob、Secret、PersistentVolumeClaim は同じ Namespace に存在する必要があります。

データジョブの優先順位を設定する

データジョブの優先度を設定する方法は複数あり、相互に排他的ではありません。CronJob 定義で、ジョブ スケジュールの頻度を低く設定できます。

ジョブは、定義順に常に実行される InitContainers(https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)を使用して順序付けすることもできます。ただし、すべてのコンテナが正常に実行される必要があります。InitContainers を使用して、1 つのジョブに高い優先度を付与するか、ミラーリングされたソースと宛先の定義を持つ 2 つ以上の 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 の前に実行されます。この例では、bisync とジョブの順序付けの両方を実現しています。