附註:
- 本教學課程適用於 Oracle 提供的免費實驗室環境。
- 其使用 Oracle Cloud Infrastructure 證明資料、租用戶以及區間的範例值。完成實驗室時,請將這些值替代為雲端環境特定的值。
使用 Oracle Cloud Native Environment 的加密密碼
簡介
許多應用程式都有一個只有獲得授權的使用者才應該存取的資訊,例如密碼。在這種情況下,Kubernetes 加密密碼可以提供協助。它們提供安全管理機密資料 (例如密碼、SSH 以及 API 金鑰) 的方式。使用加密密碼可將機密資料與應用程式的程式碼分開,以降低在 Pod 工作流程期間公開或修改機密資料的風險。
開始之前,它有助於瞭解一些關於 Kubernetes 加密密碼的基本詳細資訊:
- Pod 使用之前,必須先存在它們。
- 使用 KEY 與 VALUE 組定義。
- 限制大小上限為 1MB,以避免使用所有 kube-apiserver 和 kubelet 記憶體。
- 將它們定義為不可變,以防止意外或不必要的修改。
重要事項: Kubernetes 加密密碼預設不會加密,因為這些加密密碼只有 Base64 編碼且會以未加密方式儲存在 etcd 中。因此,任何具備 etcd 存取權的人都可以檢視或更改加密密碼。使用 Kubernetes 加密密碼可以使用下列任何一種方法,確保安全:
本教學課程涵蓋 Kubernetes 加密密碼的基本知識,並示範簡單的使用案例。
如需有關 Oracle Cloud Native Environment 2 的詳細資訊,請參閱目前的版本文件網站。
目標
在本教學課程中,您將學習到:
- 建立密碼
- 檢視加密密碼
- 解碼加密密碼
- 使用加密密碼定義部署中的環境變數
必要條件
- Oracle Cloud Native Environment (Oracle CNE) 的安裝
- 單一控制節點與一個工作節點
設定 Oracle Cloud Native Environment
注意:如果是在您自己的租用戶中執行,請先閱讀 linux-virt-labs
GitHub 專案 README.md 並完成先決條件,再部署實驗環境環境。
-
在 Luna Desktop 上開啟終端機。
-
複製
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'"
自由實驗環境環境需要額外的變數
local_python_interpreter
,此變數會設定在 localhost 上執行的播放ansible_python_interpreter
。由於環境會安裝 Oracle Cloud Infrastructure SDK for Python 的 RPM 套件 (位於 python3.6 模組底下),因此需要此變數。預設部署資源配置使用 AMD CPU 和 Oracle Linux 8。若要使用 Intel CPU 或 Oracle Linux 9,請在部署命令中新增
-e instance_shape="VM.Standard3.Flex"
或-e os_version="9"
。重要事項: 請等待播放手冊順利執行,然後到達暫停工作。在手冊的這個階段,已完成 Oracle CNE 的安裝,且執行處理已就緒。記下先前的播放,此播放會列印其部署節點的公用和專用 IP 位址,以及執行實驗室時所需的任何其他部署資訊。
存取 Kubernetes 叢集
-
開啟終端機,並透過 SSH 連線至 ocne 執行處理。
ssh oracle@<ip_address_of_instance>
-
等待叢集穩定,以及讓所有 Pod 報告處於執行中狀態。
watch kubectl get pods -A
一旦所有 Pod 顯示 執行中的 STATUS ,請輸入
ctrl-c
以結束watch
指令。 -
確認有多少節點存在。
kubectl get nodes
建立加密貨幣
建立 Kubernetes 加密密碼的方法有三種,分別是:
- 使用 kubectl 命令行工具直接從命令行管理加密密碼。
- 使用 kubectl 命令行工具搭配資源組態檔。
- 將自訂物件管理工具與
kustomization.yaml
檔案搭配使用。
直接從命令列使用 Kubectl
Kubectl 以下列兩種方式之一建立加密密碼:
- 直接透過命令行傳送。
- 將它們儲存為檔案中的證明資料。
-
使用直接從命令行傳送的文字值建立加密密碼。
kubectl create secret generic my-literal-secret --from-literal=username=my-user --from-literal=password=my-password
注意:請使用單引號
''
來遁離字串值中包含的特殊字元,例如$
、\
、$
、&
、=
以及!
。否則,命令 shell 會解譯它們 。輸出範例:
[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
使用 Kustomize 搭配 kustomization.yaml
檔案
使用自訂建立加密密碼時,需要 kustomization.yaml
檔案。該檔案應該使用下列其中一種方法來定義 secretGenerator
:
- 儲存加密密碼 data 值的檔案,檔案名稱會變成 KEY 值。
- 檔案中 data 值的未加密文字版本。
- 環境變數 (
.env
) 檔案。
使用 Kustomize 時,上述所有密碼值都不需要 Base64 編碼。自訂所使用的 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 ~]$
輸出會顯示加密密碼資料的編碼 Key:Value 組。值資料為 base64 編碼。
-
解碼編碼的 Key:Value 資料。
echo <BASE64-VALUE-FOR-PASSWORD> | base64 --decode
輸出範例:
[oracle@ocne ~]$ echo bXktc3VwZXItc2VjcmV0LXBhc3Nvd3Jk | base64 --decode my-password[oracle@ocne ~]$
警告: 這些步驟可能導致 Shell 歷史記錄中的加密密碼資料記錄。請合併兩個步驟以避免發生此情況,如下一個步驟所示。
-
更安全的方式來解碼編碼的 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
-
取得已部署 Pod 的名稱。
kubectl get pods
輸出範例:
[oracle@ocne ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE echo-deployment-59bff74847-9nnkq 1/1 Running 0 6m
注意:您的 Pod 名稱將會不同。
-
檢查部署的 Pod 是否使用加密密碼。
kubectl -n default describe pod <POD-NAME>
其中:
<POD-NAME>
- 您部署中的 Pod 名稱。
輸出範例:
[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
變數是否存在。 -
確認部署的 Pod 中有環境變數。
kubectl exec -it <POD-NAME> -- printenv USER PASSWORD
其中:
<POD-NAME>
- 您部署中的 Pod 名稱。
輸出範例:
[oracle@ocne ~]$ kubectl exec -it echo-deployment-59bff74847-9nnkq -- printenv USER PASSWORD my-user my-password
輸出會確認您已順利使用 Kubernetes 加密密碼作為已部署 Pod 中的環境變數。
接下來的步驟
本教學課程示範如何建立及使用 Kubernetes 加密密碼,以限制未授權的機密資訊存取。不過,這只是開頭。查看 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
G39908-01
Copyright ©2025, Oracle and/or its affiliates.