"Kubectl लागू" को निष्पादित करने के लिए kubernetes- क्लाइंट का उपयोग कैसे करें

Dec 16 2020

मेरे पास एक पायथन लिपि है जो मूल रूप से निम्नलिखित तीन आदेशों को चलाती है :

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

मैं इसे बदलने के लिए अजगर में लिखे कुबेरनेट्स-क्लाइंट का उपयोग करना चाहता हूं । मेरा वर्तमान कोड, वहाँ yaml फ़ाइलों को लोड करता है (उपयोग करते हुए pyyaml), उन्हें थोड़ा संपादित करता है, एक फ़ाइल में सम्मिलित करता है और उन तीन कमांड को निष्पादित करने के लिए कमांड लाइन kubectl का उपयोग करता है। कुछ कोड:

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

मैं क्या करना चाहता हूं: उन तीन आज्ञाओं को अजगर kubernetes- क्लाइंट के साथ बदलें। डॉक्स पढ़ना और विषय को देखते हुए , मैं उस create_namespaced_deploymentपद्धति के साथ आया था जो मुझे लगता है कि मुझे deployment_file_pathफ़ाइल के लिए उपयोग करने की आवश्यकता है । लेकिन मुझे यह पता नहीं लग सकता है कि मुझे दो अन्य फाइलों के साथ क्या करने की आवश्यकता है।

यह मानते हुए कि मैं पहले से ही तीन YAML फ़ाइलें (pyyaml का प्रयोग करके) भरी हुई है और उन्हें संपादित (नई फ़ाइलों में डंपिंग के बिना) और अब आप मुक्त YAML dicts है deployment_dict, class_dictहै, और rbac_dict, मैं ग्राहक का उपयोग कैसे तीन तरीकों से ऊपर निष्पादित करने के लिए कर सकते हैं?

संपादित करें : बीटीडब्ल्यू यदि तीन डिकेट पास करना संभव नहीं है, तो मैं उन्हें फिर से फाइलों में डंप कर सकता हूं, लेकिन मैं कुबेटल के बजाय अजगर क्लाइंट का उपयोग करना चाहता हूं। यह कैसे करना है?

जवाब

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हैं तो आपको परवाह नहीं है कि वस्तु पहले से मौजूद है, क्या एपीआई का उपयोग करना है, किस विधि को लागू करना है, लेकिन ग्राहक के साथ आपको करना होगा। जैसा कि आप उदाहरण से देखते हैं, आपको निम्न करने की आवश्यकता है:

  1. लोड kube- विन्यास।
  2. उपयोग करने के लिए सही API का चयन करें (आपके द्वारा कॉन्फ़िगर किए गए लोड के बाद ही कोई ऑब्जेक्ट बनाएं)।
  3. उस विधि का चयन करें जिसका आप उपयोग करना चाहते हैं। ध्यान दें कि create_somethingअगर somethingपहले से मौजूद है तो काम नहीं करेगा ।

सख्त नामकरण पैटर्न के लिए धन्यवाद क्लाइंट का उपयोग करके आवश्यक फ़ंक्शन प्राप्त करना आसान है

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 -