現在表示しているのは、次のバージョン向けのドキュメントです。Kubernetesバージョン: v1.25
Kubernetes v1.25 のドキュメントは積極的にメンテナンスされていません。現在表示されているバージョンはスナップショットです。最新のドキュメントはこちらです: 最新バージョン
Secretsで安全にクレデンシャルを配布する
このページでは、パスワードや暗号化キーなどの機密データをPodに安全に注入する方法を紹介します。
始める前に
Kubernetesクラスターが必要、かつそのクラスターと通信するためにkubectlコマンドラインツールが設定されている必要があります。 このチュートリアルは、コントロールプレーンのホストとして動作していない少なくとも2つのノードを持つクラスターで実行することをおすすめします。 まだクラスターがない場合、minikubeを使って作成するか、 以下のいずれかのKubernetesプレイグラウンドも使用できます:
作業するKubernetesサーバーは次のバージョン以降のものである必要があります: v1.6. バージョンを確認するには次のコマンドを実行してください:kubectl version.機密データをbase64でエンコードする
ユーザー名my-appとパスワード39528$vdg7Jbの2つの機密データが必要だとします。
まず、base64エンコーディングツールを使って、ユーザ名とパスワードをbase64表現に変換します。
ここでは、手軽に入手できるbase64プログラムを使った例を紹介します:
echo -n 'my-app' | base64
echo -n '39528$vdg7Jb' | base64
出力結果によると、ユーザ名のbase64表現はbXktYXBwで、パスワードのbase64表現はMzk1MjgkdmRnN0piです。
Secretを作成する
以下はユーザー名とパスワードを保持するSecretを作成するために使用できる設定ファイルです:
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  username: bXktYXBw
  password: Mzk1MjgkdmRnN0pi
- Secret を作成する - kubectl apply -f https://k8s.io/examples/pods/inject/secret.yaml
- Secretの情報を取得する - kubectl get secret test-secret- 出力: - NAME TYPE DATA AGE test-secret Opaque 2 1m
- Secretの詳細な情報を取得する: - kubectl describe secret test-secret- 出力: - Name: test-secret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== password: 13 bytes username: 7 bytes
kubectlでSecretを作成する
base64エンコードの手順を省略したい場合は、kubectl create secretコマンドで同じSecretを作成することができます。
例えば:
kubectl create secret generic test-secret --from-literal='username=my-app' --from-literal='password=39528$vdg7Jb'
先ほどの詳細なアプローチでは 各ステップを明示的に実行し、何が起こっているかを示していますが、kubectl create secretの方が便利です。
Volumeにある機密情報をアクセスするPodを作成する
これはPodの作成に使用できる設定ファイルです。
apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      volumeMounts:
          # name must match the volume name below
          - name: secret-volume
            mountPath: /etc/secret-volume
  # The secret data is exposed to Containers in the Pod through a Volume.
  volumes:
    - name: secret-volume
      secret:
        secretName: test-secret
- Podを作成する: - kubectl apply -f https://k8s.io/examples/pods/inject/secret-pod.yaml
- Podの - STATUSが- Runningであるのを確認する:- kubectl get pod secret-test-pod- 出力: - NAME READY STATUS RESTARTS AGE secret-test-pod 1/1 Running 0 42m
- Podの中にあるコンテナにシェルを実行する - kubectl exec -i -t secret-test-pod -- /bin/bash
- 機密データは - /etc/secret-volumeにマウントされたボリュームを介してコンテナに公開されます。- ディレクトリ - /etc/secret-volume中のファイルの一覧を確認する:- # Run this in the shell inside the container ls /etc/secret-volume- passwordと- username2つのファイル名が出力される:- password username
- usernameと- passwordファイルの中身を表示する:
# Run this in the shell inside the container
echo "$( cat /etc/secret-volume/username )"
echo "$( cat /etc/secret-volume/password )"
出力:
my-app
39528$vdg7Jb
Secretでコンテナの環境変数を定義する
単一のSecretでコンテナの環境変数を定義する
- Secretの中でkey-valueペアで環境変数を定義する: - kubectl create secret generic backend-user --from-literal=backend-username='backend-admin'
- Secretで定義された - backend-usernameの値をPodの環境変数- SECRET_USERNAMEに割り当てます。- apiVersion: v1 kind: Pod metadata: name: env-single-secret spec: containers: - name: envars-test-container image: nginx env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: backend-user key: backend-username
- Podを作成する: - kubectl create -f https://k8s.io/examples/pods/inject/pod-single-secret-env-variable.yaml
- コンテナの環境変数 - SECRET_USERNAMEの中身を表示する:- kubectl exec -i -t env-single-secret -- /bin/sh -c 'echo $SECRET_USERNAME'- 出力: - backend-admin
複数のSecretからコンテナの環境変数を定義する
- 前述の例と同様に、まずSecretを作成します: - kubectl create secret generic backend-user --from-literal=backend-username='backend-admin' kubectl create secret generic db-user --from-literal=db-username='db-admin'
- Podの中で環境変数を定義する: - apiVersion: v1 kind: Pod metadata: name: envvars-multiple-secrets spec: containers: - name: envars-test-container image: nginx env: - name: BACKEND_USERNAME valueFrom: secretKeyRef: name: backend-user key: backend-username - name: DB_USERNAME valueFrom: secretKeyRef: name: db-user key: db-username
- Podを作成する: - kubectl create -f https://k8s.io/examples/pods/inject/pod-multiple-secret-env-variable.yaml
- コンテナの環境変数を表示する: - kubectl exec -i -t envvars-multiple-secrets -- /bin/sh -c 'env | grep _USERNAME'- 出力: - DB_USERNAME=db-admin BACKEND_USERNAME=backend-admin
Secretのすべてのkey-valueペアを環境変数として設定する
- 複数のkey-valueペアを含むSecretを作成する - kubectl create secret generic test-secret --from-literal=username='my-app' --from-literal=password='39528$vdg7Jb'
- envFromを使用してSecretのすべてのデータをコンテナの環境変数として定義します。SecretのキーがPodの環境変数名になります。 - apiVersion: v1 kind: Pod metadata: name: envfrom-secret spec: containers: - name: envars-test-container image: nginx envFrom: - secretRef: name: test-secret
- Podを作成する: - kubectl create -f https://k8s.io/examples/pods/inject/pod-secret-envFrom.yaml
- usernameと- passwordコンテナの環境変数を表示する- kubectl exec -i -t envfrom-secret -- /bin/sh -c 'echo "username: $username\npassword: $password\n"'- 出力: - username: my-app password: 39528$vdg7Jb