ডকারে এনভি-ফাইলের সমতুল্য কুবারনেটস


87

পটভূমি:

বর্তমানে আমরা আমাদের পরিষেবার জন্য ডকার এবং ডকার রচনা ব্যবহার করছি। আমরা বিভিন্ন পরিবেশের জন্য কনফিগারেশনটিকে ফাইলগুলিতে বহিরাগত করেছি যা অ্যাপ্লিকেশন দ্বারা পঠিত পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করে। উদাহরণস্বরূপ একটি 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. কুবারনেটসের কোনও ফাইল (উদাহরণস্বরূপ কোনও পোড সংজ্ঞায়িত করার সময়) এর মতো হার্ডকোডিংয়ের পরিবর্তে পরিবেশের পরিবর্তনগুলি সরবরাহ করার কোনও উপায় আছে:
apiVersion: v1
ধরনের: পড
মেটাডেটা: 
  লেবেল: 
    প্রসঙ্গ: ডকার-কে 8 এস-ল্যাব
    নাম: mysql-pod
  নাম: mysql-pod
অনুমান: 
  পাত্রে: 
    - 
      env: 
        - 
          নাম: MYSQL_USER
          মান: mysql
        - 
          নাম: MYSQL_PASSWORD
          মান: mysql
        - 
          নাম: MYSQL_DATABASE AB
          মান: নমুনা
        - 
          নাম: MYSQL_ROOT_PASSWORD
          মান: সুপারসেক্রেট
      চিত্র: "মাইএসকিএল: সর্বশেষ"
      নাম: mysql
      বন্দরসমূহ: 
        - 
          ধারকবন্দর: 3306
  1. যদি এটি সম্ভব না হয় তবে প্রস্তাবিত পদ্ধতির কী?

আমিও এরকম কিছু খুঁজছি। আমি কোনও উত্স Secretবা ConfigMapসংস্থান তৈরি করতে চাই না কারণ এটি কেবল সাময়িক এবং পরীক্ষার জন্য ব্যবহার। আমার কাছে কে 8 এস ক্লাস্টারে সীমাবদ্ধ অনুমতি রয়েছে। আমি সম্ভবত একটি Secretউত্স তৈরি করতে সক্ষম হব তবে এটি তৈরি হয়ে গেলে আমি সেগুলি মুছতে সক্ষম হবো না।
alltej

উত্তর:


116

সিক্রেটস বা কনফিগার ম্যাপ ব্যবহারের মাধ্যমে আপনি একটি ধারকের পরিবেশের ভেরিয়েবলগুলি পপুলেট করতে পারেন । যখন আপনি যে ডেটাটির সাথে কাজ করছেন সেটি সংবেদনশীল (যেমন পাসওয়ার্ড), এবং কনফিগার ম্যাপস যখন নেই তখন সিক্রেটস ব্যবহার করুন।

আপনার পড সংজ্ঞাতে উল্লেখ করুন যে ধারকটি একটি গোপন থেকে মানগুলি টানতে হবে:

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

মনে রাখবেন যে এই বাক্য গঠনটি কেবল কুবেরনেটস ১.6 বা তার পরে পাওয়া যাবে। কুবেরনেটসের আগের সংস্করণে আপনাকে প্রতিটি মান নিজেই নির্দিষ্ট করতে হবে, যেমন:

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

(দ্রষ্টব্য যে envমান হিসাবে একটি অ্যারে নিতে)

এবং প্রতিটি মান জন্য পুনরাবৃত্তি।

আপনি যে কোনও পদ্ধতির ব্যবহার করুন না কেন, আপনি এখন দুটি ভিন্ন গোপন সংজ্ঞা নির্ধারণ করতে পারেন, একটি উত্পাদনের জন্য এবং একটি দেবের জন্য।

দেব-গোপন.আইএমএল:

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

প্রোড-সিক্রেট.আইএমএল:

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

এখন যখনই কোনও পড শুরু হয় তখন এটি গোপনে বর্ণিত মানগুলি থেকে তার পরিবেশের পরিবর্তনশীলগুলি তৈরি করে ulate


4
এটি আমার বর্তমান পদ্ধতি, তবে আমার কাছে এনভওয়ার্স হিসাবে প্রকাশিত গোপনগুলির একই তালিকা ব্যবহার করে 3 টি বিভিন্ন পোড রয়েছে। তাদের একবারে সংজ্ঞা দেওয়া এবং 3 টি শুঁটিতে তাদের প্রকাশ করা কি সম্ভব?
jävi

4
আমি যে জানি না।
পিক্সেল এলিফ্যান্ট

