










Secret 是 Kubernetes 中用于存储敏感信息的资源对象,如密码、OAuth 令牌、SSH 密钥等。与 ConfigMap 类似,但 Secret 的数据是经过 base64 编码存储的。
# 从文件创建
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secret123
# 从文件内容创建
kubectl create secret generic ssh-key-secret \
--from-file=id_rsa=~/.ssh/id_rsa \
--from-file=id_rsa.pub=~/.ssh/id_rsa.pub
# 创建 Docker registry secret
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=admin \
--docker-password=secret \
--docker-email=admin@example.com
# secret-demo.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: YWRtaW4= # base64编码的 "admin"
password: c2VjcmV0MTIz
# 应用YAML文件
kubectl apply -f secret-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: myapp
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: app-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: password
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-pod
spec:
containers:
- name: myapp
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: app-secret
items: # 可选:选择性挂载特定key
- key: username
path: my-username
- key: password
path: my-password
apiVersion: v1
kind: Pod
metadata:
name: private-reg-pod
spec:
containers:
- name: private-app
image: registry.example.com/private-app:v1
imagePullSecrets:
- name: regcred
apiVersion: v1
kind: Pod
metadata:
name: secret-automount
spec:
containers:
- name: myapp
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
volumes:
- name: secret-volume
secret:
secretName: app-secret
defaultMode: 0400 # 设置文件权限
apiVersion: v1
kind: Secret
metadata:
name: stringdata-secret
type: Opaque
stringData: # 无需手动base64编码
username: admin
password: secret123
config.yaml: |
database:
host: localhost
port: 3306
apiVersion: v1
kind: Pod
metadata:
name: multiple-secrets
spec:
containers:
- name: myapp
image: nginx
env:
- name: DB_CONFIG
valueFrom:
configMapKeyRef:
name: db-config
key: connection-string
envFrom:
- secretRef:
name: credentials-secret
volumes:
- name: secrets-vol
secret:
secretName: tls-secret
# 列出所有 Secret
kubectl get secrets
# 查看详细信息
kubectl describe secret app-secret
# 解码查看内容
kubectl get secret app-secret -o jsonpath='{.data.username}' | base64 --decode
# 方法1:编辑现有 Secret
kubectl edit secret app-secret
# 方法2:通过文件更新
kubectl apply -f updated-secret.yaml
kubectl delete secret app-secret
加密存储:
# 启用 etcd 加密
kubectl create secret generic test-secret \
--from-literal=mykey=mydata \
--namespace default
RBAC 权限控制:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
使用外部 Secret 管理:
生命周期管理:
# 为 Secret 添加标签便于管理
apiVersion: v1
kind: Secret
metadata:
name: app-secret
labels:
app: myapp
tier: backend
environment: production
type: Opaque
data:
password: c2VjcmV0
定期轮换:
# 自动轮换示例脚本
#!/bin/bash
NEW_PASSWORD=$(openssl rand -base64 32)
kubectl patch secret app-secret \
-p "{\"data\":{\"password\":\"$(echo -n $NEW_PASSWORD | base64)\"}}"
# 检查 Secret 是否被挂载
kubectl exec pod-name -- ls /etc/secrets
# 检查环境变量
kubectl exec pod-name -- env | grep SECRET
# 查看 Pod 事件
kubectl describe pod pod-name
# 验证 Secret 存在
kubectl get secret secret-name
通过合理使用 Secret 资源,可以有效管理 Kubernetes 集群中的敏感信息,提高应用程序的安全性。建议结合具体的业务场景选择合适的 Secret 类型和使用方式。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。