すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Secret を使用して認証情報を管理する

最終更新日:Oct 10, 2025

エンタープライズアプリケーションをデプロイするには、データベースのパスワードや API キーなどの機密データを管理する必要があります。この情報をコードにハードコーディングすると、深刻なセキュリティリスクが生じ、データ漏洩につながる可能性があります。Kubernetes Secret は、機密データをアプリケーションコードから分離するための暗号化されたストレージメカニズムを提供します。これにより、コードの漏洩によるセキュリティインシデントを防ぐことができます。

方法の選択

メソッド

機能

ユースケース

ボリュームとしてマウント (推奨)

ファイル権限によって、データを分離し、プロセス間の漏洩を防ぎます。Secret への変更は、マウントされたファイルに自動的に同期されます。

本番環境、特にデータベースのパスワードや API キーなど、詳細なファイル権限の制御が必要な機密性の高いデータに最適です。

環境変数として挿入

コンテナ内のすべてのプロセスから簡単にアクセスできますが、ログを介して意図せず漏洩するリスクが高まります。設定の更新を反映させるには、Pod を再起動する必要もあります。

ログレベルやサービスエンドポイントなど、単純な設定の挿入に適しています。また、環境変数を読み込むように設計されている既存アプリケーションにも利用できます。

Secret の作成

コンソール

  1. ACK コンソールにログインし、左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、変更するクラスターの名前をクリックし、左側のナビゲーションウィンドウで、[設定] > [Secret] を選択します。

  3. [Secret] ページで、デフォルトの [名前空間] を選択し、[作成] をクリックします。新しい Secret を以下のように設定します。

    • 名前: nginx-secret

    • タイプ: Opaque

      • Opaque: パスワードや証明書などの機密データを保存するために使用される Base64 でエンコードされた Secret。

      • プライベートリポジトリログオン Secret: プライベートイメージリポジトリの認証情報を保存します。

      • TLS 証明書: Transport Layer Security (TLS)/Secure Sockets Layer (SSL) 証明書と秘密鍵を保存します。

    • 次のキーと値のペアを追加します:

      • username: admin

      • password: MySecurePassword!

      • api-key: ak-1234567890abcdef

      プレーンテキストの値を入力する場合は、[Base64 でデータ値をエンコード] にチェックを入れます。

kubectl

  1. kubectl を使用してクラスターに接続します

  2. Secret を作成します。

    重要

    この例はデモンストレーションのみを目的としています。本番環境では、--from-literal を使用する代わりに、ファイルまたは他の安全なソースから Secret を作成してください。

    kubectl create secret generic nginx-secret \
      --from-literal=username=admin \
      --from-literal=password='MySecurePassword!' \
      --from-literal=api-key='ak-1234567890abcdef' \
      -n default
  3. Secret が作成されたことを確認します。

    kubectl get secret nginx-secret

    期待される出力:

    NAME           TYPE     DATA   AGE
    nginx-secret   Opaque   3      23h

Secret の使用

Deployment と Secret は、同じ名前空間に配置する必要があります。

方法 1: ボリュームとしてマウント

この方法では、Secret のデータをコンテナ内のファイルとして安全に利用します。

コンソール

  1. Deployment を作成します。

    1. [クラスター] ページで、管理対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [Deployment] を選択します。

    2. ステートレスワークロード (Deployment) を作成します。

      1. [Deployment] ページで、[イメージから作成] をクリックします。

      2. [基本情報] ステップで、次のパラメーターを設定し、[次へ] をクリックします:

        • 名前: nginx-volume-demo

        • 名前空間: default

        • レプリカ: 2

        • タイプ: Deployment

      3. コンテナを構成します。

        1. [コンテナ] ステップで、[イメージ名][ポート] を設定します:

          • イメージ名: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

          • コンテナポート: 80, プロトコル: TCP

          重要

          このイメージをプルするには、クラスターがインターネットにアクセスできる必要があります。クラスターの作成時に [VPC の SNAT を設定] (デフォルトで有効) を選択した場合、追加の操作は不要です。それ以外の場合は、「既存の ACK クラスターでインターネットアクセスを有効にする」をご参照ください。

        2. [ボリューム] セクションで、[ローカルストレージの追加] をクリックします。

          • PV タイプ: Secret

          • 名前: secret-volume

          • マウントソース: 事前に作成された Secret (例: nginx-secret) を選択します。

          • コンテナパス: コンテナ内のマウントパス (例: /etc/nginx/secrets) を指定します。

          次に、[次へ] をクリックします。

      4. [高度な設定] ステップで、必要に応じてアクセス制御、スケーリング、スケジューリング、ラベル、およびアノテーションを設定します。その後、ページ下部の [作成] をクリックします。

      5. [完了] ステップで、アプリケーションタスクを監視します。

        [作成タスク送信済み] セクションで、[詳細の表示] をクリックし、コンテナのステータスが Running であることを確認します。

  2. Secret のファイルがマウントされたことを確認します。

    対象 Pod (例: nginx-volume-demo-7xxxxxx****) を選択します。[操作] 列で [ターミナル] をクリックし、nginx コンテナを選択してターミナルセッションを開きます。

    1. 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
    2. ファイルの内容を確認します。

      cat /etc/nginx/secrets/db-username.txt
      cat /etc/nginx/secrets/api-key.txt

      期待される出力:

      admin
      ak-1234567890abcdef

    出力は Secret 内のデータと一致し、アプリケーションがそれにアクセスできることを確認します。

