ノート:

Oracle Cloud Native Environmentでのシークレットの使用

イントロダクション

多くのアプリケーションには、認可されたユーザーのみがアクセスする必要があるパスワードなどの情報があります。この状況では、Kubernetesシークレットが役立ちます。これにより、パスワード、SSH、APIキーなどの機密データを安全に管理できます。シークレットを使用すると、機密データをアプリケーションのコードから分離できるため、ポッドのワークフロー中に機密データが公開または変更されるリスクが軽減されます。

開始する前に、Kubernetesシークレットに関する基本的な詳細を知るのに役立ちます:

重要: Kubernetesシークレットは、Base64エンコードのみで、暗号化されていないetcdに格納されるため、デフォルトでは暗号化されません。したがって、etcdにアクセスできる人は誰でもシークレットを表示または変更できます。Kubernetesシークレットの使用を保護するには、次のいずれかの方法を使用します:

このチュートリアルでは、Kubernetesシークレットの基本を説明し、簡単なユースケースを示します。

Oracle Cloud Native Environment 2の詳細は、現在のリリース・ドキュメント・サイトを参照してください。

目的

このチュートリアルでは、次のことを学習します。

前提条件

Oracle Cloud Native Environmentの構成

ノート:独自のテナンシで実行している場合は、演習環境をデプロイする前に、linux-virt-labs GitHubプロジェクトREADME.mdを読み、前提条件を完了してください。

  1. Lunaデスクトップでターミナルを開きます。

  2. linux-virt-labs GitHubプロジェクトをクローニングします。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 作業ディレクトリに変更します。

    cd linux-virt-labs/ocne2
    
  4. 必要なコレクションをインストールします。

    ansible-galaxy collection install -r requirements.yml
    
  5. 演習環境をデプロイします。

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e install_ocne_rpm=true -e create_ocne_cluster=true -e "ocne_cluster_node_options='-n 1 -w 1'"
    

    無料の演習環境には、ローカル・ホストで実行される再生のansible_python_interpreterを設定する追加の変数local_python_interpreterが必要です。この変数は、python3.6モジュールの下にあるOracle Cloud Infrastructure SDK for PythonのRPMパッケージが環境によってインストールされるため必要です。

    デフォルトのデプロイメント・シェイプでは、AMD CPUおよびOracle Linux 8が使用されます。Intel CPUまたはOracle Linux 9を使用するには、デプロイメント・コマンドに-e instance_shape="VM.Standard3.Flex"または-e os_version="9"を追加します。

    重要:プレイブックが正常に実行されるまで待機し、一時停止タスクに到達します。プレイブックのこの段階では、Oracle CNEのインストールが完了し、インスタンスの準備ができました。前回の再生をノートにとります。この再生では、デプロイするノードのパブリックIPアドレスとプライベートIPアドレス、および演習の実行中に必要なその他のデプロイメント情報が出力されます。

Kubernetesクラスタへのアクセス

  1. 端末を開き、SSH経由でocneインスタンスに接続します。

    ssh oracle@<ip_address_of_instance>
    
  2. クラスタが安定し、すべてのポッドが実行中の状態でレポートされるまで待機します。

    watch kubectl get pods -A
    

    すべてのポッドに「実行中」STATUSが表示されたら、ctrl-cと入力してwatchコマンドを終了します。

  3. ノードの数を確認します。

    kubectl get nodes
    

機密の作成

Kubernetesシークレットを作成するには、次の3つの方法があります:

コマンドラインからの直接Kubectlの使用

Kubectlは、次の2つの方法のいずれかでシークレットを作成します:

  1. コマンドラインから直接渡されるリテラル値を使用してシークレットを作成します。

    kubectl create secret generic my-literal-secret --from-literal=username=my-user --from-literal=password=my-password
    

    ノート:文字列値に含まれる$\$&=!などの特殊文字をエスケープするには、一重引用符''を使用します。それ以外の場合は、コマンド・シェルによって解釈されます。

    出力例:

    [oracle@ocne ~]$ kubectl create secret generic my-literal-secret --from-literal=username=my-user --from-literal=password=my-password
    secret/my-literal-secret created
    

格納された資格証明ファイルでのKubectlの使用

ファイルの内容が VALUEになり、ファイル名が KEYになります。

  1. 資格証明ファイルを作成します。

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    
  2. 保存されたファイルを使用してシークレットを作成します。

    kubectl create secret generic my-file-secret \
     --from-file=username=./username.txt \
     --from-file=password=./password.txt
    

    ノート:デフォルトの動作では、ファイル名がKEY値として使用され、デフォルトの動作をオーバーライドする方法を示し、--from-file=[key]=[path to file]メソッドを使用してコマンドラインから直接KEYの名前/値を宣言します。

    その他情報:

    または、サブディレクトリに格納されている複数のファイルからシークレットを作成できます。

    1. サブディレクトリを作成します。

      mkdir secrets
      
    2. 資格証明ファイルを作成します。

      echo -n 'user1' > ./secrets/username.txt
      echo -n 'my-super-secret-password' > ./secrets/password.txt
      
    3. サブディレクトリ内の資格証明ファイルを使用してシークレットを作成します。

      kubectl create secret generic my-secret --from-file=./secrets/
      

      ノート:このメソッドは、各ファイル名をKEY値として使用し、ファイルの内容をVALUEとして使用します。

