kubernetes-clientを使用して「kubectlapply」を実行する方法
基本的に次の3つのコマンドを実行するPythonスクリプトがあります。
kubectl apply -f class.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml
Pythonで記述されたkubernetes-clientを使用して置き換えたいと思います。私の現在のコードは、そこにあるyamlファイルを(を使用してpyyaml
)ロードし、それらを少し編集し、ファイルに挿入し、コマンドラインkubectlを使用してこれらの3つのコマンドを実行します。コードの一部:
# load files, edit them and dump into new files, part ...
result = run(['kubectl', 'apply', '-f', class_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', rbac_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', deployment_file_path])
# status check part ...
やりたいこと:これらの3つのコマンドをpythonkubernetes-clientに置き換えます。ドキュメントを読んでトピックを見るcreate_namespaced_deployment
と、deployment_file_path
ファイルに使用する必要があると思う方法に出くわしました。しかし、他の2つのファイルをどうする必要があるのか理解できないようです。
私はすでに(PyYAMLとを使用して)3つのYAMLファイルをロードし、(新しいファイルにダンプなし)、それらを編集したと仮定すると、今、あなたは無料のYAML dictsを持っているdeployment_dict
、class_dict
とrbac_dict
、どのように私は方法上記の3つを実行するクライアントを使用することができますか?
編集:ところで、3つのdictを渡すことができない場合は、それらをファイルに再度ダンプすることもできますが、kubectlの代わりにpythonクライアントを使用したいと思います。どうやるか?
回答
オブジェクトとアクションごとに個別の関数があります。
from kubernetes import client, config
import yaml
body = yaml.safe_load("my_deployment.yml")
config.load_kube_config()
apps_api = client.AppsV1Api()
apps_api.create_namespaced_deployment(body=body, namespace="default")
apps_api.replace_namespaced_deployment(body=body, namespace="default")
apps_api.patch_namespaced_deployment(body=body, namespace="default")
apps_api.delete_namespaced_deployment(body=body, namespace="default")
body = yaml.safe_load("my_cluster_role.yml")
rbac_api = client.RbacAuthorizationV1Api()
rbac_api.create_cluster_role(body=body)
rbac_api.patch_cluster_role(body=body)
rbac_api.replace_cluster_role(body=body)
rbac_api.delete_cluster_role(body=body)
# And so on
使用kubectl apply
する場合、オブジェクトがすでに存在するかどうか、使用するAPI、適用するメソッドは関係ありませんが、クライアントでは必要になります。例からわかるように、次のことを行う必要があります。
- kube-configをロードします。
- 使用する適切なAPIを選択します(構成をロードした後でのみオブジェクトを作成します)。
- 使用する方法を選択します。
create_something
がsomething
すでに存在する場合は機能しないことに注意してください。
厳密な命名パターンのおかげで、クライアントから必要な機能を簡単に取得できます。
getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")
ライブラリが提供する例を確認することをお勧めします。それらは実際にそのことを学ぶのに最適です。
私にはわかりませんが、どこかでこれを見ました:
cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF
そして、それがうまくいくとしたら、これはうまくいくのでしょうか?
cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -