web-dev-qa-db-ja.com

Kubernetesを介して実行されているGKEでGOOGLE_APPLICATION_CREDENTIALSを設定する方法

kubernetesの助けを借りて、私はGKEで毎日ジョブを実行しています。kubernetesで構成されたcronに基づいて毎日、新しいコンテナーが起動し、BigQueryにデータを挿入しようとします。

1つのプロジェクトでGCPに2つの異なるプロジェクトがあり、他のプロジェクトでBigQueryのデータを維持しているため、すべてのGKEが実行されているため、GKEが異なるプロジェクトリソースとやり取りする必要がある場合は、環境を設定する必要がありますサービスアカウントのjsonファイルを指すGOOGLE_APPLICATION_CREDENTIALSという名前の変数ですが、毎日kubernetesが新しいコンテナを起動しているため、この変数をどこでどのように設定すればよいかわかりません。

前もって感謝します!

注:このファイルは、drone-gkeプラグインによってgolangテンプレートとして解析されます。

---
apiVersion: v1
kind: Secret
metadata:
  name: my-data-service-account-credentials
type: Opaque
data:
  sa_json: "bas64JsonServiceAccount"
---
apiVersion: v1
kind: Pod
metadata:
  name: adtech-ads-apidata-el-adunit-pod
spec:
  containers:
  - name: adtech-ads-apidata-el-adunit-container
    volumeMounts:
    - name: service-account-credentials-volume
     mountPath: "/etc/gcp"
     readOnly: true
  volumes:
  - name: service-account-credentials-volume
    secret:
      secretName: my-data-service-account-credentials
      items:
      - key: sa_json
        path: sa_credentials.json

これは、AdUnitデータをロードするためのcronジョブです。

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: adtech-ads-apidata-el-adunit
spec:
  schedule: "*/5 * * * *"
  suspend: false
  concurrencyPolicy: Replace
  successfulJobsHistoryLimit: 10
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: adtech-ads-apidata-el-adunit-container
            image: {{.image}}
            args:
            - -cp
            - opt/nyt/DFPDataIngestion-1.0-jar-with-dependencies.jar
            - com.nyt.cron.AdUnitJob
            env:
              - name: ENV_APP_NAME
                value: "{{.env_app_name}}"
              - name: ENV_APP_CONTEXT_NAME
                value: "{{.env_app_context_name}}"
              - name: ENV_GOOGLE_PROJECTID
                value: "{{.env_google_projectId}}"
              - name: ENV_GOOGLE_DATASETID
                value: "{{.env_google_datasetId}}"
              - name: ENV_REPORTING_DATASETID
                value: "{{.env_reporting_datasetId}}"
              - name: ENV_ADBRIDGE_DATASETID
                value: "{{.env_adbridge_datasetId}}"
              - name: ENV_SALESFORCE_DATASETID
                value: "{{.env_salesforce_datasetId}}"
              - name: ENV_CLOUD_PLATFORM_URL
                value: "{{.env_cloud_platform_url}}"
              - name: ENV_SMTP_Host
                value: "{{.env_smtp_Host}}"
              - name: ENV_TO_EMAIL
                value: "{{.env_to_email}}"
              - name: ENV_FROM_EMAIL
                value: "{{.env_from_email}}"
              - name: ENV_AWS_USERNAME
                value: "{{.env_aws_username}}"
              - name: ENV_CLIENT_ID
                value: "{{.env_client_id}}"
              - name: ENV_REFRESH_TOKEN
                value: "{{.env_refresh_token}}"
              - name: ENV_NETWORK_CODE
                value: "{{.env_network_code}}"
              - name: ENV_APPLICATION_NAME
                value: "{{.env_application_name}}"
              - name: ENV_SALESFORCE_USERNAME
                value: "{{.env_salesforce_username}}"
              - name: ENV_SALESFORCE_URL
                value: "{{.env_salesforce_url}}"
              - name: GOOGLE_APPLICATION_CREDENTIALS
                value: "/etc/gcp/sa_credentials.json"
              - name: ENV_CLOUD_SQL_URL
                valueFrom:
                  secretKeyRef:
                    name: secrets
                    key: cloud_sql_url
              - name: ENV_AWS_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: secrets
                    key: aws_password
              - name: ENV_CLIENT_SECRET
                valueFrom:
                  secretKeyRef:
                    name: secrets
                    key: dfp_client_secret
              - name: ENV_SALESFORCE_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: secrets
                    key: salesforce_password


          restartPolicy: OnFailure

10
Amandeep

したがって、GKEプロジェクトがプロジェクトmy-gkeであり、GKEコンテナがアクセスする必要のあるサービス/モノを含むプロジェクトがプロジェクトmy-dataである場合、1つのアプローチは次のとおりです。

  • my-dataプロジェクトにサービスアカウントを作成します。必要なGCPの役割/権限を指定します(例:roles/bigquery. dataViewer GKEコンテナが読み取る必要のあるBigQueryテーブルがある場合はmy-gke)。
  • これらのサービスアカウント認証情報のKubernetesシークレットリソースを作成します。次のようになります。

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-data-service-account-credentials
    type: Opaque
    data:
      sa_json: <contents of running 'base64 the-downloaded-SA-credentials.json'>
    
  • アクセスが必要なコンテナに資格情報をマウントします。

    [...]
    spec:
      containers:
      - name: my-container
        volumeMounts:
        - name: service-account-credentials-volume
          mountPath: /etc/gcp
          readOnly: true
    [...]
      volumes:
      - name: service-account-credentials-volume
        secret:
          secretName: my-data-service-account-credentials
          items:
          - key: sa_json
            path: sa_credentials.json
    
  • コンテナ内のGOOGLE_APPLICATION_CREDENTIALS環境変数を設定して、マウントされた資格情報のパスを指すようにします。

    [...]
    spec:
      containers:
      - name: my-container
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /etc/gcp/sa_credentials.json
    

これにより、公式のGCPクライアント(例:GCP Pythonクライアント、GCP Javaクライアント、gcloudCLIなど)はGOOGLE_APPLICATION_CREDENTIALSを尊重する必要があります) env varを使用すると、APIリクエストを行うときに、作成したmy-dataサービスアカウントの資格情報を自動的に使用して、資格情報.jsonファイルをマウントします。

24
RochesterinNYC