概要
GKE Cluster内のコンテナからGCSのBucket上にあるデータをダウンロードする仕組みが必要だったので、その時に行った設定を残します。
事前準備
以下の項目については、本題とは少しそれるため事前準備として記載します。
- GCPアカウントのセットアップ(プロジェクトの作成)
- gcloudのインストール、セットアップ
-
GKEクラスターの作成
- こちらのドキュメントを参考に
-
IAM(以下の権限を付与)
- Kuvernetes Enginne 管理者
セットアップ
サービスアカウントの作成
GCSにアクセス可能なサービスアカウントを作成し、ダウンロードします。
今回は雑に ストレージ管理者
権限をサービスアカウントに付与しました。
secretsの作成
ダウンロードしたサービスアカウントファイル(json)をkubernetesのsecretsに保管します。
secretsを作成することで、実際にはKubernetes Master内でリソースの永続化に使われる高信頼分散KVS(etcd)内に保管され、
GKE Cluster内のpodからリクエストがあれば参照できるようになっているようです。
secretsについては、こちらの解説が理解しやすかったです。
# 書式
$ kubectl create secret generic <secret名> --from-file=<etcd内に保存されるファイル名>=./<サービスアカウントのファイル名>
# 例)
$ kubectl create secret generic gcs-access-key --from-file=gcs-access.key=./hogehoge.json
# 確認
$ kubectl get secrets
# 詳細確認
$ kubectl decribe secrets <secret名>
認証処理
これで準備は整いました。
あとはsecretsに格納したetcdをmountして、gcloud auth
で認証すればGCSにアクセス可能です。
以下の例では、マニュフェストファイル内で先ほど作成したsecretsをmountさせます。
実際には平文で保存されているためか、復号化等の処理は不要なようです。
マニュフェストの準備
apiVersion: batch/v1
kind: Job
metadata:
name: test
spec:
template:
metadata:
name: test
spec:
volumes:
# ボリュームにsecretsを指定
- name: google-cloud-key
secret:
secretName: gcs-access-key
containers:
- name: test
image: <イメージ名>
args: ["echo", "ok"]
# ボリュームにsecretsを指定
volumeMounts:
- name: google-cloud-key
mountPath: /var/secrets/google
env:
- name: GOOGLE_APPLICATION_CREDENTIALS
value: /var/secrets/google/gcs-access.key
restartPolicy: Never
補足
gsutil
を使用するには、gcloud authで認証すれば大丈夫なんですが、
例えば、コンテナからgoogle-api-python-clientライブラリ等を使用して、
GCSにアクセスするにはGOOGLE_APPLICATION_CREDENTIALS
を設定する必要があるようです。
実行スクリプトの準備
あとはコンテナ起動時に実行するスクリプトに以下のような処理を追加し、呼び出せば認証させることができます。
今回はDockerfileのENTORYPOINTを使用して以下のようなスクリプトを実行させました。
作りは
#!/bin/bash
auth_gcp () {
gcloud auth activate-service-account --key-file=/var/secrets/google/gcs-access.key
}
fetch_data () {
gsutil cp -r "${GCS_INPUT_DATA}" .
}
auth_gcp
fetch_data
まとめ
我流で実装してみましたが、他にいい方法があれば教えてください。