kubernetes-clientを使用して「kubectlapply」を実行する方法

Dec 16 2020

基本的に次の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_dictclass_dictrbac_dict、どのように私は方法上記の3つを実行するクライアントを使用することができますか?

編集:ところで、3つのdictを渡すことができない場合は、それらをファイルに再度ダンプすることもできますが、kubectlの代わりにpythonクライアントを使用したいと思います。どうやるか?

回答

1 anemyte Dec 23 2020 at 16:35

オブジェクトとアクションごとに個別の関数があります。

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、適用するメソッドは関係ありませんが、クライアントでは必要になります。例からわかるように、次のことを行う必要があります。

  1. kube-configをロードします。
  2. 使用する適切なAPIを選択します(構成をロードした後でのみオブジェクトを作成します)。
  3. 使用する方法を選択します。create_somethingsomethingすでに存在する場合は機能しないことに注意してください。

厳密な命名パターンのおかげで、クライアントから必要な機能を簡単に取得できます。

getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")

ライブラリが提供する例を確認することをお勧めします。それらは実際にそのことを学ぶのに最適です。

JanosVinceller Dec 29 2020 at 05:07

私にはわかりませんが、どこかでこれを見ました:

cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF

そして、それがうまくいくとしたら、これはうまくいくのでしょうか?

cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -