डबनेर में एनवी-फाइल के बराबर कुबेरनेट्स


84

पृष्ठभूमि:

वर्तमान में हम अपनी सेवाओं के लिए डॉकर और डॉकर कंपोज का उपयोग कर रहे हैं। हमने विभिन्न वातावरणों के लिए विन्यास को फाइलों में बदल दिया है जो कि अनुप्रयोग द्वारा पढ़े गए पर्यावरण चरों को परिभाषित करता है। उदाहरण के लिए एक prod.envफ़ाइल:

ENV_VAR_ONE=Something Prod
ENV_VAR_TWO=Something else Prod

और एक test.envफ़ाइल:

ENV_VAR_ONE=Something Test
ENV_VAR_TWO=Something else Test

इस प्रकार हम केवल कंटेनर को शुरू करते समय prod.envया test.envफाइल का उपयोग कर सकते हैं :

docker run --env-file prod.env <image>

हमारा एप्लिकेशन तब परिभाषित किए गए पर्यावरण चर के आधार पर इसके कॉन्फ़िगरेशन को चुनता है prod.env

प्रशन:

  1. क्या कुबेरनेट्स में एक फ़ाइल से पर्यावरण चर प्रदान करने का एक तरीका है (उदाहरण के लिए, जब एक फली को परिभाषित करते हुए) उन्हें इस तरह से हार्डकोड करने के बजाय:
एपीवर्सन: v1
तरह: फली
मेटाडाटा: 
  लेबल: 
    संदर्भ: docker-k8s-lab
    नाम: mysql- फली
  नाम: mysql- फली
कल्पना: 
  कंटेनर: 
    - 
      env: 
        - 
          नाम: MYSQL_USER
          मूल्य: mysql
        - 
          नाम: MYSQL_PASSWORD
          मूल्य: mysql
        - 
          नाम: MYSQL_DATABASE
          मूल्य: नमूना
        - 
          नाम: MYSQL_ROOT_PASSWORD
          मूल्य: सुपरसेक्ट
      चित्र: "mysql: latest"
      नाम: mysql
      बंदरगाहों: 
        - 
          कंटेनरपार्ट: 3306
  1. यदि यह संभव नहीं है, तो सुझाया दृष्टिकोण क्या है?

मैं भी कुछ इस तरह की तलाश में हूं। मैं एक संसाधन Secretया ConfigMapसंसाधन नहीं बनाना चाहता क्योंकि यह सिर्फ अस्थायी है और परीक्षण के लिए उपयोग करता है। मेरे पास k8s क्लस्टर में अनुमतियाँ हैं। मैं शायद एक Secretसंसाधन बनाने में सक्षम हो जाऊंगा, लेकिन पहले से ही निर्मित होने के बाद मैं उन्हें हटा नहीं पाऊंगा।
अगस्त

जवाबों:


114

आप एक कंटेनर के वातावरण चर को राज या कॉन्फ़िगमैप के उपयोग के माध्यम से आबाद कर सकते हैं । जब आप जिस डेटा के साथ काम कर रहे हैं, वह संवेदनशील (जैसे पासवर्ड), और जब यह नहीं हो तब कॉन्फ़िगर करें का उपयोग करें।

अपनी पॉड परिभाषा में निर्दिष्ट करें कि कंटेनर को एक सीक्रेट से मान खींचने चाहिए:

apiVersion: v1
kind: Pod
metadata: 
  labels: 
    context: docker-k8s-lab
    name: mysql-pod
  name: mysql-pod
spec: 
  containers:
  - image: "mysql:latest"
    name: mysql
    ports: 
    - containerPort: 3306
    envFrom:
      - secretRef:
         name: mysql-secret

ध्यान दें कि यह सिंटैक्स केवल कुबेरनेट्स 1.6 या बाद में उपलब्ध है। कुबेरनेट्स के पुराने संस्करण पर आपको प्रत्येक मान को मैन्युअल रूप से निर्दिष्ट करना होगा, जैसे:

env: 
- name: MYSQL_USER
  valueFrom:
    secretKeyRef:
      name: mysql-secret
      key: MYSQL_USER

(ध्यान दें कि envमान के रूप में एक सरणी लें)

और हर मूल्य के लिए दोहरा रहा है।

आप जो भी दृष्टिकोण का उपयोग करते हैं, अब आप दो अलग-अलग राज को परिभाषित कर सकते हैं, एक उत्पादन के लिए और दूसरा देव के लिए।

देव-secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_USER: bXlzcWwK
  MYSQL_PASSWORD: bXlzcWwK
  MYSQL_DATABASE: c2FtcGxlCg==
  MYSQL_ROOT_PASSWORD: c3VwZXJzZWNyZXQK

prod-secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: mysql-secret
type: Opaque
data:
  MYSQL_USER: am9obgo=
  MYSQL_PASSWORD: c2VjdXJlCg==
  MYSQL_DATABASE: cHJvZC1kYgo=
  MYSQL_ROOT_PASSWORD: cm9vdHkK

और सही कुबेरनेट क्लस्टर में सही रहस्य को तैनात करें:

kubectl config use-context dev
kubectl create -f dev-secret.yaml

kubectl config use-context prod
kubectl create -f prod-secret.yaml

अब जब भी कोई पॉड शुरू होता है तो वह सीक्रेट में निर्दिष्ट मूल्यों से अपने पर्यावरण चर को आबाद करेगा।


5
यह मेरा वर्तमान दृष्टिकोण है, हालांकि मेरे पास EnvVars के रूप में उजागर रहस्यों की एक ही सूची का उपयोग करके 3 अलग-अलग फली हैं। क्या उन्हें एक बार परिभाषित करना और उन्हें 3 पॉड्स में उजागर करना संभव है?
जावी

1
मेरी जानकारी में नहीं।
पिक्सेल एलीफेंट

2
यह बहुत अच्छा होगा ... कंटेनर में env var पाने के लिए बॉयलरप्लेट के आबंटन जैसा लगता है। @PixelElephant
एंड्रयू मैकलेगन

@ jvi क्या आपका मतलब प्रतिकृति नियंत्रकों से है? भले ही, एक फली / आरसी / परिनियोजन के लिए एक गुप्त / कॉन्फ़िगर मानचित्र को बाध्यकारी नहीं है। यह सिर्फ ऊपर के रूप में परिभाषित किया गया है, और आप जितनी चाहें उतनी चीजों को माउंट कर सकते हैं।
अर्नोचिक

@aronchick मेरा मानना ​​है कि वे इस सुविधा की तलाश कर रहे हैं: github.com/kubernetes/kubernetes/issues/26299 जो ऐसा लग रहा है कि जल्द ही उतर जाएगा। कुबेरनेट्स के रिलीज़ किए गए संस्करण में एक बार सुविधा होने पर मैं उत्तर को अपडेट करूंगा।
पिक्सेल हाथी

36

कुबेरनेट्स (v1.6) के लिए एक नया अपडेट जो आपने (सालों पहले) मांगा था।

अब आप envFromअपनी yaml फ़ाइल में इस तरह का उपयोग कर सकते हैं :

  containers:
  - name: django
    image: image/name
    envFrom:
      - secretRef:
         name: prod-secrets

जहां विकास-रहस्य आपका रहस्य है, आप इसे बना सकते हैं:

