Kubernetes Secret
Secret 是 Kubernetes 中用于存储敏感信息的资源,例如密码、API 密钥和 SSH 密钥。Secret 可以被 Pod 和其他 Kubernetes 资源使用,而无需将敏感信息暴露在配置文件或环境变量中。
1. Secret 类型
Kubernetes 支持多种类型的 Secret,包括:
-
Opaque Secret: 用于存储任意类型的数据,例如密码和 API 密钥。
-
DockerConfig Secret: 用于存储 Docker 镜像仓库的认证信息。
-
TLS Secret: 用于存储 TLS 证书和密钥。
-
SSH Secret: 用于存储 SSH 密钥。
2. Secret 用途
Secret 可用于以下场景:
-
存储数据库密码
-
存储 API 密钥
-
存储 SSH 密钥
-
存储 TLS 证书和密钥
-
存储任何其他敏感信息
3. Secret 类型选择
选择合适的 Secret 类型取决于您要存储的数据类型。
-
如果您要存储任意类型的数据,请使用 Opaque Secret。
-
如果您要存储 Docker 镜像仓库的认证信息,请使用 DockerConfig Secret。
-
如果您要存储 TLS 证书和密钥,请使用 TLS Secret。
-
如果您要存储 SSH 密钥,请使用 SSH Secret。
4. 创建 Secret
您可以使用 kubectl 命令行工具或 Kubernetes API 创建 Secret。
示例:创建 Opaque Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
username: my-username
password: my-password
-
创建 DockerConfig Secret:
apiVersion: v1
kind: Secret
metadata:
name: my-dockerconfig-secret
data:
.dockercfg: $(echo -n "{\"auths\":{\"https://index.docker.io/v1/\":{\"username\":\"my-username\",\"password\":\"my-password\"}}}") | base64 -w 0
-
创建 TLS Secret:
apiVersion: v1
kind: Secret
metadata:
name: my-tls-secret
data:
tls.crt: $(cat my-tls.crt | base64 -w 0)
tls.key: $(cat my-tls.key | base64 -w 0)
-
创建 SSH Secret:
apiVersion: v1
kind: Secret
metadata:
name: my-ssh-secret
data:
ssh-privatekey: $(cat my-ssh-privatekey | base64 -w 0)
5. 使用 Secret
您可以使用以下两种方式将 Secret 注入到 Pod 中:
-
环境变量: 使用
envFrom
字段将 Secret 数据注入到 Pod 的环境变量中。 -
Volume: 将 Secret 挂载到 Pod 的 Volume 中。
-
YAML文件
示例:使用环境变量注入 Secret
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
envFrom:
- secretRef:
name: my-secret
创建 Pod
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
envFrom:
- secretRef:
name: my-secret
查看 Pod 环境变量
kubectl exec -it my-pod -- env | grep -i username
输出结果
username=my-username
示例:使用 Volume 注入 Secret
创建 Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
username: my-username
password: my-password
创建 Pod
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
volumeMounts:
- name: my-secret
mountPath: /etc/secret
volumes:
- name: my-secret
secret:
secretName: my-secret
查看 Pod 中的文件
kubectl exec -it my-pod -- cat /etc/secret/username
输出:
my-username
6.管理 Secret
查看 Secret
kubectl get secret
编辑 Secret
-
编辑 Secret YAML 文件。
-
使用 kubectl 命令应用 YAML 文件
kubectl apply -f my-secret.yaml
删除 Secret
kubectl delete secret my-secret
7.示例:使用 OpenSSL 加密 Secret 数据
安装 OpenSSL
-
查看系统是否已安装 OpenSSL
openssl version -a
-
下载 OpenSSL 源码
从 OpenSSL 官方网站: https://www.openssl.org/source/ 下载最新版本的 OpenSSL 源码。
-
解压 OpenSSL 源码
tar -xzf openssl-*.tar.gz
-
编译和安装 OpenSSL
cd openssl-*
./config
make
make install
-
配置环境变量
-
在
/etc/ld.so.conf
文件的末尾添加以下内容:
-
/usr/local/ssl/lib
-
-
运行以下命令更新环境变量:
-
ldconfig
-
验证 OpenSSL 安装
openssl version -a
输出
OpenSSL 3.0.13 7 MAR 2024
生成加密密钥
openssl genrsa -out my-secret.key 2048
加密 Secret 数据
openssl aes-256-cbc -in my-secret.yaml -out my-secret.yaml.enc -kfile my-secret.key
创建 Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
secret-data: $(cat my-secret.yaml.enc | base64 -w 0)
使用环境变量注入 Secret 并解密
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
envFrom:
- secretRef:
name: my-secret
输出解密 Secret 数据
kubectl exec -it my-pod -- sh -c 'echo $SECRET_DATA | base64 -d | openssl aes-256-cbc -d -kfile my-secret.key'
# 这是您的明文 Secret 数据
Secret 是 Kubernetes 中用于存储敏感信息的强大工具。 通过选择合适的 Secret 类型并使用安全实践,可以保护您的敏感信息并确保您的应用程序安全可靠。
关注我,我们一起学习更多知识,带你了解更多职场信息内容.
想要了解更多技术文章请关注公众号“职谷智享”,关注后回复关键字【秒杀】可以领取秒杀系统学习资料