Cara menggunakan kubernetes-client untuk menjalankan "kubectl apply"

Dec 16 2020

Saya memiliki skrip python yang pada dasarnya menjalankan tiga perintah berikut :

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

Saya ingin menggunakan kubernetes-client yang ditulis dengan python untuk menggantikannya. Kode saya saat ini, memuat file yaml yang ada (menggunakan pyyaml), mengeditnya sedikit, memasukkannya ke dalam file dan menggunakan baris perintah kubectl untuk menjalankan ketiga perintah tersebut. Beberapa kode:

# 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 ...

Yang ingin saya lakukan: Ganti ketiga perintah tersebut dengan python kubernetes-client. Membaca dokumen dan melihat topiknya , saya menemukan create_namespaced_deploymentmetode yang menurut saya perlu saya gunakan untuk deployment_file_pathfile tersebut. Tapi sepertinya saya tidak tahu apa yang perlu saya lakukan dengan dua file lainnya.

Dengan asumsi bahwa saya sudah dimuat tiga file YAML (menggunakan pyyaml) dan diedit mereka (tanpa membuang ke dalam file baru) dan sekarang Anda memiliki dicts YAML bebas deployment_dict, class_dictdan rbac_dict, Bagaimana cara menggunakan klien untuk mengeksekusi tiga di atas metode?

EDIT : BTW jika tidak memungkinkan untuk melewatkan tiga dicts, saya bisa membuangnya ke dalam file lagi tetapi saya ingin menggunakan klien python daripada kubectl. Bagaimana cara melakukannya?

Jawaban

1 anemyte Dec 23 2020 at 16:35

Ada fungsi terpisah untuk setiap objek dan tindakan:

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

Ketika Anda menggunakan kubectl applyAnda tidak peduli apakah objek tersebut sudah ada, API apa yang akan digunakan, metode mana yang akan diterapkan, tetapi dengan klien Anda harus melakukannya. Seperti yang Anda lihat dari contoh, Anda perlu:

  1. Muat kube-config.
  2. Pilih API yang tepat untuk digunakan (buat objek hanya setelah Anda memuat konfigurasi).
  3. Pilih metode yang ingin Anda gunakan. Perhatikan bahwa create_somethingtidak akan berfungsi jika somethingsudah ada.

Berkat pola penamaan yang ketat, mudah untuk mendapatkan fungsi yang diperlukan dari klien menggunakan

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

Saya menyarankan Anda untuk melihat contoh yang disediakan perpustakaan, mereka benar-benar hebat untuk mempelajarinya.

JanosVinceller Dec 29 2020 at 05:07

Saya tidak tahu, tetapi di suatu tempat saya melihat ini:

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

Dan jika itu berhasil, apakah ini berhasil?

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