K8s 核心对象:Secret 是什么?怎么用?
Scret注入链路如图: ConfigMap ──(envFrom 虚线)──→ Pod 非敏感配置: DB_HOST, LOG_LEVEL Secret ──(volume 虚线)──→ Pod 敏感数据: DB_PASSWORD, TLS 证书Secret 是什么存储敏感数据的 K8s 对象密码、Token、证书私钥。数据以 base64 编码存储支持 etcd 加密挂载到 Pod 时不落盘。Secret 解决了什么问题方案①: 密码写死在镜像里 后果: 镜像仓库谁都能拉 → 密码人尽皆知改密码要重打镜像 方案②: 密码写在 Deployment YAML 里 后果: YAML 进了 git → 密码进了代码仓库 → 所有能看代码的人都能看密码 方案③: 环境变量明文传 后果: kubectl describe pod 直接能看到; 容器逃逸后 env 全暴露Secret 的解法密码单独存进 Secret (base64 可选 etcd 加密) ↓ RBAC 单独控制谁能读 Secret (和 ConfigMap 分开授权) ↓ kubelet 挂载到 Pod 时用 tmpfs (内存文件系统, 不写磁盘) ↓ 密码从存储 → 传输 → 使用 全链路隔离Secret 的四种内置类型# 类型①: Opaque —— 通用型自定义键值对最常用图中 DB_PASSWORD 就是 apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: DB_PASSWORD: cHdkMTIz # base64(密码) # 类型②: kubernetes.io/tls —— 存证书图中 TLS 就是 type: kubernetes.io/tls data: tls.crt: LS0tLS1CRUdJTi... # 证书 tls.key: LS0tLS1CRUdJTi... # 私钥 # Ingress 的 HTTPS 就是引用这种类型 # 类型③: kubernetes.io/dockerconfigjson —— 私有仓库认证 type: kubernetes.io/dockerconfigjson # 拉取私有镜像时用挂在 spec.imagePullSecrets # 类型④: kubernetes.io/service-account-token —— K8s 自动生成 # 每个 ServiceAccount 的 Token系统自动管理不用手动建类型场景图中对应Opaque通用密码/密钥DB_PASSWORDtlsHTTPS 证书TLS 标注dockerconfigjson私有镜像仓库认证你的镜像service-account-tokenPod 身份令牌权限链路的 SA 自动注入怎么用三种注入方式创建# 方式A: 命令行自动做 base64 kubectl create secret generic db-secret \ --from-literalDB_PASSWORDpwd123 # 方式B: 从证书文件创建 TLS Secret kubectl create secret tls web-tls \ --certweb.crt --keyweb.key # 方式C: YAML要自己写 base64生产不推荐——明文在文件里 echo -n pwd123 | base64 # cHdkMTIz注入和 ConfigMap 语法几乎一样只换个引用词spec: containers: - name: web # ── 方式①: 环境变量注入单个 key ── env: - name: DB_PASSWORD valueFrom: secretKeyRef: # ← ConfigMap 是 configMapRef name: db-secret key: DB_PASSWORD # ── 方式②: 整批注入 ── envFrom: - secretRef: # ← ConfigMap 是 configMapRef name: db-secret # ── 方式③: 文件挂载图中画的方式推荐── volumeMounts: - name: tls mountPath: /etc/tls readOnly: true volumes: - name: tls secret: secretName: web-tls # ← ConfigMap 是 configMap defaultMode: 0600 # 私钥文件权限只有 owner 可读验证 一个安全细节# 进容器看挂载的证书文件 kubectl exec deployment/web -- ls -l /etc/tls # -rw------- 1 root root 1675 ... tls.key ← 0600 权限生效 # 看挂载点类型 —— 关键安全细节 kubectl exec deployment/web -- mount | grep tls # tmpfs on /etc/tls type tmpfs ← 内存文件系统不落盘!
上一篇/下一篇内容由系统自动关联
返回资讯列表 →