kubectl create secret generic prod-secrets --from-env-file=prod/env.txt`

जहां txt फ़ाइल सामग्री एक कुंजी-मूल्य है:

DB_USER=username_here
DB_PASSWORD=password_here

डॉक्स अभी भी उदाहरणों की झीलें हैं, मुझे उन स्थानों पर वास्तव में कठिन खोज करनी थी:


क्या आप इस पर Kubernetes प्रलेखन साझा कर सकते हैं?
आर्टेम डोलोबैंको

@ArtemDolobanko संपादित, ध्यान रखें कि यह अभी भी नया है और डॉक्स की झीलों, आप अधिक जानकारी चाहते हैं, तो आप गितुब के मुद्दों पर चर्चा कर सकते हैं।
या दुआं

@Or Duan मैं कैसे एक संस्करण संख्या पास करूँगा dov छवि का उपयोग करते हुए
देव-ढेर

क्या होगा यदि हमें उस पाठ फ़ाइल को कुछ स्थान पर माउंट करना है और ऐप वहां से स्वचालित रूप से एनवी बनाएगा
तारा प्रसाद गुरुंग

2
क्या यह होना चाहिए --from-env-file? --from-fileफ़ाइल की सामग्री के साथ एक कुंजी (इनपुट फ़ाइल के नाम पर) में परिणामों का उपयोग करना । का उपयोग करके --from-env-fileफ़ाइल के अंदर की चाबियाँ को गुप्त में फैलता है। अधिक के लिए यह Google दस्तावेज़ देखें ।
डेविड

11

जब एक YAML फ़ाइल का उपयोग करके कुबेरनेट्स के लिए एक पॉड को परिभाषित करते हैं, तो कंटेनर के लिए पर्यावरण चर वाले एक अलग फ़ाइल को निर्दिष्ट करने का कोई सीधा तरीका नहीं है। कुबेरनेट्स परियोजना का कहना है कि वे भविष्य में इस क्षेत्र में सुधार करेंगे ( कुबेरनेट्स डॉक्स देखें )।

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

फ़ाइल my-pod.yaml.template:

apiVersion: v1
kind: Pod
...
spec:
  containers:
  ...
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: {{ mysql_root_pasword }}
    ...

तब आपकी एंज़िबल प्लेबुक चर को mysql_root_passwordसुविधाजनक रूप में निर्दिष्ट कर सकती है , और संसाधन बनाते समय इसे प्रतिस्थापित कर सकती है, उदाहरण के लिए:

फ़ाइल my-playbook.yaml:

- hosts: my_hosts
  vars_files: 
  - my-env-vars-{{ deploy_to }}.yaml
  tasks:
  - name: create pod YAML from template
    template: src=my-pod.yaml.template dst=my-pod.yaml
  - name: create pod in Kubernetes
    command: kubectl create -f my-pod.yaml

फ़ाइल my-env-vars-prod.yaml:

mysql_root_password: supersecret

फ़ाइल my-env-vars-test.yaml:

mysql_root_password: notsosecret

उदाहरण के लिए, अब आप पॉड संसाधन बनाकर चलते हैं:

ansible-playbook -e deploy=test my-playbook.yaml

4
आदर्श रूप से आपको एक सीक्रेट (या हमारे पास जो अंतिम कॉन्फ़िगरेशन की वस्तुएं हैं) को परिभाषित करने में सक्षम होना चाहिए और जो कि एनवी वर्जन के रूप में इंजेक्ट किया गया है। दुर्भाग्य से वह काम अभी तक नहीं हुआ है, इसलिए मैं इसके लिए मतदान कर रहा हूं।
टिम होकिन

यदि आप ansible का उपयोग कर रहे हैं, तो हमारे पास kubernetes पर तैनात करने के लिए एक सामान्य भूमिका है: github.com/ansibl8s/k8s-common । फिर नए एप्लिकेशन तैयार करना बहुत आसान है, अन्य रेपो में इसका उपयोग करने के लिए छूट देखें: github.com/ansibl8s
ant31

मुझे उम्मीद है कि हम 1.2 के लिए env
var

1
ध्यान दें कि टेम्प्लेट का एक प्रस्ताव है: github.com/kubernetes/kubernetes/blob/master/docs/proposals/…
luebken

अगर मैं kubectl-run20 env वेरिएबल्स पास करना चाहता हूँ तो मुझे क्या करना चाहिए ??? तो फिर 12factor आसान क्यों नहीं है ??
होम्स

3

यह मेरे लिए काम करता है:

फ़ाइल env-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: env-secret
type: Opaque
stringData:
  .env: |-
    APP_NAME=Laravel
    APP_ENV=local

और में deployment.yamlयाpod.yaml

spec:
  ...
        volumeMounts:
        - name: foo
          mountPath: "/var/www/html/.env"
          subPath: .env
      volumes:
      - name: foo
        secret:
          secretName: env-secret
````

मैं docker की छवि के लिए env का उपयोग कैसे करूंगा ताकि मुझे परिनियोजन अपडेट नहीं करना पड़े। मुझे हर बार संस्करण बढ़ाने की आवश्यकता होगी
dev-stack-

0

यह एक पुराना सवाल है, लेकिन इसमें बहुत सारे दर्शक हैं इसलिए मैं अपना जवाब जोड़ता हूं। K8s कार्यान्वयन से कॉन्फ़िगरेशन को अलग करने का सबसे अच्छा तरीका हेल्म का उपयोग करना है। प्रत्येक हेल्म पैकेज में एक values.yamlफ़ाइल हो सकती है और हम हेल्म चार्ट में उन मूल्यों का आसानी से उपयोग कर सकते हैं। यदि हमारे पास एक बहु-घटक टोपोलॉजी है, तो हम एक छाता हेल्म पैकेज बना सकते हैं और माता-पिता मूल्य पैकेज भी बच्चों के मूल्यों की फाइलों को अधिलेखित कर सकते हैं।


0

यह एक पुराना प्रश्न है लेकिन मुझे भविष्य के शुरुआती के लिए अपने उत्तर का वर्णन करने दें।

आप configMapGenerator kustomize का उपयोग कर सकते हैं।

configMapGenerator:
  - name: example
    env: dev.env

और पॉड परिभाषा में इस configMap / उदाहरण देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.