Kubernetes for Beginners — Part 09

Kubernetes Secrets

Moris
Linux & Backend Notes
7 min readFeb 29, 2024

--

Photo by Life Of Pix from Pexels

當我們開發應用程式時,我們會保護我們的密碼和其他敏感數據,例如用戶名、密鑰等。安全性是我們在開發企業應用時需要考慮的主要因素之一。大多數時候,開發人員會對它們進行編碼並保存。在上一篇文章中,我們討論了如何將變數移動到ConfigMap並存儲它們。但問題是,這些值是以純文本模式存儲的。這絕對不是存儲密碼的最佳方法。

因此,Kubernetes的秘密就出現了。秘密被用來存儲敏感數據。它們就像ConfigMaps一樣,但在秘密中,數據是以編碼或雜湊格式存儲的。

可以使用兩種簡單的方法創建並使用秘密。首先,創建一個秘密,然後將它們注入到您想在Kubernetes中使用它的地方。

Step 01: Creating secrets

有兩種創建secret的方法。

Method 01

使用kubectl命令。

kubectl create secret generic

在使用命令創建secret時,指定命令行中的key-value對。

kubectl create secret generic \
<secrete_name> --from-literal=<KEY>=<VALUE>

例如:

kubectl create secret generic \
my-secret --from-literal=USERNAME=admin

在這裡,我們創建了一個名為my-secret的秘密,值為USERNAME=admin。如果您只有一兩個秘密,這種方法就可以了。但是,如果您需要添加多於一個的秘密,那麼這種方法將會非常混亂。因此,我們用命令選項--from-file傳遞一個帶有鍵值對的文件。

kubectl create secret generic \
<secrete_name> --from-file=<PATH_TO_FILE>

例如:

首先,創建一個名為secrets.properties的文件,並添加key-value對。

USERNAME: admin
PASSWORD: admin123

然後執行命令。

kubectl create secret generic \
my-secret --from-file=secrets.properties

Here again, we created a secret named my-secret with two values, USERNAME=admin and PASSWORD=admin123.

在這裡,我們再次創建了一個名為my-secret的secret,有兩個值,USERNAME=adminPASSWORD=admin123

Method 02

使用與ConfigMaps相同的文件。創建一個文件,命名為secrets.yaml。在data部分下添加鍵值對。

apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
USERNAME: admin
PASSWORD: admin123

正如我之前提到的,秘密是用來以編碼格式存儲密碼和敏感數據的。但在這裡,如您所見,我們以純文本格式添加了值。這並不是一種很好的方法。所以,當我們使用這種方法時,我們必須以編碼格式定義值。

apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
USERNAME: YWRtaW4=
PASSWORD: YWRtaW4xMjM=

然後執行命令。

kubectl apply -f secrets.yaml

您可以使用命令輕鬆編碼秘密echo -n "VALUE" | base64

要解碼,使用命令echo -n "VALUE" | base64 --decode.

Step 02: Inject secrets

現在我們已創建了secret,將看到如何將secret注入到Pod中。讓我們拿我們在Kubernetes Pods文章中創建的Pod定義為例。

要添加Kubernetes secret,添加一個名為envFrom的新屬性。這個屬性是一個列表。所以我們可以傳遞許多環境變量。列表中的每個項目對應一個secret項目。指定我們之前創建的secret的名稱以導入secret。

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: myapp
spec:
containers:
- name: nginx-container
image: nginx
envFrom:
- secretRef:
name: my-secret

This is only one method to inject variables. You can inject secrets as a single environmental variable

這只是注入variable的一種方法。您可以將secret注入為一個單一的environmental variable

env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: USERNAME

or inject all secrets in a file as a volume.

或將所有secret以文件的形式作為volume注入。

volumes:
- name: my-secret-volume
secret:
secretName: my-secret

如果您將secret作為volume注入,則secret中的每個屬性都將創建為一個文件,其內容為secret的值。由於我們有兩個屬性,所以將創建兩個文件。如果您查看文件,您將看到key的值在文件的內容中。

Additionally

  • 要查看secrets kubectl get secrets
  • 要描述secrets kubectl describe secret <secret_name>
  • 要以YAML格式描述secretskubectl get secret <secret_name> -o yaml

Finally, this is all about secrets. In a nutshell, we discussed why secrets are important, how to create secrets and how to inject secrets into the pods. Leave your feedback. See you again with an interesting topic. Best of luck!!

最後,這就是關於secret的全部內容。總的來說,我們討論了為什麼secret很重要,如何創建secret以及如何將secret注入到Pod中。

--

--

Moris
Linux & Backend Notes

An AI engineer who loves deep learning technology and is willing to share resources and learn new technologies