找回密码
 立即注册
首页 业界区 安全 k8s~secret资源的使用

k8s~secret资源的使用

齐娅晶 5 小时前
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 命令行创建
  1. # 从文件创建
  2. kubectl create secret generic db-secret \
  3.   --from-literal=username=admin \
  4.   --from-literal=password=secret123
  5. # 从文件内容创建
  6. kubectl create secret generic ssh-key-secret \
  7.   --from-file=id_rsa=~/.ssh/id_rsa \
  8.   --from-file=id_rsa.pub=~/.ssh/id_rsa.pub
  9. # 创建 Docker registry secret
  10. kubectl create secret docker-registry regcred \
  11.   --docker-server=registry.example.com \
  12.   --docker-username=admin \
  13.   --docker-password=secret \
  14.   --docker-email=admin@example.com
复制代码
3.2 通过 YAML 文件创建
  1. # secret-demo.yaml
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5.   name: app-secret
  6. type: Opaque
  7. data:
  8.   username: YWRtaW4=  # base64编码的 "admin"
  9.   password: c2VjcmV0MTIz
复制代码
  1. # 应用YAML文件
  2. kubectl apply -f secret-demo.yaml
复制代码
4. Secret 在 Pod 中的使用方式

4.1 作为环境变量
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: secret-env-pod
  5. spec:
  6.   containers:
  7.   - name: myapp
  8.     image: nginx
  9.     env:
  10.     - name: SECRET_USERNAME
  11.       valueFrom:
  12.         secretKeyRef:
  13.           name: app-secret
  14.           key: username
  15.     - name: SECRET_PASSWORD
  16.       valueFrom:
  17.         secretKeyRef:
  18.           name: app-secret
  19.           key: password
复制代码
4.2 挂载为文件(推荐方式)
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: secret-volume-pod
  5. spec:
  6.   containers:
  7.   - name: myapp
  8.     image: nginx
  9.     volumeMounts:
  10.     - name: secret-volume
  11.       mountPath: "/etc/secrets"
  12.       readOnly: true
  13.   volumes:
  14.   - name: secret-volume
  15.     secret:
  16.       secretName: app-secret
  17.       items:  # 可选:选择性挂载特定key
  18.       - key: username
  19.         path: my-username
  20.       - key: password
  21.         path: my-password
复制代码
4.3 拉取私有镜像
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: private-reg-pod
  5. spec:
  6.   containers:
  7.   - name: private-app
  8.     image: registry.example.com/private-app:v1
  9.   imagePullSecrets:
  10.   - name: regcred
复制代码
5. 高级使用技巧

5.1 自动挂载为文件
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: secret-automount
  5. spec:
  6.   containers:
  7.   - name: myapp
  8.     image: nginx
  9.     volumeMounts:
  10.     - name: secret-volume
  11.       mountPath: "/etc/secrets"
  12.   volumes:
  13.   - name: secret-volume
  14.     secret:
  15.       secretName: app-secret
  16.       defaultMode: 0400  # 设置文件权限
复制代码
5.2 使用 stringData 字段(自动base64编码)
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: stringdata-secret
  5. type: Opaque
  6. stringData:  # 无需手动base64编码
  7.   username: admin
  8.   password: secret123
  9.   config.yaml: |
  10.     database:
  11.       host: localhost
  12.       port: 3306
复制代码
5.3 从多个 Secret 组合
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: multiple-secrets
  5. spec:
  6.   containers:
  7.   - name: myapp
  8.     image: nginx
  9.     env:
  10.     - name: DB_CONFIG
  11.       valueFrom:
  12.         configMapKeyRef:
  13.           name: db-config
  14.           key: connection-string
  15.     envFrom:
  16.     - secretRef:
  17.         name: credentials-secret
  18.   volumes:
  19.   - name: secrets-vol
  20.     secret:
  21.       secretName: tls-secret
复制代码
6. 管理操作

6.1 查看 Secret
  1. # 列出所有 Secret
  2. kubectl get secrets
  3. # 查看详细信息
  4. kubectl describe secret app-secret
  5. # 解码查看内容
  6. kubectl get secret app-secret -o jsonpath='{.data.username}' | base64 --decode
复制代码
6.2 更新 Secret
  1. # 方法1:编辑现有 Secret
  2. kubectl edit secret app-secret
  3. # 方法2:通过文件更新
  4. kubectl apply -f updated-secret.yaml
复制代码
6.3 删除 Secret
  1. kubectl delete secret app-secret
复制代码
7. 最佳实践和安全建议

7.1 安全最佳实践


  • 加密存储
    1. # 启用 etcd 加密
    2. kubectl create secret generic test-secret \
    3.   --from-literal=mykey=mydata \
    4.   --namespace default
    复制代码
  • RBAC 权限控制
    1. apiVersion: rbac.authorization.k8s.io/v1
    2. kind: Role
    3. metadata:
    4.   namespace: default
    5.   name: secret-reader
    6. rules:
    7. - apiGroups: [""]
    8.   resources: ["secrets"]
    9.   verbs: ["get", "watch", "list"]
    复制代码
  • 使用外部 Secret 管理

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

7.2 使用建议


  • 生命周期管理
    1. # 为 Secret 添加标签便于管理
    2. apiVersion: v1
    3. kind: Secret
    4. metadata:
    5.   name: app-secret
    6.   labels:
    7.     app: myapp
    8.     tier: backend
    9.     environment: production
    10. type: Opaque
    11. data:
    12.   password: c2VjcmV0
    复制代码
  • 定期轮换
    1. # 自动轮换示例脚本
    2. #!/bin/bash
    3. NEW_PASSWORD=$(openssl rand -base64 32)
    4. kubectl patch secret app-secret \
    5.   -p "{"data":{"password":"$(echo -n $NEW_PASSWORD | base64)"}}"
    复制代码
8. 注意事项


  • Base64 不是加密:Secret 仅提供 base64 编码,不是加密
  • etcd 安全性:确保 etcd 集群的安全性
  • 访问权限:严格控制对 Secret 的 RBAC 权限
  • 日志泄露:避免在日志中输出 Secret 内容
  • Secret 大小限制:单个 Secret 最大 1MB
9. 故障排查
  1. # 检查 Secret 是否被挂载
  2. kubectl exec pod-name -- ls /etc/secrets
  3. # 检查环境变量
  4. kubectl exec pod-name -- env | grep SECRET
  5. # 查看 Pod 事件
  6. kubectl describe pod pod-name
  7. # 验证 Secret 存在
  8. kubectl get secret secret-name
复制代码
通过合理使用 Secret 资源,可以有效管理 Kubernetes 集群中的敏感信息,提高应用程序的安全性。建议结合具体的业务场景选择合适的 Secret 类型和使用方式。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册