ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で使用できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了したら、これらの値をクラウド環境に固有の値に置き換えてください。
Oracle Cloud Native Environmentでのシークレットの使用
イントロダクション
多くのアプリケーションには、認可されたユーザーのみがアクセスする必要があるパスワードなどの情報があります。この状況では、Kubernetesシークレットが役立ちます。これにより、パスワード、SSH、APIキーなどの機密データを安全に管理できます。シークレットを使用すると、機密データをアプリケーションのコードから分離できるため、ポッドのワークフロー中に機密データが公開または変更されるリスクが軽減されます。
開始する前に、Kubernetesシークレットに関する基本的な詳細を知るのに役立ちます:
- Podで使用する前に存在している必要があります。
- KEYと VALUEのペアを使用して定義されます。
- kube-apiserverおよびkubeletメモリーをすべて使用しないように、最大サイズが1MBに制限されます。
- それらを不変として定義して、偶発的または不要な変更から保護します。
重要: Kubernetesシークレットは、Base64エンコードのみで、暗号化されていないetcdに格納されるため、デフォルトでは暗号化されません。したがって、etcdにアクセスできる人は誰でもシークレットを表示または変更できます。Kubernetesシークレットの使用を保護するには、次のいずれかの方法を使用します:
このチュートリアルでは、Kubernetesシークレットの基本を説明し、簡単なユースケースを示します。
Oracle Cloud Native Environment 2の詳細は、現在のリリース・ドキュメント・サイトを参照してください。
目的
このチュートリアルでは、次のことを学習します。
- シークレットを作成します
- シークレットの表示
- シークレットをデコード
- シークレットを使用したデプロイメントでの環境変数の定義
前提条件
- Oracle Cloud Native Environment(Oracle CNE)のインストール
- 1つの制御ノードと1つのワーカー・ノード
Oracle Cloud Native Environmentの構成
ノート:独自のテナンシで実行している場合は、演習環境をデプロイする前に、linux-virt-labs
GitHubプロジェクトREADME.mdを読み、前提条件を完了してください。
-
Lunaデスクトップでターミナルを開きます。
-
linux-virt-labs
GitHubプロジェクトをクローニングします。git clone https://github.com/oracle-devrel/linux-virt-labs.git
-
作業ディレクトリに変更します。
cd linux-virt-labs/ocne2
-
必要なコレクションをインストールします。
ansible-galaxy collection install -r requirements.yml
-
演習環境をデプロイします。
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クラスタへのアクセス
-
端末を開き、SSH経由でocneインスタンスに接続します。
ssh oracle@<ip_address_of_instance>
-
クラスタが安定し、すべてのポッドが実行中の状態でレポートされるまで待機します。
watch kubectl get pods -A
すべてのポッドに「実行中」のSTATUSが表示されたら、
ctrl-c
と入力してwatch
コマンドを終了します。 -
ノードの数を確認します。
kubectl get nodes
機密の作成
Kubernetesシークレットを作成するには、次の3つの方法があります:
- kubectlコマンドライン・ツールを使用して、コマンドラインから直接シークレットを管理します。
- kubectlコマンドライン・ツールをリソース構成ファイルとともに使用します。
kustomization.yaml
ファイルでのオブジェクト管理ツールのカスタマイズの使用。
コマンドラインからの直接Kubectlの使用
Kubectlは、次の2つの方法のいずれかでシークレットを作成します:
- コマンドラインで直接渡します。
- ファイルに資格証明として格納します。
-
コマンドラインから直接渡されるリテラル値を使用してシークレットを作成します。
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になります。
-
資格証明ファイルを作成します。
echo -n 'admin' > ./username.txt echo -n 'S!B\*d$zDsb=' > ./password.txt
-
保存されたファイルを使用してシークレットを作成します。
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の名前/値を宣言します。その他情報:
または、サブディレクトリに格納されている複数のファイルからシークレットを作成できます。
-
サブディレクトリを作成します。
mkdir secrets
-
資格証明ファイルを作成します。
echo -n 'user1' > ./secrets/username.txt echo -n 'my-super-secret-password' > ./secrets/password.txt
-
サブディレクトリ内の資格証明ファイルを使用してシークレットを作成します。
kubectl create secret generic my-secret --from-file=./secrets/
ノート:このメソッドは、各ファイル名をKEY値として使用し、ファイルの内容をVALUEとして使用します。
-
Kubectlを使用したYAML構成ファイルの適用
-
シークレット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でエンコードされる必要があります。
-
シークレットを適用します。
kubectl apply -f db-credentials.yaml
kustomization.yaml
ファイルでのKustomizeの使用
Kustomizeを使用してシークレットを作成するには、kustomization.yaml
ファイルが必要です。このファイルは、次のいずれかの方法を使用してsecretGenerator
を定義する必要があります。
- シークレットの data値とファイル名を格納するファイルは、KEY値になります。
- ファイル内の data値の暗号化されていないリテラルバージョン。
- 環境変数(
.env
)ファイル。
前述のすべては、Kustomizeの使用時にシークレット値をBase64エンコードする必要はありません。Kustomizeで使用されるYAMLファイルの名前には、kustomization.yaml
またはkustomization.yml
の必要があります。
この例では、リテラルを使用してシークレットを作成する方法を示しています。
-
secretGeneratorファイルを作成します。
cat << EOF | tee kustomization.yaml > /dev/null secretGenerator: - name: database-credentials literals: - username=admin - password=password EOF
-
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シークレットのリスト
-
新しく作成したシークレットをリストします。
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
-
新しく作成されたシークレットの詳細を取得します。
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
の内容を表示しません。 -
いずれかのシークレットに関する情報を表示します。
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シークレットのデコード
-
いずれかのシークレットの格納済データを表示します。
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でエンコードされます。
-
エンコードされたKey:Valueデータをデコードします。
echo <BASE64-VALUE-FOR-PASSWORD> | base64 --decode
出力例:
[oracle@ocne ~]$ echo bXktc3VwZXItc2VjcmV0LXBhc3Nvd3Jk | base64 --decode my-password[oracle@ocne ~]$
警告:これらのステップでは、シェル履歴にシークレット・データが記録される可能性があります。これを回避するには、次のステップに示すように、両方のステップを組み合せます。
-
エンコードされた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と宣言されている場合です。
-
シークレットを編集します。
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
-
Esc
キーを押してから:q!
キーを押して、保存せずにエディタを終了します。出力例:
[oracle@ocne ~]$ kubectl edit secrets my-literal-secret Edit cancelled, no changes made.
シークレットを削除
シークレットは、kubectl -n <NAMESPACE> delete
コマンドを使用して削除できます。
-
シークレットを削除します。
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シークレット・データを使用してデプロイメントを作成します。
-
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
-
デプロイメント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
-
デプロイメントを作成します。
kubectl -n default apply -f echo-deployment.yaml
-
デプロイを確認します。
kubectl get deployments
デプロイ中に、再問合せが必要になる場合があります。
出力例:
[oracle@ocne ~]$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE echo-deployment 1/1 1 1 4m
-
デプロイされたポッドの名前を取得します。
kubectl get pods
出力例:
[oracle@ocne ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE echo-deployment-59bff74847-9nnkq 1/1 Running 0 6m
ノート:ポッドの名前は異なります。
-
デプロイされたポッドがシークレットを使用していたことを確認します。
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
変数が存在することを確認します。 -
デプロイされたポッドに環境変数が存在することを確認します。
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トレーニング・ステーションを参照してください。
関連リンク
- Oracle Cloud Native Environmentドキュメンテーション
- Oracle Cloud Native Environmentトラック
- Oracle Linuxトレーニング・ステーション
その他の学習リソース
docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Use Secrets with Oracle Cloud Native Environment
G39904-01
Copyright ©2025, Oracle and/or its affiliates.