У меня это работало на кастомном кластере K8. Спасибо!

ощью kubernetes я выполняю ежедневные задания в GKE. Ежедневно на основе cron, настроенного в kubernetes, запускается новый контейнер, и я пытаюсь вставить некоторые данные в BigQuery.

У нас есть 2 различных проекта в GCP, в одном проекте мы храним данные в BigQuery, в другом проекте у нас запущен весь GKE, поэтому, когда GKE должен взаимодействовать с другим ресурсом проекта, я предполагаю, что мне нужно установить среду переменная с именем GOOGLE_APPLICATION_CREDENTIALS, которая указывает на файл json учетной записи службы, но так как каждый день kubernetes запускает новый контейнер, я не уверен, как и где мне следует устанавливать эту переменную.

Заранее спасибо!

ПРИМЕЧАНИЕ: этот файл анализируется как шаблон golang с помощью плагина drone-gke.
---
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
Это наши задания cron для загрузки данных AdUnit.
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

Ответы на вопрос(1)

Решение Вопроса

my-gkeи проект, содержащий службы / вещи, к которым ваши контейнеры GKE должны иметь доступ, является проектомmy-dataОдин из подходов заключается в следующем:

Создайте учетную запись службы вmy-data проект. Дайте ему все необходимые роли / разрешения GCP (например,roles/bigquery. dataViewer если у вас есть несколько таблиц BigQuery, что вашmy-gke ГКЕ контейнеры нужно читать).Создайте ключ учетной записи службы для этой учетной записи службы. Когда вы делаете это в консоли, следующиеhttps://cloud.google.com/iam/docs/creating-managing-service-account-keys, вы должны автоматически загрузить.json файл, содержащий учетные данные SA.

Создайте секретный ресурс 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, интерфейс командной строки gcloud и т. Д. Должны соблюдатьGOOGLE_APPLICATION_CREDENTIALS env var и при выполнении запросов API автоматически используют учетные данныеmy-data учетная запись службы, которую вы создали и смонтировали учетные данные.json файл для.

 michael_erasmus08 дек. 2017 г., 20:49
У меня это работало на кастомном кластере K8. Спасибо!

Ваш ответ на вопрос