kubernetesの助けを借りて、私はGKEで毎日ジョブを実行しています。kubernetesで構成されたcronに基づいて毎日、新しいコンテナーが起動し、BigQueryにデータを挿入しようとします。
1つのプロジェクトでGCPに2つの異なるプロジェクトがあり、他のプロジェクトでBigQueryのデータを維持しているため、すべてのGKEが実行されているため、GKEが異なるプロジェクトリソースとやり取りする必要がある場合は、環境を設定する必要がありますサービスアカウントのjsonファイルを指すGOOGLE_APPLICATION_CREDENTIALSという名前の変数ですが、毎日kubernetesが新しいコンテナを起動しているため、この変数をどこでどのように設定すればよいかわかりません。
前もって感謝します!
---
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
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
である場合、1つのアプローチは次のとおりです。
my-data
プロジェクトにサービスアカウントを作成します。必要なGCPの役割/権限を指定します(例:roles/bigquery. dataViewer
GKEコンテナが読み取る必要のあるBigQueryテーブルがある場合はmy-gke
)。.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クライアント、gcloudCLIなど)はGOOGLE_APPLICATION_CREDENTIALS
を尊重する必要があります) env varを使用すると、APIリクエストを行うときに、作成したmy-data
サービスアカウントの資格情報を自動的に使用して、資格情報.json
ファイルをマウントします。