一、Secrets 概述
在 Kubernetes 中,Secrets 是一种包含敏感信息的 API 对象,例如密码、OAuth 令牌、SSH 密钥等。通过使用 Secrets,您可以安全地管理这些敏感信息,避免将它们直接写入 Pod 定义或 Docker 镜像中。
Secrets 具有以下特点:
-
安全性:Secrets 以加密形式存储在 etcd 数据库中,只有授权的用户和系统组件才能访问。
-
灵活性:Secrets 可以被挂载为文件或注入为环境变量,以供 Pod 使用。
-
动态更新:Secrets 可以在不重启 Pod 的情况下更新,但需要重新创建 Pod 以应用新的 Secret。
二、Secrets 的类型
Kubernetes 支持多种类型的 Secrets,主要包括:
-
Opaque:通用类型,用于存储任意敏感数据。这是最常用的 Secrets 类型。
-
Service Account:自动创建,包含访问 Kubernetes API 的凭据。
-
kubernetes.io/dockerconfigjson:用于存储 Docker Registry 的认证信息。
三、Secrets 的创建方式
Secrets 可以通过命令行或 YAML 文件创建。
3.1 命令行创建
使用 kubectl create secret
命令创建 Secrets:
# 创建一个包含用户名和密码的 Opaque Secret
kubectl create secret generic db-secret \--from-literal=username=admin \--from-literal=password=secret# 创建一个包含 Docker Registry 认证信息的 Secret
kubectl create secret docker-registry reg-secret \--docker-server=<registry-server> \--docker-username=<username> \--docker-password=<password> \--docker-email=<email>
3.2 YAML 文件创建
创建一个 YAML 文件定义 Secrets,然后使用 kubectl apply
命令应用:
apiVersion: v1
kind: Secret
metadata:name: db-secret
type: Opaque
data:username: YWRtaW4= # base64 编码的 adminpassword: c2VjcmV0 # base64 编码的 secret
保存为 db-secret.yaml
,然后应用:
kubectl apply -f db-secret.yaml
四、Secrets 在 Pod 中的使用方式
使用 Secrets 作为环境变量、挂载为卷以及用于 Docker 私有仓库认证
实验步骤
步骤 1:创建 Secrets
首先,创建一个包含用户名和密码的 Secret。
使用 base64
命令进行编码加密
echo -n "admin" | base64
echo -n "secret" | base64
-
创建一个名为
db-secret.yaml
的文件,内容如下:
apiVersion: v1
kind: Secret
metadata:name: db-secret
type: Opaque
data:username: YWRtaW4= # base64 编码的 adminpassword: cGFzc3dvcmQ= # base64 编码的 secret
注释:
-
apiVersion: v1
:指定 Kubernetes API 的版本。 -
kind: Secret
:指定资源类型为 Secret。 -
metadata.name: db-secret
:定义 Secret 的名称。 -
type: Opaque
:指定 Secret 的类型为 Opaque。 -
data
:包含要存储的键值对,值需要经过 base64 编码。
-
应用 YAML 文件创建 Secret:
kubectl apply -f db-secret.yaml
-
验证 Secret 是否创建成功:
kubectl get secret db-secret
步骤 2:将 Secret 挂载为卷
-
创建一个名为
pod-with-secret-volume.yaml
的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:name: pod-with-secret-volume
spec:containers:- name: my-containerimage: busyboxcommand: ["sh", "-c", "cat /etc/secrets/username && cat /etc/secrets/password && sleep 3600"]volumeMounts:- name: secret-volumemountPath: /etc/secretsvolumes:- name: secret-volumesecret:secretName: db-secret
注释:
-
volumeMounts
:定义容器挂载的卷。 -
mountPath: /etc/secrets
:指定挂载路径。 -
volumes
:定义卷。 -
secret
:指定卷的类型为 Secret。 -
secretName: db-secret
:引用的 Secret 名称。
-
应用 YAML 文件创建 Pod:
kubectl apply -f pod-with-secret-volume.yaml
-
查看 Pod 的日志,验证文件挂载是否成功:
kubectl logs pod-with-secret-volume
预期输出:
admin
secret
步骤 3:将 Secret 注入为环境变量
-
创建一个名为
pod-with-secret-env.yaml
的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:name: pod-with-secret-env
spec:containers:- name: my-containerimage: busyboxcommand: ["sh", "-c", "env && sleep 3600"]env:- name: DB_USERNAMEvalueFrom:secretKeyRef:name: db-secretkey: username- name: DB_PASSWORDvalueFrom:secretKeyRef:name: db-secretkey: password
注释:
-
env
:定义环境变量列表。 -
name: DB_USERNAME
:定义环境变量名为DB_USERNAME
。 -
valueFrom.secretKeyRef
:从 Secret 中引用键值。 -
name: db-secret
:引用的 Secret 名称。 -
key: username
:Secret 中的键名。
-
应用 YAML 文件创建 Pod:
kubectl apply -f pod-with-secret-env.yaml
-
查看 Pod 的日志,验证环境变量是否注入成功:
kubectl logs pod-with-secret-env
预期输出:
DB_USERNAME=admin
DB_PASSWORD=secret
步骤 4:使用 Secret 进行 Docker 私有仓库认证
找到 config.json
文件后,将其内容进行 Base64 编码
ls ~/.docker/config.json
base64 ~/.docker/config.json
-
创建一个名为
reg-secret.yaml
的文件,内容如下:
apiVersion: v1
kind: Secret
metadata:name: reg-secret
type: kubernetes.io/dockerconfigjson
data:.dockerconfigjson: eyJ2YWx1ZSI6I... # base64 编码的 docker config json
注释:
-
type: kubernetes.io/dockerconfigjson
:指定 Secret 的类型为 Docker 配置。 -
.dockerconfigjson
:包含 Docker 配置的 base64 编码的 JSON 数据。
-
应用 YAML 文件创建 Secret:
kubectl apply -f reg-secret.yaml
-
创建一个使用私有仓库镜像的 Pod:
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: reg.admin.org/busybox/busybox:latestcommand: ["sh", "-c", "echo 'Hello from container'; sleep 3600"]imagePullSecrets:- name: reg-secret
注释:
-
imagePullSecrets
:定义用于拉取镜像的 Secret 列表。 -
name: reg-secret
:引用的 Secret 名称。
补充:为什么有时候容器会自动退出:
-
Kubernetes 会根据镜像的默认配置启动容器。对于
busybox
镜像,其默认行为是启动一个 Shell(通常是/bin/sh
)。因此,容器会启动一个 Shell,但如果没有其他命令或交互式操作,Shell 会立即退出,导致容器关闭。 -
通过在 YAML 文件中显式指定命令(如
sleep 3600
),可以防止容器立即退出
-
应用 YAML 文件创建 Pod:
kubectl apply -f pod-with-reg-secret.yaml
-
验证 Pod 是否成功拉取并运行:
kubectl get pods
预期输出:
NAME READY STATUS RESTARTS AGE
my-pod 1/1 Running 0 ...
步骤 5:更新和删除 Secrets
更新 Secrets
更新 Secrets 需要删除并重新创建,因为 Secrets 的数据是不可变的。
-
删除现有的 Secret:
kubectl delete secret db-secret
-
创建一个新的 Secret:
kubectl create secret generic db-secret \--from-literal=username=newadmin \--from-literal=password=newsecret
删除 Secrets
删除不再需要的 Secrets:
kubectl delete secret db-secret
实验总结
通过本实验,您学习了如何在 Kubernetes 中创建、使用和更新 Secrets。Secrets 是 Kubernetes 中管理敏感信息的重要机制,通过合理使用 Secrets,您可以提高集群的安全性,避免敏感信息泄露。