Google Cloud Functions(Python)からGoogle Kubernetes Engine(GKE)のジョブを登録する
简述
Google Kubernetes Engine(GKE)でバッチジョブを実行することができるのですが、Cloud Functionsからジョブ実行できたらCloud Storageなどのイベントをトリガーにできて捗るなぁと思いついて実際に可能か試してみました。
请参考以下内容关于GKE作业的执行。
使用GKE执行批处理作业。
前提 tí) – premise
请参考下列文章的环境设置。
实际进行环境建设时,请一同参考。
Google Kubernetes EngineでUnity ML-Agentsを動かしてみる(V0.5.0対応)
https://qiita.com/kai_kou/items/3a4d860f8353ff1b3110
-
- ローカルにDockerがインストール済み
-
- ローカルにgcloud、kubectl がインストール済み
-
- GKEでクラスタ作成済み
- ジョブ実行するDockerイメージがGoogle Container RegistryにPUSH済み
实现Cloud Functions函数
准备要部署到Cloud Functions的文件。
为了从Python注册Kubernetes作业,我使用了官方的客户端库。
kubernetes客户端/Python
https://github.com/kubernetes-client/python
kubernetesのClient Libraryが利用できるようにします。
kubernetes
我們將所需的GKE作業註冊資訊準備為Yaml檔案。
內容將重複使用前一篇文章中的內容。
apiVersion: batch/v1
kind: Job
metadata:
name: GKEクラスタのpod名(任意)
spec:
template:
spec:
containers:
- name: unity-ml-agents-on-gke
image: gcr.io/[GCPのプロジェクトID]/unity_ml_agents_on_gke:latest
command: ["mlagents-learn", "trainer_config.yaml", "--env", "3DBall", "--train"]
restartPolicy: OnFailure
为了能够访问GKE集群,我们要准备一个config文件。
> gcloud container clusters get-credentials [GKEのクラスタ名]
上記コマンドで、クラスタへの接続情報が~/.kube/config ファイルに保存されます。
このファイルをCloud Functionsにデプロイする際に含めるようにします。
ローカル環境でジョブ登録などのコマンドを実行していると、ファイルにaccess-token 、expiry が含まれている可能性があります。
如果在Cloud Functions上运行,访问GKE所需的访问令牌将引用Cloud Functions的默认服务帐户,因此无需创建自定义服务帐户。
不必在配置文件中保留access-token和expiry,可以逐行删除而不会有问题。
在服务器之间配置生产环境应用程序的身份验证设置
https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python
在实际运营中,为了保护配置文件中包含的集群IP地址等信息,可以使用Cloud KMS等工具对文件进行加密。
> cp ~/.kube/config .
这是在 Cloud Functions 上执行的源代码。
import os
from kubernetes import client, config
import subprocess
import yaml
def create_gke_job(request):
subprocess.check_output(['cp', './config', '/tmp/config'])
config.load_kube_config('/tmp/config')
with open(os.path.join(os.path.dirname(__file__), "./job.yaml")) as f:
dep = yaml.load(f)
k8s = client.BatchV1Api()
resp = k8s.create_namespaced_job(body=dep, namespace="default")
print("Deployment created. status='%s'" % str(resp.status))
总结如下,在使用kubernetes的load_kube_config方法调用配置文件时,不仅会加载文件,还会对访问令牌等进行追加,因此需要将其复制到/tmp文件夹中,以便进行写入。
为了确保在 job.yaml 文件中定义的 metadata.name 是唯一的,因此在当前实现中,如果多次执行函数,将会导致出现重复的 pod 名称错误。因此,在 yaml.load 之后需要进行修改。
kubernetesのClient Libraryについては、APIが多くて、どのAPIを利用すればよいのか(非常に)わかりにくいですが、ドキュメントがしっかり用意されているので、探せば大抵のことはわかるっぽいです(未確認)
python/kubernetes/README.md
https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md
あとはCloud Functionsにデプロイして良しなに。
今回は関数が実行できたら良いだけので、トリガを–trigger-http にしています。
> gcloud functions deploy create_gke_job --trigger-http --runtime=python37
※いつのまにかgcloud functions コマンドで、–runtime=python37 の指定ができるようになっていました。(Google Cloud SDK 216.0.0)
参考
使用GKE执行批处理作业。
尝试在Google Kubernetes Engine上运行Unity ML-Agents(兼容V0.5.0版本)
https://qiita.com/kai_kou/items/3a4d860f8353ff1b3110
Kubernetes客户端/Python
https://github.com/kubernetes-client/python
python/kubernetes/README.md
https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md
Python/kubernetes/README.md
https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md
Python/kubernetes/README.md
https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md
在生产环境中的应用程序上进行服务器之间的认证设置。
https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-python
云函数中使用Python的文章总结
https://qiita.com/kai_kou/items/2f65db5305ba280ad81e