天使伊人 發表於 2026-3-31 15:02:00

k8s~secret资源的使用

<h1 id="kubernetes-secret-资源使用详解">Kubernetes Secret 资源使用详解</h1>
<h2 id="1-secret-基本概念">1. Secret 基本概念</h2>
<p>Secret 是 Kubernetes 中用于存储敏感信息的资源对象,如密码、OAuth 令牌、SSH 密钥等。与 ConfigMap 类似,但 Secret 的数据是经过 base64 编码存储的。</p>
<h2 id="2-secret-类型">2. Secret 类型</h2>
<h3 id="21-内置类型">2.1 内置类型</h3>
<ul>
<li><strong>Opaque</strong>:默认类型,存储任意用户定义的数据</li>
<li><strong>kubernetes.io/service-account-token</strong>:服务账号令牌</li>
<li><strong>kubernetes.io/dockerconfigjson</strong>:Docker 镜像仓库的认证信息</li>
<li><strong>kubernetes.io/tls</strong>:TLS 证书和私钥</li>
<li><strong>bootstrap.kubernetes.io/token</strong>:启动引导令牌</li>
</ul>
<h2 id="3-创建-secret-的方法">3. 创建 Secret 的方法</h2>
<h3 id="31-通过-kubectl-命令行创建">3.1 通过 kubectl 命令行创建</h3>
<pre><code class="language-bash"># 从文件创建
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
</code></pre>
<h3 id="32-通过-yaml-文件创建">3.2 通过 YAML 文件创建</h3>
<pre><code class="language-yaml"># secret-demo.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: YWRtaW4=# base64编码的 "admin"
password: c2VjcmV0MTIz
</code></pre>
<pre><code class="language-bash"># 应用YAML文件
kubectl apply -f secret-demo.yaml
</code></pre>
<h2 id="4-secret-在-pod-中的使用方式">4. Secret 在 Pod 中的使用方式</h2>
<h3 id="41-作为环境变量">4.1 作为环境变量</h3>
<pre><code class="language-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
</code></pre>
<h3 id="42-挂载为文件推荐方式">4.2 挂载为文件(推荐方式)</h3>
<pre><code class="language-yaml">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
</code></pre>
<h3 id="43-拉取私有镜像">4.3 拉取私有镜像</h3>
<pre><code class="language-yaml">apiVersion: v1
kind: Pod
metadata:
name: private-reg-pod
spec:
containers:
- name: private-app
    image: registry.example.com/private-app:v1
imagePullSecrets:
- name: regcred
</code></pre>
<h2 id="5-高级使用技巧">5. 高级使用技巧</h2>
<h3 id="51-自动挂载为文件">5.1 自动挂载为文件</h3>
<pre><code class="language-yaml">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# 设置文件权限
</code></pre>
<h3 id="52-使用-stringdata-字段自动base64编码">5.2 使用 stringData 字段(自动base64编码)</h3>
<pre><code class="language-yaml">apiVersion: v1
kind: Secret
metadata:
name: stringdata-secret
type: Opaque
stringData:# 无需手动base64编码
username: admin
password: secret123
config.yaml: |
    database:
      host: localhost
      port: 3306
</code></pre>
<h3 id="53-从多个-secret-组合">5.3 从多个 Secret 组合</h3>
<pre><code class="language-yaml">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
</code></pre>
<h2 id="6-管理操作">6. 管理操作</h2>
<h3 id="61-查看-secret">6.1 查看 Secret</h3>
<pre><code class="language-bash"># 列出所有 Secret
kubectl get secrets

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

# 解码查看内容
kubectl get secret app-secret -o jsonpath='{.data.username}' | base64 --decode
</code></pre>
<h3 id="62-更新-secret">6.2 更新 Secret</h3>
<pre><code class="language-bash"># 方法1:编辑现有 Secret
kubectl edit secret app-secret

# 方法2:通过文件更新
kubectl apply -f updated-secret.yaml
</code></pre>
<h3 id="63-删除-secret">6.3 删除 Secret</h3>
<pre><code class="language-bash">kubectl delete secret app-secret
</code></pre>
<h2 id="7-最佳实践和安全建议">7. 最佳实践和安全建议</h2>
<h3 id="71-安全最佳实践">7.1 安全最佳实践</h3>
<ol>
<li>
<p><strong>加密存储</strong>:</p>
<pre><code class="language-bash"># 启用 etcd 加密
kubectl create secret generic test-secret \
--from-literal=mykey=mydata \
--namespace default
</code></pre>
</li>
<li>
<p><strong>RBAC 权限控制</strong>:</p>
<pre><code class="language-yaml">apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
</code></pre>
</li>
<li>
<p><strong>使用外部 Secret 管理</strong>:</p>
<ul>
<li>HashiCorp Vault</li>
<li>AWS Secrets Manager</li>
<li>Azure Key Vault</li>
<li>Google Cloud Secret Manager</li>
</ul>
</li>
</ol>
<h3 id="72-使用建议">7.2 使用建议</h3>
<ol>
<li>
<p><strong>生命周期管理</strong>:</p>
<pre><code class="language-yaml"># 为 Secret 添加标签便于管理
apiVersion: v1
kind: Secret
metadata:
name: app-secret
labels:
    app: myapp
    tier: backend
    environment: production
type: Opaque
data:
password: c2VjcmV0
</code></pre>
</li>
<li>
<p><strong>定期轮换</strong>:</p>
<pre><code class="language-bash"># 自动轮换示例脚本
#!/bin/bash
NEW_PASSWORD=$(openssl rand -base64 32)
kubectl patch secret app-secret \
-p "{\"data\":{\"password\":\"$(echo -n $NEW_PASSWORD | base64)\"}}"
</code></pre>
</li>
</ol>
<h2 id="8-注意事项">8. 注意事项</h2>
<ol>
<li><strong>Base64 不是加密</strong>:Secret 仅提供 base64 编码,不是加密</li>
<li><strong>etcd 安全性</strong>:确保 etcd 集群的安全性</li>
<li><strong>访问权限</strong>:严格控制对 Secret 的 RBAC 权限</li>
<li><strong>日志泄露</strong>:避免在日志中输出 Secret 内容</li>
<li><strong>Secret 大小限制</strong>:单个 Secret 最大 1MB</li>
</ol>
<h2 id="9-故障排查">9. 故障排查</h2>
<pre><code class="language-bash"># 检查 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
</code></pre>
<p>通过合理使用 Secret 资源,可以有效管理 Kubernetes 集群中的敏感信息,提高应用程序的安全性。建议结合具体的业务场景选择合适的 Secret 类型和使用方式。</p>


</div>
<div id="MySignature" role="contentinfo">
    <p></p>
<div class="navgood">
<p>作者:仓储大叔,张占岭,<br>
荣誉:微软MVP<br>QQ:853066980</p>

<p><strong>支付宝扫一扫,为大叔打赏!</strong>
<br><img src="https://images.cnblogs.com/cnblogs_com/lori/237884/o_IMG_7144.JPG"></p>
</div><br><br>
来源:https://www.cnblogs.com/lori/p/19801616
頁: [1]
查看完整版本: k8s~secret资源的使用