エンタープライズアプリケーションをデプロイする際、データベースのパスワードや API キーなどの機密データを管理する必要があります。この情報をコードにハードコーディングすると、深刻なセキュリティリスクやデータ漏洩の可能性があります。Secret は、機密データをアプリケーションコードから完全に分離する暗号化されたストレージメカニズムを提供します。これにより、コードの漏洩によるセキュリティインシデントを防ぐことができます。
選択のリファレンス
方法 | 特徴 | 利用シーン |
ボリュームとしてマウント (推奨) | ファイル権限を使用してデータを分離し、プロセス間の漏洩を防ぎます。ファイル内容は自動的に同期されます。 | 本番環境、特にデータベースのパスワードや API キーなど、詳細なファイル権限コントロールが必要な機密性の高い情報に推奨されます。 |
環境変数インジェクション | 環境変数はすべてのプロセスから容易にアクセスできるため、ログにデータが漏洩するリスクがあります。構成の更新を有効にするには、Pod を再起動する必要があります。 | 構成をインジェクトするためのシンプルで高速な方法です。この方法は、ログレベルやエンドポイントの構成、または環境変数を使用するように適合されたレガシーアプリケーションに適しています。 |
Secret の作成
コンソール
Container Service for Kubernetes (ACK) コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Secret] ページで、[名前空間] (デフォルト) を選択し、右上隅の [作成] をクリックして、表示されるパネルで Secret を構成します。
名前:nginx-secret
タイプ:Opaque
Opaque:パスワードや証明書などの機密情報を保存するために使用される Base64 エンコードされた Secret です。
プライベートイメージリポジトリの認証情報:プライベートイメージリポジトリの認証情報を保存します。
TLS 証明書:TLS/SSL 証明書とその秘密鍵を保存します。
キーと値のペアを追加または削除します。
username: admin
password: 'MySecurePassword!'
api-key: 'ak-1234567890abcdef'
Secret にプレーンテキストデータを入力する場合は、[Base64 を使用してデータ値をエンコード] を選択します。
kubectl
Secret を作成します。
kubectl create secret generic nginx-secret \ --from-literal=username=admin \ --from-literal=password='MySecurePassword!' \ --from-literal=api-key='ak-1234567890abcdef' \ -n defaultSecret の情報を表示します。
kubectl get secret nginx-secret想定される出力:
NAME TYPE DATA AGE nginx-secret Opaque 3 23h
Secret の使用
Deployment と Secret は同じ名前空間に存在する必要があります。
方法 1:ボリュームとしてマウント
この方法では、Secret をファイルとしてマウントすることで、証明書、秘密鍵、構成ファイルなどの機密データに安全にアクセスできます。アプリケーションは、それらをローカルファイルであるかのように読み取ることができます。
コンソールでの構成
Deployment を作成します。
既存の Deployment がある場合は、 を選択し、次の手順で説明するように [コンテナー構成] セクションでボリュームを編集します。
ステートレスワークロード (Deployment) を作成します。
[ステートレス] ページで、[イメージから作成] をクリックします。
[アプリケーションの基本情報] ページで、アプリケーションの基本情報を設定します。次に、[次へ] をクリックして [コンテナー構成] ページに移動します。
アプリケーション名:nginx-volume-demo
名前空間:default
レプリカ数:2
タイプ:ステートレス (Deployment)
コンテナーを構成します。
[コンテナー構成] タブで、[イメージ名] と [ポート] を構成します。
イメージ名:
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6コンテナーポート:80、プロトコル:TCP
重要このイメージをプルするには、クラスターにパブリックネットワークアクセスが必要です。クラスターの作成時に[VPC の SNAT を構成] (デフォルトで有効) を選択した場合、追加の構成は不要です。それ以外の場合は、「ACK クラスターのインターネットアクセスを有効にする」をご参照ください。
[コンテナー構成] タブの [ボリューム] セクションで、[ローカルストレージの追加] をクリックします。
ボリュームタイプ:Secret
名前:secret-volume
マウントソース:作成した Secret (例:nginx-secret) を選択します。
コンテナーパス:コンテナー内のマウントパス (例:/etc/nginx/secrets) を指定します。
情報を構成した後、[次へ] をクリックします。
[詳細設定] ページで、必要に応じてスケーリング、スケジューリング、ラベル、アノテーションを構成します。その後、ページ下部の [作成] をクリックします。
[作成完了] ページで、アプリケーションタスクを表示します。
[アプリケーション作成タスクが送信されました] パネルで [アプリケーション詳細の表示] をクリックし、コンテナーのステータスが
Runningであることを確認します。
Secret ファイルがマウントされていることを確認します。
ログインするコンテナー (例:nginx-volume-demo-7xxxxxx****) を選択します。[操作] 列で [ターミナル] をクリックし、nginx を選択してコンテナーにログインします。
Secret ファイルがマウントされていることを確認します。
ls -la /etc/nginx/secrets想定される出力:
total 4 drwxrwxrwt 3 root root 140 Sep 15 02:31 . drwxr-xr-x 1 root root 4096 Sep 15 02:31 .. drwxr-xr-x 2 root root 100 Sep 15 02:31 ..2025_09_15_02_31_13.2599431463 lrwxrwxrwx 1 root root 32 Sep 15 02:31 ..data -> ..2025_09_15_02_31_13.2599431463 lrwxrwxrwx 1 root root 18 Sep 15 02:31 api-key.txt -> ..data/api-key.txt lrwxrwxrwx 1 root root 22 Sep 15 02:31 db-password.txt -> ..data/db-password.txt lrwxrwxrwx 1 root root 22 Sep 15 02:31 db-username.txt -> ..data/db-username.txtファイルの内容が正しいことを確認します。
cat /etc/nginx/secrets/db-username.txt cat /etc/nginx/secrets/api-key.txt想定される出力:
admin ak-1234567890abcdef
出力は Secret の構成と一致しています。これは、アプリケーションが Secret をボリュームとしてマウントすることで Secret データにアクセスできることを示しています。
Kubectl での構成
nginx-volume-demo.yaml という名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-volume-demo namespace: default labels: app: nginx-volume spec: replicas: 2 selector: matchLabels: app: nginx-volume template: metadata: labels: app: nginx-volume spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 protocol: TCP # Secret ボリュームをマウント volumeMounts: - name: secret-volume mountPath: /etc/nginx/secrets readOnly: true volumes: - name: secret-volume secret: secretName: nginx-secret # ファイル権限を設定 defaultMode: 0644 # オプション:ファイル名のマッピングをカスタマイズ items: - key: username path: db-username.txt - key: password path: db-password.txt - key: api-key path: api-key.txtSecret を使用する Deployment を作成します。
kubectl apply -f nginx-volume-demo.yamlPod のステータスを確認します。
kubectl get pods -l app=nginx-volume -n default想定される出力:
NAME READY STATUS RESTARTS AGE nginx-volume-demo-7db46895bc-c98b5 1/1 Running 0 4h20m nginx-volume-demo-7db46895bc-pc6qg 1/1 Running 0 4h20mSecret ファイルがマウントされていることを確認します。
kubectl exec deployment/nginx-volume-demo -n default -- ls -la /etc/nginx/secrets想定される出力:
total 4 drwxrwxrwt 3 root root 140 Sep 15 02:31 . drwxr-xr-x 1 root root 4096 Sep 15 02:31 .. drwxr-xr-x 2 root root 100 Sep 15 02:31 ..2025_09_15_02_31_13.2599431463 lrwxrwxrwx 1 root root 32 Sep 15 02:31 ..data -> ..2025_09_15_02_31_13.2599431463 lrwxrwxrwx 1 root root 18 Sep 15 02:31 api-key.txt -> ..data/api-key.txt lrwxrwxrwx 1 root root 22 Sep 15 02:31 db-password.txt -> ..data/db-password.txt lrwxrwxrwx 1 root root 22 Sep 15 02:31 db-username.txt -> ..data/db-username.txtファイルの内容が正しいことを確認します。
kubectl exec deployment/nginx-volume-demo -n default -- cat /etc/nginx/secrets/db-username.txt kubectl exec deployment/nginx-volume-demo -n default -- cat /etc/nginx/secrets/api-key.txt想定される出力:
admin ak-1234567890abcdef出力は Secret の構成と一致しています。これは、アプリケーションが Secret をボリュームとしてマウントすることで Secret データにアクセスできることを示しています。
方法 2:環境変数としてインジェクト
この方法では、パスワード、API キー、トークンなどの機密データを環境変数として安全にインジェクトします。この方法は、構成をコードから分離し、アプリケーションのセキュリティと可搬性を向上させます。
コンソールでの構成
Deployment を作成します。
既存の Deployment がある場合は、 を選択し、次の手順で説明するように [コンテナー構成] セクションで環境変数を編集します。
Deployment を作成します。
[ステートレス] ページで、[イメージから作成] をクリックします。
[アプリケーションの基本情報] ページで、アプリケーションの基本情報を設定します。次に、[次へ] をクリックして [コンテナー構成] ページに移動します。
アプリケーション名:nginx-env-demo
名前空間:default
レプリカ数:2
タイプ:ステートレス (Deployment)
コンテナーを構成します。
[コンテナー構成] タブで、[イメージ名] と [ポート] を構成します。
イメージ名:
anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6コンテナーポート:80、プロトコル:TCP
重要このイメージをプルするには、クラスターがパブリックネットワークにアクセスできる必要があります。クラスターの作成時に[VPC の SNAT を設定] (デフォルトで有効) を選択した場合、追加の構成は不要です。そうでない場合は、「ACK クラスターのインターネットアクセスを有効にする」をご参照ください。
[コンテナー構成] タブの [環境変数] セクションで、[追加] をクリックします。
タイプ:Secret
名前:
USERNAME値/参照:ソースとして 作成した Secret (例:nginx-secret) を選択し、各キーに対応する環境変数名を指定します。
情報を構成した後、[次へ] をクリックします。
[詳細設定] ページで、必要に応じてスケーリング、スケジューリング、ラベル、アノテーションを構成します。その後、ページ下部の [作成] をクリックします。
[作成完了] ページで、アプリケーションタスクを表示します。
[アプリケーション作成タスクが送信されました] パネルで [アプリケーション詳細の表示] をクリックし、コンテナーのステータスが
Runningであることを確認します。
環境変数がインジェクトされていることを確認します。
ログインするコンテナー (例:nginx-env-demo-7xxxxxx****) を選択します。[操作] 列で [ターミナル] をクリックし、nginx を選択してコンテナーにログインします。
env | grep -E 'DB_|API_|NGINX_'想定される出力:
API_KEY=ak-1234567890abcdef NGINX_api-key=ak-1234567890abcdef NGINX_password=MySecurePassword! NGINX_username=admin DB_USERNAME=admin DB_PASSWORD=MySecurePassword!出力は Secret の構成と一致しています。これは、アプリケーションが Secret を環境変数としてインジェクトすることで Secret データにアクセスできることを示しています。
kubectl での構成
nginx-env-demo.yaml という名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-env-demo namespace: default labels: app: nginx-env spec: replicas: 2 selector: matchLabels: app: nginx-env template: metadata: labels: app: nginx-env spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 protocol: TCP # Secret から単一のキーと値のペアをインジェクト env: - name: DB_USERNAME valueFrom: secretKeyRef: name: nginx-secret key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: nginx-secret key: password - name: API_KEY valueFrom: secretKeyRef: name: nginx-secret key: api-key # オプション:プレフィックスを付けて Secret からすべてのキーと値のペアをインジェクト envFrom: - prefix: NGINX_ secretRef: name: nginx-secretSecret を使用する Deployment を作成します。
kubectl apply -f nginx-env-demo.yamlPod のステータスを確認します。
kubectl get pods -l app=nginx-env -n default想定される出力:
NAME READY STATUS RESTARTS AGE nginx-env-demo-6dc7556d9-6pjhj 1/1 Running 0 3h33m nginx-env-demo-6dc7556d9-rcqsh 1/1 Running 0 3h33m環境変数がインジェクトされていることを確認します。
kubectl exec deployment/nginx-env-demo -n default -- env | grep -E 'DB_|API_|NGINX_'想定される出力:
API_KEY=ak-1234567890abcdef NGINX_api-key=ak-1234567890abcdef NGINX_password=MySecurePassword! NGINX_username=admin DB_USERNAME=admin DB_PASSWORD=MySecurePassword!出力は Secret の構成と一致しています。これは、アプリケーションが Secret を環境変数としてインジェクトすることで Secret データにアクセスできることを示しています。
Secret の管理
Secret が作成された後、[Secret] ページで次の操作を実行できます。
操作 | 説明 |
Secret の表示 | 対象の Secret の名前をクリックして、その基本情報と詳細を表示します。 |
Secret の編集 | [操作] 列で [編集] をクリックして、Secret の情報を変更します。 重要 使用中の Secret を変更すると、サービス中断が発生する可能性があります。注意して進めてください。 |
Secret の削除 | [操作] 列で [削除] をクリックして、不要になった Secret を削除します。 重要 クラスター作成時に |
関連ドキュメント
異常な Pod のトラブルシューティング: 異常な Pod の診断プロセス、トラブルシューティング方法、一般的な問題、およびソリューションについて説明します。
ステートレスワークロード (Deployment) を作成する:コンソールと kubectl を使用して ACK クラスターにステートレスアプリケーションを作成する方法を説明します。
詳細については、Kubernetes 公式ドキュメントの「Secrets」をご参照ください。