Dockerのenv-fileに相当するKubernetes


84

バックグラウンド:

現在、サービスにDockerとDockerComposeを使用しています。さまざまな環境の構成を、アプリケーションによって読み取られる環境変数を定義するファイルに外部化しました。たとえば、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.envortest.envファイルを使用するだけです。

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

次に、アプリケーションはで定義された環境変数に基づいて構成を取得しますprod.env

質問:

  1. 次のようにハードコーディングする代わりに、Kubernetesのファイルから環境変数を提供する方法はありますか(ポッドを定義する場合など)。
apiVersion:v1
種類:ポッド
メタデータ: 
  ラベル: 
    コンテキスト:docker-k8s-lab
    名前:mysql-pod
  名前:mysql-pod
スペック: 
  コンテナ: 
    - 
      env: 
        - 
          名前:MYSQL_USER
          値:mysql
        - 
          名前:MYSQL_PASSWORD
          値:mysql
        - 
          名前:MYSQL_DATABASE
          値:サンプル
        - 
          名前:MYSQL_ROOT_PASSWORD
          値:超秘密
      画像:「mysql:latest」
      名前:mysql
      ポート: 
        - 
          containerPort:3306
  1. これが不可能な場合、推奨されるアプローチは何ですか?

私もこのようなものを探しています。これは一時的なものであり、テストに使用するため、SecretまたはConfigMapリソースを作成したくありません。k8sクラスターでの権限が制限されています。Secretリソースを作成できるかもしれませんが、作成済みのリソースを削除することはできません。
alltej

回答:


114

SecretsまたはConfigMapsを使用して、コンテナーの環境変数にデータを設定できます。使用するデータが機密性の高いもの(パスワードなど)の場合はシークレットを使用し、機密性の低いものはConfigMapsを使用します。

ポッド定義で、コンテナがシークレットから値をプルするように指定します。

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

この構文はKubernetes1.6以降でのみ使用できることに注意してください。以前のバージョンのKubernetesでは、各値を手動で指定する必要があります。例:

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

env値として配列を取ることに注意してください)

そして、すべての値に対して繰り返します。

どちらのアプローチを使用する場合でも、2つの異なるシークレットを定義できます。1つは本番用、もう1つは開発用です。

dev-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

そして、正しいシークレットを正しいKubernetesクラスターにデプロイします。

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
それはとても素晴らしいでしょう... envvarsをコンテナに入れるための定型文の割り当てのようです。@PixelElephant
AndrewMcLagan

@jäviレプリケーションコントローラーのことですか?とにかく、シークレット/構成マップを単一のポッド/ RC /デプロイメントにバインドするものは何もありません。上記のようにマニフェストで定義されているだけで、好きなだけマウントできます。
aronchick 2017年

@aronchick私は彼らがこの機能を探していると信じています:github.com/kubernetes/kubernetes/issues/26299これはまもなく着陸するようです。機能がKubernetesのリリースバージョンに含まれるようになったら、回答を更新します。
ピクセルエレファント

36

Kubernetes(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のドキュメントを共有できますか?
Artem Dolobanko 2017年

@ArtemDolobanko編集済み。これはまだ新しく、ドキュメントの湖であることに注意してください。詳細が必要な場合は、Githubの課題追跡システムで多くのディスカッションを見つけることができます。
またはDuan 2017年

@またはDuanenv
dev-stack

そのテキストファイルをある場所にマウントする必要があり、アプリがそこから環境を自動的に作成する場合はどうなりますか
Tara PrasadGurung19年

2
これはすべき--from-env-fileですか?--from-file結果を使用すると、ファイルの内容とともに1つのキー(入力ファイルにちなんで名付けられます)になります。を使用--from-env-fileすると、ファイル内のキーがシークレットに展開されます。詳細については、このGoogleのドキュメントを参照してください。
デビッド

11

YAMLファイルを使用してKubernetesのポッドを定義する場合、コンテナーの環境変数を含む別のファイルを直接指定する方法はありません。Kubernetesプロジェクトは、将来この領域を改善すると述べています(Kubernetesのドキュメントを参照)。

それまでの間、プロビジョニングツールを使用して、ポッドYAMLをテンプレートにすることをお勧めします。たとえば、Ansibleを使用すると、ポッドのYAMLファイルは次のようになります。

ファイルmy-pod.yaml.template

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

次に、Ansibleプレイブックで変数を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
理想的には、シークレット(または最終的な構成オブジェクト)を定義し、それをenv変数として注入できる必要があります。残念ながら、その作業はまだ完了していないので、私はこれに投票します。
ティムホッキン2015年

ansibleを使用している場合、kubernetesにデプロイする共通の役割があります:github.com/ansibl8s/k8s-common。その後、新しいアプリケーションを準備するのは非常に簡単です。他のリポジトリでの使用方法の例を参照してください:github.com/ansibl8s
ant31

1.2のenv変数でシークレットを実行することを望んでいます
Paul

1
:テンプレートの提案があることに注意してくださいgithub.com/kubernetes/kubernetes/blob/master/docs/proposals/...
luebken

kubectl-run20個の環境変数を渡すために使用したい場合はどうすればよいですか?なぜ12factorを簡単にしないのですか?
holms 2016

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を使用して、バージョンをインクリメントする必要があるたびにdeployment.yamlを更新する必要がないようにするにはどうすればよいですか
dev-

0

これは古い質問ですが、視聴者が多いので、答えを追加します。構成をK8s実装から分離する最良の方法は、Helmを使用することです。各Helmパッケージにはvalues.yamlファイルを含めることができ、Helmチャートでそれらの値を簡単に使用できます。マルチコンポーネントトポロジがある場合は、アンブレラHelmパッケージを作成でき、親値パッケージで子値ファイルを上書きすることもできます。


0

これは古い質問ですが、将来の初心者のために私の答えを説明させてください。

kustomizeconfigMapGeneratorを使用できます。

configMapGenerator:
  - name: example
    env: dev.env

ポッド定義でこのconfigMap / exampleを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.