4
এটি এত দুর্দান্ত হবে ... এনভ ভার্সনগুলি পাত্রে আনার জন্য বয়লারপ্লেট বরাদ্দ দেওয়ার মতো মনে হচ্ছে। @ পিক্সেলএলিফ্যান্ট
অ্যান্ড্রু এমসিএলাগান

@ jävi আপনি কি প্রতিলিপি নিয়ন্ত্রণকারী বলতে চান? নির্বিশেষে, কোনও একক পোড / আরসি / স্থাপনার সাথে গোপন / কনফিগারেশন মানচিত্রকে আবদ্ধ করার কিছুই নেই। এটি কেবল উপরের মতো ম্যানিফেস্টে সংজ্ঞায়িত করা হয়েছে এবং আপনার পছন্দ মতো অনেক কিছুতে এটি স্থাপন করা যেতে পারে।
আর্নচিক

@ অ্যারনচিক আমার বিশ্বাস তারা এই বৈশিষ্ট্যটি সন্ধান করছেন: github.com/kubernetes/kubernetes/issues/26299 যা দেখে মনে হচ্ছে এটি শীঘ্রই অবতরণ করবে। ফিচারটি কুবেরনেটসের প্রকাশিত সংস্করণে আসার পরে আমি উত্তরটি আপডেট করব।
পিক্সেল এলিফ্যান্ট

36

কুবেরনেটসের জন্য একটি নতুন আপডেট (v1.6) আপনি যা চেয়েছিলেন (বহু বছর আগে) তা মঞ্জুরি দেয়।

আপনি এখন envFromআপনার ইয়ামল ফাইলটিতে এটির মতো ব্যবহার করতে পারেন:

  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

দস্তাবেজগুলি এখনও উদাহরণের হ্রদ, আমাকে সেই জায়গাগুলিতে খুব কঠিন অনুসন্ধান করতে হয়েছিল:


আপনি কি এই সম্পর্কে কুবার্নিটস ডকুমেন্টেশন ভাগ করতে পারেন?
আর্টেম ডলোবাঙ্কো

@ আর্টেমডোলোবাঙ্কো সম্পাদিত, মনে রাখবেন এটি এখনও নতুন এবং ডক্সের হ্রদ, আপনি আরও বিশদ জানতে চাইলে গিথুব ইস্যু ট্র্যাকার নিয়ে অনেক আলোচনা পেতে পারেন।
বা ডুয়ান

@ বা ডুয়ান কীভাবে আমি env ব্যবহার করে চিত্রটি ডকারে একটি সংস্করণ নম্বরটি পাস করব
দেব-স্ট্যাক

যদি আমাদের সেই পাঠ্য ফাইলটি কোনও স্থানে মাউন্ট করতে হয় এবং অ্যাপটি সেখান থেকে স্বয়ংক্রিয়ভাবে vর্ষা তৈরি করতে পারে
তারা প্রসাদ গুরুং

4
এই হওয়া উচিত --from-env-file? --from-fileফাইলের সামগ্রী সহ একটি কী (ইনপুট ফাইলের নামানুসারে) ফলাফল ব্যবহার করা । ব্যবহারের --from-env-fileফলে ফাইলের অভ্যন্তরের কীগুলি গোপনে প্রসারিত হয়। আরও জন্য এই গুগল ডকুমেন্টেশন দেখুন।
ডেভিড

11

YAML ফাইল ব্যবহার করে কুবারনেটসের জন্য একটি পোড সংজ্ঞায়িত করার সময়, কোনও ধারকটির জন্য পরিবেশের ভেরিয়েবল যুক্ত কোনও আলাদা ফাইল নির্দিষ্ট করার সরাসরি কোনও উপায় নেই। কুবেরনেটস প্রকল্পটি বলছে যে তারা ভবিষ্যতে এই অঞ্চলে উন্নতি করবে ( কুবারনেটস ডক্স দেখুন )।

ইতিমধ্যে, আমি একটি বিধান সরঞ্জাম ব্যবহার এবং শুঁটি 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
আদর্শভাবে আপনার কোনও গোপন সংজ্ঞা দিতে সক্ষম হওয়া উচিত (বা আমাদের কাছে থাকা কনফিউল অবজেক্টগুলি) এবং এটি এনভ ভার্স হিসাবে ইনজেকশন দেওয়া উচিত। দুর্ভাগ্যক্রমে যে কাজটি এখনও হয়নি, তাই আমি এটির জন্য ভোট দিচ্ছি।
টিম হকিন

