"Kubectl लागू" को निष्पादित करने के लिए kubernetes- क्लाइंट का उपयोग कैसे करें
मेरे पास एक पायथन लिपि है जो मूल रूप से निम्नलिखित तीन आदेशों को चलाती है :
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
, मैं ग्राहक का उपयोग कैसे तीन तरीकों से ऊपर निष्पादित करने के लिए कर सकते हैं?
संपादित करें : बीटीडब्ल्यू यदि तीन डिकेट पास करना संभव नहीं है, तो मैं उन्हें फिर से फाइलों में डंप कर सकता हूं, लेकिन मैं कुबेटल के बजाय अजगर क्लाइंट का उपयोग करना चाहता हूं। यह कैसे करना है?
जवाब
प्रत्येक वस्तु और क्रिया के लिए एक अलग कार्य होता है:
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
हैं तो आपको परवाह नहीं है कि वस्तु पहले से मौजूद है, क्या एपीआई का उपयोग करना है, किस विधि को लागू करना है, लेकिन ग्राहक के साथ आपको करना होगा। जैसा कि आप उदाहरण से देखते हैं, आपको निम्न करने की आवश्यकता है:
- लोड kube- विन्यास।
- उपयोग करने के लिए सही 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 -