gpt4 book ai didi

kubernetes - 如何在通过 Kubernetes 运行的 GKE 上设置 GOOGLE_APPLICATION_CREDENTIALS

转载 作者:行者123 更新时间:2023-12-04 03:00:26 79 4
gpt4 key购买 nike

在 kubernetes 的帮助下,我在 GKE 上运行日常作业,每天基于 kubernetes 中配置的 cron 启动一个新容器并尝试将一些数据插入 BigQuery。

我们的设置是我们在一个项目中的 GCP 中有 2 个不同的项目我们在另一个项目中维护 BigQuery 中的数据我们运行所有 GKE 所以当 GKE 必须与不同的项目资源交互时,我猜我必须设置一个环境名称为 GOOGLE_APPLICATION_CREDENTIALS 的变量指向一个服务帐户 json 文件,但是由于 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

最佳答案

因此,如果您的 GKE 项目是项目 my-gke ,并且包含您的 GKE 容器需要访问的服务/事物的项目是项目 my-data ,一种方法是:

  • my-data 中创建服务帐户项目。为其提供所需的任何 GCP 角色/权限(例如 roles/bigquery.
    dataViewer
    ,如果您有一些 BigQuery 表,您的 my-gke GKE 容器需要读取)。
  • 为该服务帐号创建一个服务帐号 key 。当您在控制台中执行此操作时 https://cloud.google.com/iam/docs/creating-managing-service-account-keys ,您应该会自动下载 .json包含 SA 凭据的文件。
  • 为这些服务帐户凭据创建 Kubernetes secret 资源。它可能看起来像这样:
    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 CLI 等)都应遵守 GOOGLE_APPLICATION_CREDENTIALS 环境变量,并且在发出 API 请求时,会自动使用 my-data 服务帐户的凭据您创建并挂载了凭证 .json 文件。

    关于kubernetes - 如何在通过 Kubernetes 运行的 GKE 上设置 GOOGLE_APPLICATION_CREDENTIALS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47021469/

    79 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com