kubectl

  1. 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.txt
    
  2. Secret を使用する Deployment を作成します。

    kubectl apply -f nginx-volume-demo.yaml
  3. Pod のステータスを確認します。

    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          4h20m
  4. Secret のファイルがマウントされたことを確認します。

    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
  5. ファイルの内容を確認します。

    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 内のデータと一致し、アプリケーションがデータにアクセスできることを確認します。

方法 2: 環境変数として挿入

この方法では、Secret をコンテナ内の環境変数として公開します。

コンソール

  1. Deployment を作成します。

    1. [クラスター] ページで、管理対象のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ワークロード] > [Deployment] を選択します。

    2. デプロイメントを作成します。

      1. [Deployment] ページで、[イメージから作成] をクリックします。

      2. [基本情報] ステップで、以下のパラメーターを設定し、[次へ] をクリックします:

        • 名前: nginx-env-demo

        • 名前空間: default

        • レプリカ: 2

        • タイプ: Deployment

      3. コンテナを設定します。

        1. [コンテナ] ステップで、[イメージ名][ポート] を設定します:

          • イメージ名: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

          • コンテナポート: 80, プロトコル: TCP

          重要

          このイメージをプルするには、クラスターがインターネットにアクセスできる必要があります。クラスター作成時に [VPC の SNAT を設定] (デフォルトで有効) を選択した場合、追加の操作は不要です。それ以外の場合は、「既存の ACK クラスターでインターネットアクセスを有効にする」をご参照ください。

        2. [環境] セクションで、[追加] をクリックします。

          • タイプ: Secrets

          • 変数キー: USERNAME

          • 値/ValueFrom: 事前に作成された Secret (例: nginx-secret) からソースを選択します。次に、各キーの環境変数名を指定します。

          その後、[次へ] をクリックします。

      4. [高等な設定] ステップで、必要に応じてアクセスの制御、スケーリング、スケジューリング、ラベル、およびアノテーションを設定します。次に、ページの下部にある [作成] をクリックします。

      5. [完了] ステップで、アプリケーションタスクを監視します。

        [作成タスク送信済み] セクションで、[詳細の表示] をクリックし、コンテナのステータスが Running であることを確認します。

  2. 環境変数が挿入されたことを確認します。

    対象 Pod (例: 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 内のデータと一致し、アプリケーションが環境変数経由でデータにアクセスできることを確認します。

kubectl

  1. 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-secret
    
  2. Secret を使用する Deployment を作成します。

    kubectl apply -f nginx-env-demo.yaml
  3. Pod のステータスを確認します。

    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
  4. 環境変数が挿入されたことを確認します。

    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 を削除します。

重要

kube-system および kube-public 名前空間でシステムによって生成された Secret (サービスアカウント に関連するものなど) は削除しないでください。

関連ドキュメント

  • Pod の一般的な問題の診断とトラブルシューティング方法については、「Pod の異常に関するトラブルシューティング」をご参照ください。

  • コンソールと kubectl を使用して ACK クラスターでステートレスアプリケーションを作成する方法については、「Deployment の作成」をご参照ください。

  • Secret の詳細については、Kubernetes の公式ドキュメントをご参照ください。