背景:
現在、サービスには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
で定義された環境変数に基づいて構成を選択します。
質問:
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
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で指定された値から環境変数が設定されます。
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
ドキュメントはまだ例の湖です、私はそれらの場所で本当に一生懸命検索しなければなりませんでした:
envFrom
を検索-このオプションが利用可能であることを示します。ConfigMap
docs は、使用方法の例を示しています。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
このコメント は、環境変数のリストが変更されたときにkubernetesの設定を更新することなく、これを行う方法を示しています。
基本的に:1)env.sh
でシークレットを作成します2)ボリュームとしてコンテナにシークレットをマップします3)コンテナの起動スクリプトがenv.shを実行してからアプリを実行します。
これは私のために働く:
ファイル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
````