Kubectlを使用したYAML構成ファイルの適用

  1. シークレットYAML定義ファイルを作成します。

    cat << EOF | tee db-credentials.yaml > /dev/null
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-credentials
      # immutable: true
    type: Opaque
    data:
      username: "bXktdXNlcg=="
      password: "bXktcGFzc3dvcmQ="
    EOF
    

    ノート: YAMLファイルのシークレット値は、BASE64でエンコードされる必要があります

  2. シークレットを適用します。

    kubectl apply -f db-credentials.yaml
    

kustomization.yamlファイルでのKustomizeの使用

Kustomizeを使用してシークレットを作成するには、kustomization.yamlファイルが必要です。このファイルは、次のいずれかの方法を使用してsecretGeneratorを定義する必要があります。

前述のすべては、Kustomizeの使用時にシークレット値をBase64エンコードする必要はありません。Kustomizeで使用されるYAMLファイルの名前には、kustomization.yamlまたはkustomization.yml必要があります

この例では、リテラルを使用してシークレットを作成する方法を示しています。

  1. secretGeneratorファイルを作成します。

    cat << EOF | tee kustomization.yaml > /dev/null
    secretGenerator:
    - name: database-credentials
      literals:
      - username=admin
      - password=password
    EOF
    
  2. Kustomizeで秘密を作る。

    kubectl -n default apply -k .
    

    出力例:

    [oracle@ocne ~]$ kubectl -n default apply -k .
    secret/database-credentials-fd8288cb7g created
    

Kubernetesシークレットの管理

Kubernetesシークレットは、様々なネームスペースに格納できます。したがって、-nオプションを使用して特定のネームスペースからシークレットを取得するか、--all-namespacesまたは-Aを使用してすべてのネームスペースからシークレットを取得する必要があります。ネームスペースを指定しない場合、kubectlコマンドはdefaultネームスペースを使用します。Kubernetesシークレットを作成する場合も同じ動作が適用されます。

既存のKubernetesシークレットのリスト

  1. 新しく作成したシークレットをリストします。

    kubectl get secrets
    

    出力例:

    NAME                              TYPE     DATA   AGE
    database-credentials-fd8288cb7g   Opaque   2      34s
    db-credentials                    Opaque   2      2m16s
    my-file-secret                    Opaque   2      2m40s
    my-literal-secret                 Opaque   2      2m51s
    
  2. 新しく作成されたシークレットの詳細を取得します。

    kubectl describe secrets
    

    出力例:

    [oracle@ocne ~]$ kubectl describe secrets
    Name:         database-credentials-fd8288cb7g
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  8 bytes
    username:  5 bytes
    
    
    Name:         db-credentials
    Namespace:    default
    ...
    ...
    
    Name:         my-literal-secret
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    username:  7 bytes
    password:  11 bytes
    

    kubectl getおよびkubectl describeコマンドは、誤ってログ・ファイルを表示したり、ログ・ファイルに含めることを防ぐために、secretの内容を表示しません。

  3. いずれかのシークレットに関する情報を表示します。

    kubectl -n default describe secret db-credentials
    

    出力例:

    [oracle@ocne ~]$ kubectl -n default describe secret db-credentials
    Name:         db-credentials
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  11 bytes
    username:  7 bytes
    

Kubernetesシークレットのデコード

  1. いずれかのシークレットの格納済データを表示します。

    kubectl -n default get secret db-credentials -o jsonpath='{.data}'
    

    出力例:

    [oracle@ocne ~]$ kubectl -n default get secret db-credentials -o jsonpath='{.data}'
    {"password":"bXktcGFzc3dvcmQ=","username":"bXktdXNlcg=="}[oracle@ocne ~]$ 
    

    出力には、シークレット・データのエンコードされたキー: 値のペアが表示されます。値データはbase64でエンコードされます。

  2. エンコードされたKey:Valueデータをデコードします。

    echo <BASE64-VALUE-FOR-PASSWORD> | base64 --decode
    

    出力例:

    [oracle@ocne ~]$ echo bXktc3VwZXItc2VjcmV0LXBhc3Nvd3Jk | base64 --decode
    my-password[oracle@ocne ~]$ 
    

    警告:これらのステップでは、シェル履歴にシークレット・データが記録される可能性があります。これを回避するには、次のステップに示すように、両方のステップを組み合せます。

  3. エンコードされたKey:Valueデータをデコードするよりセキュアな方法。

    kubectl -n default get secret db-credentials -o jsonpath='{.data.password}' | base64 --decode
    

    出力例:

    [oracle@ocne ~]$ kubectl -n default get secret db-credentials -o jsonpath='{.data.password}' | base64 --decode
    my-password[oracle@ocne ~]$ 
    

シークレットの編集

