1. ホーム
  2. configuration

[解決済み] Dockerのenvファイルに相当するKubernetesの機能

2022-05-14 11:02:48

質問

背景は?

現在、私たちはサービスに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: ポッド
メタデータ 
  ラベル 
    コンテキスト: docker-k8s-lab
    名前: mysql-pod
  名前: mysql-pod
spec: 
  コンテナ 
    - 
      env: 
        - 
          名前: MYSQL_USER
          値: mysql
        - 
          名前: MYSQL_PASSWORD
          値: mysql
        - 
          名前: MYSQL_DATABASE
          値: サンプル
        - 
          名前: MYSQL_ROOT_PASSWORD
          値: supersecret
      image: "mysql:latest"
      名前: mysql
      ポート 
        - 
          コンテナポート: 3306

  1. これが不可能な場合、推奨されるアプローチは何ですか?

どのように解決するのですか?

コンテナの環境変数は 秘密 または コンフィグマップ . 扱うデータが機密性の高いもの(パスワードなど)の場合はSecretsを、そうでない場合はConfigMapsを使用します。

Podの定義で、コンテナがSecretから値を取得するように指定します。

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種類のSecretを定義することができます。

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で指定された値から環境変数に値が設定されるようになりました。