আপনি যদি জবাবদিহিতা ব্যবহার করছেন তবে কুবারনেটস: github.com/ansibl8s/k8s-common- এ মোতায়েন করার জন্য আমাদের একটি সাধারণ ভূমিকা রয়েছে । তারপরে নতুন অ্যাপ্লিকেশনগুলি প্রস্তুত করা খুব সহজ, এটি অন্যান্য রেপোতে কীভাবে ব্যবহার করবেন তা উদাহরণ দেখুন
ant31

আমি প্রত্যাশা করছি যে আমরা 1.2 এর জন্য এনভি ভার্সে গোপনীয়তা করব
পল মরি

4
নোট করুন যে টেম্পলেটগুলির জন্য প্রস্তাব রয়েছে: github.com/kubernetes/kubernetes/blob/master/docs/proposals/…
লুবকেন

আমি যদি kubectl-run20 এনভির ভেরিয়েবলগুলি পাস করতে চাই তবে আমার কী করা উচিত ??? তাহলে কেন 12 ফ্যাক্টর সহজ করবেন না ??
হোমস

5

এটি আমার পক্ষে কাজ করে:

ফাইল 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
````

আমি কীভাবে ডকার ইমেজের জন্য এনভির ব্যবহার করব যাতে আমাকে ডিপোরিয়মেন্টটি আপডেট করতে হবে না। প্রতিবার ভার্সন বাড়ানোর দরকার
দেব-স্ট্যাক

0

এটি একটি পুরানো প্রশ্ন তবে এতে অনেক দর্শক রয়েছে তাই আমি আমার উত্তর যুক্ত করি। কে 8 এস বাস্তবায়ন থেকে কনফিগারেশন পৃথক করার সর্বোত্তম উপায় হেলম ব্যবহার করা। প্রতিটি হেলম প্যাকেজের একটি values.yamlফাইল থাকতে পারে এবং আমরা সহজেই হেলম চার্টে এই মানগুলি ব্যবহার করতে পারি। আমাদের যদি একটি বহু-উপাদান টপোলজি থাকে তবে আমরা একটি ছাতা হেলম প্যাকেজ তৈরি করতে পারি এবং পিতামাতার মান প্যাকেজটি শিশুদের মান ফাইলগুলি ওভাররাইট করতে পারে।


0

এটি একটি পুরানো প্রশ্ন তবে ভবিষ্যতের শিক্ষানবিসের জন্য আমার উত্তরটি বর্ণনা করতে দিন।

আপনি কাস্টমাইজ কনফিগারেশন ম্যাপ জিনেটর ব্যবহার করতে পারেন।

configMapGenerator:
  - name: example
    env: dev.env

এবং পড সংজ্ঞাতে এই কনফিগারম্যাপ / উদাহরণটি উল্লেখ করুন


0

আমি এখন ২ ঘন্টা আমার মাথাটি অউপন টিহিসে টুকরো টুকরো করেছি। আমার (এবং আশাকরি আপনার) ব্যথা হ্রাস করার জন্য আমি ডক্সে একটি খুব সহজ সমাধান পেয়েছি।

  • রাখুন env.prod, env.devহিসাবে আপনি তাদের আছে।

  • এগুলিকে ইয়ামলে আমদানি করতে একটি অনেলিনার স্ক্রিপ্ট ব্যবহার করুন:

    kubectl create configmap my-dev-config --from-env-file=env.dev

    kubectl create configmap my-prod-config --from-env-file=env.prod

আপনি ফলাফলটি দেখতে পারবেন (তাত্ক্ষণিক তৃপ্তির জন্য):

# You can also save this to disk
kubectl get configmap my-dev-config -o yaml

রুবিস্ট হিসাবে, ব্যক্তিগতভাবে আমি এই সমাধানটি ডিআরওয়াইস্টকে খুঁজে পাই কারণ আপনার বজায় রাখার একক পয়েন্ট রয়েছে (ENV বাশ ফাইল, যা পাইথন / রুবি লাইব্রেরির সাথে সামঞ্জস্যপূর্ণ, ..) এবং তারপরে আপনি এটি একক প্রয়োগে YAMLize করেন।

মনে রাখবেন যে আপনাকে আপনার ENV ফাইলটি পরিষ্কার রাখতে হবে (আমার প্রচুর মন্তব্য রয়েছে যা এটি কাজ করতে বাধা দেয় তাই একটি প্রাক চাপ দিতে হয়েছিল cat config.original | egrep -v "^#" | tee config.cleaned এটিকে প্রিপেন্ড করতে হয়েছিল) তবে এই জটিলতাটি যথেষ্ট পরিমাণে পরিবর্তন করতে পারে না।

এটি সব এখানে ডকুমেন্টেড

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.