web-dev-qa-db-ja.com

Dockerのenv-fileに相当するKubernetes

背景:

現在、サービスにはDockerとDocker Composeを使用しています。さまざまな環境の構成を、アプリケーションが読み取る環境変数を定義するファイルに外部化しました。たとえば、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. 次のようにハードコーディングする代わりに、Kubernetesのファイルから環境変数を提供する方法はありますか(ポッドを定義する場合など)。
 apiVersion:v1 
 kind:Pod 
 metadata:
 labels:
 context:docker-k8s-lab 
 name:mysql -pod 
 name:mysql-pod 
 spec:
 containers:
-
 env:
-
名前:MYSQL_USER 
値:mysql 
-
名前:MYSQL_PASSWORD 
値:mysql 
-
名前:MYSQL_DATABASE 
値:sample 
-
 name:MYSQL_ROOT_PASSWORD 
 value:supersecret 
 image: "mysql:latest" 
 name:mysql 
ポート:
-
 containerPort:3306 
  1. これが不可能な場合、推奨されるアプローチは何ですか?
64
Johan

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

この構文はKubernetes 1.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

これで、Podが起動するたびに、Secretで指定された値から環境変数が設定されます。

87
Pixel Elephant

Kubernetes(v1.6)の新しいアップデートにより、(数年前に)求めていたことが可能になります。

これで、yamlファイルでenvFromを次のように使用できます。

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

開発の秘密があなたの秘密である場合、次の方法で作成できます。

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

TxtファイルのコンテンツがKey-Valueの場合:

DB_USER=username_here
DB_PASSWORD=password_here

ドキュメントはまだ例の湖です、私はそれらの場所で本当に一生懸命検索しなければなりませんでした:

21
Or Duan

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

それまでの間、プロビジョニングツールを使用して、ポッド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
10
Spencer Brown

このコメント は、環境変数のリストが変更されたときにkubernetesの設定を更新することなく、これを行う方法を示しています。

基本的に:1)env.shでシークレットを作成します2)ボリュームとしてコンテナにシークレットをマップします3)コンテナの起動スクリプトがenv.shを実行してからアプリを実行します。

1
Michael Cole

これは私のために働く:

ファイル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
````
1
madwyatt