多くのKubernetesオブジェクトと同様に、Kubernetesシークレットを編集できます。唯一の例外は、シークレットが immutableと宣言されている場合です。

  1. シークレットを編集します。

    kubectl edit secrets my-literal-secret
    

    デフォルト・エディタ(デフォルトではvi)が開き、data:フィールドのBase64エンコードされたシークレット値を更新できます。

    出力例:

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
      password: bXktcGFzc3dvcmQ=
      username: bXktdXNlcg==
    kind: Secret
    metadata:
      creationTimestamp: "2025-05-09T10:56:14Z"
      name: my-literal-secret
      namespace: default
      resourceVersion: "1689"
      uid: 394dfda3-025a-417d-bbfe-c4851a6b6cff
    type: Opaque
    ~                                                                                                                                       
    ~                                                                                                                                             
    ~                                                                                                                                       
    ~                                                                                                                                             
    "/tmp/kubectl-edit-1267071353.yaml" 16L, 480C
    
  2. Escキーを押してから:q!キーを押して、保存せずにエディタを終了します。

    出力例:

    [oracle@ocne ~]$ kubectl edit secrets my-literal-secret
    Edit cancelled, no changes made.
    

シークレットを削除

シークレットは、kubectl -n <NAMESPACE> deleteコマンドを使用して削除できます。

  1. シークレットを削除します。

    kubectl -n default delete secret my-file-secret my-literal-secret
    

    出力例:

    [oracle@ocne ~]$ kubectl -n default delete secret my-file-secret  my-literal-secret
    secret "my-file-secret" deleted
    secret "my-literal-secret" deleted
    

    ノート:複数のシークレットをスペース区切りで削除できます。

デプロイメントでのシークレットの使用

次に、作成したKubernetesシークレット・データを使用してデプロイメントを作成します。

  1. defaultネームスペース内のすべてのシークレットを一覧表示します。

    kubectl get secrets -n default
    

    出力例:

    [oracle@ocne ~]$ kubectl get secrets -n default
    NAME                              TYPE     DATA   AGE
    database-credentials-fd8288cb7g   Opaque   2      10m
    db-credentials                    Opaque   2      8m
    
  2. デプロイメントYAMLファイルを作成します。

    cat << EOF | tee echo-deployment.yaml > /dev/null
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echo
            image: ghcr.io/oracle/oraclelinux:9
            command: ["/bin/bash", "-c"]
            args: ["echo 'Username: $USER' 'Password: $PASSWORD'; sleep infinity"]
            env:
            - name: USER
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: username
            - name: PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: password
          restartPolicy: Always
    EOF
    
  3. デプロイメントを作成します。

    kubectl -n default apply -f echo-deployment.yaml
    
  4. デプロイを確認します。

    kubectl get deployments
    

    デプロイ中に、再問合せが必要になる場合があります。

    出力例:

    [oracle@ocne ~]$ kubectl get deployments 
    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    echo-deployment   1/1     1            1           4m
    
  5. デプロイされたポッドの名前を取得します。

    kubectl get pods
    

    出力例:

    [oracle@ocne ~]$ kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    echo-deployment-59bff74847-9nnkq   1/1     Running   0          6m
    

    ノート:ポッドの名前は異なります。

  6. デプロイされたポッドがシークレットを使用していたことを確認します。

    kubectl -n default describe pod <POD-NAME>
    

    説明:

    • <POD-NAME> - デプロイメント内のポッド名。

    出力例:

    [oracle@ocne ~]$ kubectl -n default describe pod echo-deployment-59bff74847-9nnkq
    Name:             echo-deployment-59bff74847-9nnkq
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             ocne-worker-1/192.168.122.77
    Start Time:       Mon, 12 May 2025 13:42:25 +0000
    ...
    ...
        Ready:          True
        Restart Count:  0
        Environment:
          USER:      <set to the key 'username' in secret 'db-credentials'>  Optional: false
          PASSWORD:  <set to the key 'password' in secret 'db-credentials'>  Optional: false
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5fp4d (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   True 
      Initialized                 True
    ...
    ..
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:                      <none>
    [oracle@ocne ~]$ 
    

    ノート: Environment:セクションで、$USER変数および$PASSWORD変数が存在することを確認します。

  7. デプロイされたポッドに環境変数が存在することを確認します。

    kubectl exec -it <POD-NAME> -- printenv USER PASSWORD
    

    説明:

    • <POD-NAME> - デプロイメント内のポッド名。

    出力例:

    [oracle@ocne ~]$ kubectl exec -it echo-deployment-59bff74847-9nnkq -- printenv USER PASSWORD
    my-user
    my-password
    

    出力によって、デプロイされたポッドの環境変数としてKubernetesシークレットを正常に使用したことが確認されます。

次の手順

このチュートリアルでは、Kubernetesシークレットを作成して使用し、機密情報への不正アクセスを制限する方法を示します。しかし、これは始まりに過ぎません。追加のチュートリアルおよびコンテンツについては、Oracle Linuxトレーニング・ステーションを参照してください。

その他の学習リソース

docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。