कुबेरनेट्स तैनाती की कल्पना में पर्यावरण चर का उपयोग करना


18

मैं वर्तमान में Deployment.yamlएक सेवा को तैनात करने के लिए कुबेरनेट्स युक्ति का उपयोग करता हूं । इसमें एक विशिष्ट आईपी पते के संदर्भ में एक शब्दशः संदर्भ शामिल है ( <static-ip-address>नीचे के रूप में चिह्नित ):

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

मुझे दूरस्थ जीआईटी रिपॉजिटरी में पासवर्ड या आईपी पते जैसी जानकारी को धक्का देने के बारे में चिंतित हूं। क्या मैं पर्यावरण चर का उपयोग करके इस तरह से बच सकता हूं, उदाहरण के लिए तैनाती की कल्पना और वास्तविक तैनाती के साथ मोटे तौर पर निम्नानुसार है:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

तथा

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

जाहिर है कि यह विशिष्ट वाक्यविन्यास अभी तक काम नहीं करता है। लेकिन क्या ऐसा संभव है और यदि ऐसा है तो कैसे?

मैं एक अलग प्रोविज़निंग टूल पर निर्भर नहीं रहना चाहूँगा । गुप्त एस और ConfigMapएस होनहार लगते हैं, लेकिन जाहिर है वे इस तरह से उपभोग नहीं किया जा सकता है जो इस उद्देश्य के अनुरूप हो। अगर मैं सीधे एक स्थिर आईपी पते का संदर्भ दे सकता हूं जो gcloud compute addresses create service-addressकि इसके साथ परिभाषित किया गया है तो सबसे अच्छा होगा।

जवाबों:


28

एक बहुत आसान / क्लीनर समाधान: envsubst

परिनियोजन में:

LoadbalancerIP: $LBIP

तो बस अपना env var बनाएं और kubectl को इस तरह चलाएं:

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

आप बस बैश चर को जिस भी फाइल में उपयोग करना चाहते हैं, इस मामले में YAML प्रकट करते हैं, और उस फाइल को पढ़ने के लिए सुनिश्चित करें। यह फ़ाइल को अपने मूल्यों द्वारा प्रतिस्थापित किए गए env var के साथ आउटपुट देगा। आप इसका उपयोग इस तरह की नई फाइलें बनाने के लिए भी कर सकते हैं:

envsubst < input.yml > output.yml

envsubstउदाहरण के लिए उबंटू / डेबियन gettextपैकेज में उपलब्ध है ।


2
के लिए +1 envsubst। अब तक इस बारे में नहीं पता था
user1129682

1
यह आसान / क्लीनर नहीं है, क्योंकि इसके लिए एक अलग उपकरण की आवश्यकता होती है, जो डिफ़ॉल्ट रूप से सभी प्रणालियों पर स्थापित नहीं है (जैसे मैक)
इवान

@ इवान उनका सवाल था, "लेकिन क्या ऐसा संभव है और यदि ऐसा है तो क्या कुछ ऐसा है?", और यह उनके सवाल का जवाब है। सवाल यह नहीं था कि "मैं डिफ़ॉल्ट रूप से हर ओएस पर उपलब्ध उपकरणों के साथ ऐसा कैसे कर सकता हूं?" और हाँ, यह 1) आसान और 2) क्लीनर का उपयोग करने से है sed। आपकी परिभाषा के अनुसार, प्रस्तावित समाधान sedभी आसान / साफ नहीं होगा, क्योंकि sedडिफ़ॉल्ट रूप से विंडोज मशीनों पर कोई स्थापित नहीं है।
15:15 बजे जन ग्रीवे

यह बिल्कुल स्पष्ट नहीं है कि आप "sed" विकल्प से तुलना कर रहे थे।
इवान

2

एक और सुखद सरल उपाय था: मैं एक Google गणना पता है my-addressपरिभाषित है, और मैं जाहिरा तौर पर तो जैसे सेवा कल्पना में इसका इस्तेमाल कर सकते हैं: loadBalancerIP: my-address

पासवर्ड के लिए आईपी पते और रहस्यों के लिए "बाहरी" स्रोत के रूप में, मेरे सरल उपयोग के मामले में (जीकेके के वातावरण में) प्रावधान उपकरण (या टेम्पलेट) की अधिक आवश्यकता नहीं है।

OBSOLETE Now: मैंने एक तरह के प्रोविजनिंग टूल का उपयोग करने का फैसला किया है, जिसका नाम है "बिल्ट-इन" sed, आखिरकार।

मेरी Deployment.yamlअब में एक "टेम्पलेट चर" शामिल है

loadBalancerIP: $$EXTERNAL_IP

और मैं, के साथ सेवा को तैनात करता हूं, कहते हैं, 1.2.3.4 के साथ बाहरी आईपी पते के रूप में

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -

1
जन ग्रेवे का दृष्टिकोण अधिक सामान्य है जिसे किसी भी प्रकार के चर पर लागू किया जा सकता है। मेरा सुझाव है कि अपने स्वयं के स्वीकार करने के बजाय उसका उत्तर स्वीकार करें जो कम जेनेरिक है और हर अतिरिक्त चर के लिए समायोजित करने की आवश्यकता है।
टेकमीमी

0

आप अपनी yaml फ़ाइलों पर परिवर्तनीय प्रतिस्थापन करने के लिए एक साधारण प्री-प्रोसेसर लिख सकते हैं (या आप jsonnet का उपयोग जन्स कॉन्फ़िगरेशन फ़ाइलों पर एक ही चीज़ को पूरा करने के लिए कर सकते हैं )।

कुबेरनेट विन्यास में सीधे टेम्पलेट जोड़ने के बारे में कुछ चर्चा है लेकिन यह अभी तक लागू नहीं है या उपलब्ध नहीं है।


हां, लेकिन jsonnet एक प्रावधान उपकरण है जैसा कि प्रश्न में उल्लेख किया गया है।
Drux

1
यदि आप कुछ बिल्ट-इन की तलाश कर रहे हैं, तो मैं इस मुद्दे से जुड़ा हुआ हूं, इस बिंदु पर आपका सबसे अच्छा दांव है।
रॉबर्ट बेली

0

जब तक टेम्प्लेट उपलब्ध नहीं हो जाते, तब तक ऐसा करने का सबसे आसान तरीका है कि वह नौकरी चलाएं जो सेवा को अपडेट करने के लिए कुबेरनेट एपीआई का उपयोग करता है । एक अल्पाइन-आधारित छवि में एक छोटी शेल स्क्रिप्ट, एक गुप्त (आईपी पते से युक्त) और एक कॉन्फ़िगरमैप (टेम्पलेट से युक्त) के साथ मिलकर, काफी सरल होनी चाहिए। कठिन बिट सही तरीके से प्रमाणीकरणकर्ता के प्रमाणीकरण और प्राधिकरण सुविधाओं का उपयोग कर रहा है।

/programming/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container API एक्सेस करने का एक उदाहरण देता है। जाहिर है, आप उस उदाहरण में GET के बजाय POST to / api / v1 / namespaces / default / services चाहते हैं


दिलचस्प लगता है, लेकिन क्या आप कृपया थोड़ा और विस्तृत कर सकते हैं। क्या आप एक उपयुक्त शेल स्क्रिप्ट के उदाहरण को दे या इंगित कर सकते हैं।
Drux
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.