k8s~secret资源的使用

Kubernetes Secret 资源使用详解

1. Secret 基本概念

Secret 是 Kubernetes 中用于存储敏感信息的资源对象,如密码、OAuth 令牌、SSH 密钥等。与 ConfigMap 类似,但 Secret 的数据是经过 base64 编码存储的。

2. Secret 类型

2.1 内置类型

  • Opaque:默认类型,存储任意用户定义的数据
  • kubernetes.io/service-account-token:服务账号令牌
  • kubernetes.io/dockerconfigjson:Docker 镜像仓库的认证信息
  • kubernetes.io/tls:TLS 证书和私钥
  • bootstrap.kubernetes.io/token:启动引导令牌

3. 创建 Secret 的方法

3.1 通过 kubectl 命令行创建

# 从文件创建
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

3.2 通过 YAML 文件创建

# 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

4. Secret 在 Pod 中的使用方式

4.1 作为环境变量

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

4.2 挂载为文件(推荐方式)

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

4.3 拉取私有镜像

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

5. 高级使用技巧

5.1 自动挂载为文件

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  # 设置文件权限

5.2 使用 stringData 字段(自动base64编码)

apiVersion: v1
kind: Secret
metadata:
  name: stringdata-secret
type: Opaque
stringData:  # 无需手动base64编码
  username: admin
  password: secret123
  config.yaml: |
    database:
      host: localhost
      port: 3306

5.3 从多个 Secret 组合

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

6. 管理操作

6.1 查看 Secret

# 列出所有 Secret
kubectl get secrets

# 查看详细信息
kubectl describe secret app-secret

# 解码查看内容
kubectl get secret app-secret -o jsonpath='{.data.username}' | base64 --decode

6.2 更新 Secret

# 方法1:编辑现有 Secret
kubectl edit secret app-secret

# 方法2:通过文件更新
kubectl apply -f updated-secret.yaml

6.3 删除 Secret

kubectl delete secret app-secret

7. 最佳实践和安全建议

7.1 安全最佳实践

  1. 加密存储

    # 启用 etcd 加密
    kubectl create secret generic test-secret \
      --from-literal=mykey=mydata \
      --namespace default
    
  2. RBAC 权限控制

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: secret-reader
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    
  3. 使用外部 Secret 管理

    • HashiCorp Vault
    • AWS Secrets Manager
    • Azure Key Vault
    • Google Cloud Secret Manager

7.2 使用建议

  1. 生命周期管理

    # 为 Secret 添加标签便于管理
    apiVersion: v1
    kind: Secret
    metadata:
      name: app-secret
      labels:
        app: myapp
        tier: backend
        environment: production
    type: Opaque
    data:
      password: c2VjcmV0
    
  2. 定期轮换

    # 自动轮换示例脚本
    #!/bin/bash
    NEW_PASSWORD=$(openssl rand -base64 32)
    kubectl patch secret app-secret \
      -p "{\"data\":{\"password\":\"$(echo -n $NEW_PASSWORD | base64)\"}}"
    

8. 注意事项

  1. Base64 不是加密:Secret 仅提供 base64 编码,不是加密
  2. etcd 安全性:确保 etcd 集群的安全性
  3. 访问权限:严格控制对 Secret 的 RBAC 权限
  4. 日志泄露:避免在日志中输出 Secret 内容
  5. Secret 大小限制:单个 Secret 最大 1MB

9. 故障排查

# 检查 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 类型和使用方式。

posted @ 2026-03-31 15:02  张占岭  阅读(0)  评论(0)    收藏  举报