← 返回首页
🔧

Kubernetes Secrets 密钥管理

📂 devops ⏱ 2 min 387 words

Kubernetes Secrets 密钥管理

什么是 Secret

Secret 是 Kubernetes 中用于存储和管理敏感信息(如密码、Token、证书)的 API 对象。Secret 以 Base64 编码存储,相比 ConfigMap 提供了更好的安全性。但请注意,Secret 只是编码而非加密,生产环境应结合加密方案使用。

创建 Secret

从字面值创建

kubectl create secret generic my-secret \
  --from-literal=username=admin \
  --from-literal=password=S3cr3tP@ss

从文件创建

# 从单个文件创建
kubectl create secret generic my-secret --from-file=./password.txt

# 从多个文件创建
kubectl create secret generic my-secret \
  --from-file=username=./username.txt \
  --from-file=password=./password.txt

TLS Secret

kubectl create secret tls my-tls \
  --cert=tls.crt \
  --key=tls.key

通过 YAML 文件创建

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4=  # echo -n 'admin' | base64
  password: UzNjcjN0UEBzcyQ=  # echo -n 'S3cr3tP@ss' | base64
# 生成 Base64 编码
echo -n 'admin' | base64
echo -n 'S3cr3tP@ss' | base64

Secret 的类型

Opaque(默认)

通用类型,存储任意键值对:

apiVersion: v1
kind: Secret
metadata:
  name: generic-secret
type: Opaque
data:
  key1: dmFsdWUx
  key2: dmFsdWUy

kubernetes.io/tls

用于存储 TLS 证书:

apiVersion: v1
kind: Secret
metadata:
  name: tls-secret
type: kubernetes.io/tls
data:
  tls.crt: <base64-encoded-cert>
  tls.key: <base64-encoded-key>

kubernetes.io/dockerconfigjson

用于存储 Docker Registry 凭据:

kubectl create secret docker-registry regcred \
  --docker-server=registry.example.com \
  --docker-username=user \
  --docker-password=password \
  --docker-email=user@example.com

kubernetes.io/basic-auth

存储基本认证信息:

apiVersion: v1
kind: Secret
metadata:
  name: basic-auth
type: kubernetes.io/basic-auth
data:
  username: YWRtaW4=
  password: UzNjcjN0UEBzcyQ=

使用 Secret

作为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-app
      env:
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password
      envFrom:
        - secretRef:
            name: my-secret

作为文件挂载

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-app
      volumeMounts:
        - name: secret-volume
          mountPath: /etc/secrets
  volumes:
    - name: secret-volume
      secret:
        secretName: my-secret

挂载单个 Secret Key

volumes:
  - name: secret-volume
    secret:
      secretName: my-secret
      items:
        - key: password
          path: db-password.txt
          mode: 0400

查看 Secret

# 列出 Secret
kubectl get secret

# 查看 Secret 详情
kubectl describe secret my-secret

# 解码 Secret
kubectl get secret my-secret -o jsonpath='{.data.password}' | base64 -d
kubectl get secret my-secret -o jsonpath='{.data}' | jq -r 'to_entries[] | "\(.key)=\(.value | @base64d)"'

更新 Secret

# 编辑 Secret
kubectl edit secret my-secret

# 替换 Secret
kubectl create secret generic my-secret \
  --from-literal=password=NewP@ssw0rd \
  --dry-run=client -o yaml | kubectl apply -f -

在 Pod 中引用 Secret

使用 Secret 拉取镜像

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: registry.example.com/my-app:v1
  imagePullSecrets:
    - name: regcred

Secret 加密存储

启用静态加密

# 创建加密配置
cat > encryption-config.yaml <<EOF
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <base64-encoded-secret>
      - identity: {}
EOF

最佳实践

总结

Secret 是 Kubernetes 中管理敏感信息的核心组件。正确使用 Secret 可以有效保护应用的敏感配置,但需要注意安全最佳实践,结合加密和访问控制来确保数据安全。