k8s学习-Secret(创建、使用、更新、删除等)

本文详细介绍了Kubernetes Secret的概念,包括其类型如Opaque、服务账号令牌等,展示了实战中通过kubectl创建、使用环境变量挂载、更新和删除Secret的过程。特别强调了Secret的安全性、文件大小限制和最佳实践,适合深入理解K8s中敏感信息管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


概念

Secret 是一个主要用来存储密码、token 等一些敏感信息的资源对象。其中,敏感信息是采用 Base64 编码保存起来的。

注意:Base64只是一种编码,不含密钥的,并不安全。默认情况下,Kubernetes Secret 未加密地存储在 API 服务器的底层数据存储(etcd)中。 任何拥有 API 访问权限的人都可以检索或修改 Secret,任何有权访问 etcd 的人也可以。 此外,任何有权限在命名空间中创建 Pod 的人都可以使用该访问权限读取该命名空间中的任何 Secret;
secret安全相关的静态加密等,将在k8s学习-思维导图与学习笔记中的安全部分详细展开。

模板

secret_test.yaml

apiVersion: v1
kind: Secret
metadata:
  name: secret-test
type: Opaque
data:
  username: YWRtaW4=
stringData:
  username: administrator

secret的类型

内置类型用法
Opaque用户定义的任意数据
kubernetes.io/service-account-token服务账号令牌
kubernetes.io/dockercfg~/.dockercfg 文件的序列化形式
kubernetes.io/dockerconfigjson~/.docker/config.json 文件的序列化形式
kubernetes.io/basic-auth用于基本身份认证的凭据
kubernetes.io/ssh-auth用于 SSH 身份认证的凭据
kubernetes.io/tls用于 TLS 客户端或者服务器端的数据
bootstrap.kubernetes.io/token启动引导令牌数据

实战

创建

使用kubectl

命令
写入账号密码

echo -n 'lady-killer9' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt

创建secret

kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt -n killer

结果
在这里插入图片描述
在这里插入图片描述
可以看到默认密钥名称是文件名,值是base64编码的。
注意,特殊字符需要使用 \ 进行转义,例如$

使用yaml文件创建

可以base64编码后放到data或者明文放到stringData,同时存在时,后者优先级更高。

命令
在这里插入图片描述
结果
在这里插入图片描述

使用

环境变量

k8s学习-ConfigMap(创建、使用、更新、删除等)的基本一致,configMapRef改为secretKeyRef即可。
示例

apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - secretRef:
          name: mysecret
  restartPolicy: Never

挂载

k8s学习-ConfigMap(创建、使用、更新、删除等)的基本一致
示例

apiVersion: v1
kind: Secret
metadata:
  name: dotfile-secret
data:
  .secret-file: dmFsdWUtMg0KDQo=
---
apiVersion: v1
kind: Pod
metadata:
  name: secret-dotfiles-pod
spec:
  volumes:
  - name: secret-volume
    secret:
      secretName: dotfile-secret
  containers:
  - name: dotfile-test-container
    image: k8s.gcr.io/busybox
    command:
    - ls
    - "-l"
    - "/etc/secret-volume"
    volumeMounts:
    - name: secret-volume
      readOnly: true
      mountPath: "/etc/secret-volume"

imagePullSecret

imagePullSecrets 字段中包含一个列表,列举对同一名字空间中的 Secret 的引用。 你可以使用 imagePullSecrets 将包含 Docker(或其他)镜像仓库密码的 Secret 传递给 kubelet。kubelet 使用此信息来替你的 Pod 拉取私有镜像

手动指定 imagePullSecret
可以阅读容器镜像文档 以了解如何设置 imagePullSecrets。

设置自动附加 imagePullSecrets
可以手动创建 imagePullSecret,并在 ServiceAccount 中引用。 使用该 ServiceAccount 创建的任何 Pod 和默认使用该 ServiceAccount 的 Pod 将会将其的 imagePullSecret 字段设置为服务帐户的 imagePullSecret 值。 详细说明请参阅 将 ImagePullSecrets 添加到服务帐户

自动挂载手动创建的 Secret
手动创建的 Secret(例如包含用于访问 GitHub 帐户令牌的 Secret)可以根据其服务帐户自动附加到 Pod。

更新

k8s学习-ConfigMap(创建、使用、更新、删除等)的基本一致

删除

命令

kubectl delete secret db-user-pass -n killer

结果
在这里插入图片描述

注意项

  • 第一个是 Secret 的文件大小限制。这个跟 ConfigMap 一样,也是1MB
  • 第二个是 Secret 采用了 base64编码,但是它跟明文也没有太大区别。所以说,如果有一些机密信息要用 Secret来存储的话,还是要很慎重考虑。也就是说谁会来访问你这个集群,谁会来用你这个Secret,还是要慎重考虑,因为它如果能够访问这个集群,就能拿到这个 Secret。 如果是对 Secret敏感信息要求很高,对加密这块有很强的需求,推荐可以使用 Kubernetes 和开源的vault做一个解决方案,来解决敏感信息的加密和权限管理。
  • 第三个就是 Secret 读取的最佳实践,建议不要用list/watch,如果用 list/watch 操作的话,会把 namespace 下的所有 Secret全部拉取下来,这样其实暴露了更多的信息。推荐使用 GET 的方法,这样只获取你自己需要的那个 Secret。

更多k8s相关内容,请看文章:k8s学习-思维导图与学习笔记

参考

k8s-secret
k8s-使用kubectl管理secret
k8s-secret-spec
阿里云-应用配置管理

<think>好的,我现在需要帮用户解决如何在Kubernetes中修改通过命令行创建的docker-registry类型的Secret的问题。首先,我得回忆一下k8sSecret的基本操作。记得用户提到的是通过命令行创建的,所以可能用的是kubectl create secret docker-registry命令。那修改的话,k8s本身不支持直接修改Secret,可能需要替换或者更新。 接下来,我应该考虑用户的具体需求。用户可能已经有一个docker-registry的Secret,现在需要更新其中的凭证,比如密码或者用户名变了。这时候,我需要提供几种方法。常见的办法可能是先获取现有的Secret,修改后再应用,或者直接用替换的方式。 首先,用户可能需要查看现有的Secret内容。可以用kubectl get secret命令加上-o yaml或者json选项,这样能导出当前的配置。不过要注意,Secret的数据是base64编码的,所以在修改时需要解码再编码。这部分需要提醒用户注意,避免直接编辑导致格式错误。 然后,方法一可能是使用kubectl edit直接编辑。用户运行kubectl edit secret <secret-name>,然后找到对应的.dockerconfigjson字段,进行base64解码,修改后再编码替换回去。不过这种方法容易出错,特别是如果用户不熟悉base64和JSON格式的话。 方法二可能是通过命令行重新创建。用户可以用同样的kubectl create secret命令,加上--dry-run=client -o yaml生成新的配置,然后通过管道传递给kubectl apply。不过需要覆盖现有的Secret,所以应该用替换而不是创建,可能需要先删除旧的,或者使用apply强制替换。这时候要确认用户是否允许这种操作,因为可能会有服务依赖这个Secret,导致中断。 方法三可能涉及解码和编码手动处理。比如用kubectl get secret导出到文件,用base64 -d解码,修改后重新编码,再用kubectl apply应用回去。这个过程需要一步步指导,确保用户正确使用命令行工具,避免中间步骤出错。 还需要考虑的是,更新Secret后,相关的Pod是否需要重启才能使用新的凭证。如果Pod引用了该Secret作为imagePullSecrets,可能需要重启或者重新部署才能生效。这点要提醒用户,否则他们可能以为修改没生效。 另外,安全方面的问题,比如在命令行历史中保存了敏感信息,比如密码,应该建议用户清理历史或者使用更安全的方式处理,比如从文件读取密码而不是直接在命令中输入。 总结下来,步骤应该是先查看现有Secret,然后选择合适的方法进行更新,最后验证和可能的重启Pod。确保每个步骤都清晰,并提醒注意事项,比如base64编码、JSON格式、安全处理凭证等。这样用户就能一步步安全地完成修改了。</think>在Kubernetes中修改通过命令行创建的`docker-registry`类型Secret,需遵循以下步骤: --- ### 一、理解Secret类型 `docker-registry`类型的Secret用于存储私有镜像仓库的认证信息,其数据结构为: - `username`: 用户名 - `password`: 密码 - `email`: 邮箱(可选) - `server`: 镜像仓库地址 --- ### 二、修改Secret的两种方法 #### 方法1:通过命令行直接更新 1. **删除Secret**(非必须,但推荐避免冲突) ```bash kubectl delete secret <secret-name> ``` 2. **重新创建Secret** ```bash kubectl create secret docker-registry <secret-name> \ --docker-server=<DOCKER_REGISTRY_SERVER> \ --docker-username=<DOCKER_USER> \ --docker-password=<DOCKER_PASSWORD> \ --docker-email=<DOCKER_EMAIL> ``` --- #### 方法2:通过编辑YAML文件更新(无需删除) 1. **导出现有Secret为YAML** ```bash kubectl get secret <secret-name> -o yaml > secret.yaml ``` 2. **解码并修改数据** - 找到`.dockerconfigjson`字段,解码Base64: ```bash echo "<encoded-data>" | base64 -d ``` - 修改JSON内容(注意格式需严格合法): ```json {"auths":{"<registry-url>":{"username":"new-user","password":"new-pass","email":"new-email"}}} ``` - 重新Base64编码: ```bash echo "<modified-json>" | base64 -w 0 ``` 3. **更新并应用YAML** ```bash kubectl apply -f secret.yaml ``` --- ### 三、验证修改 1. **查看Secret详情** ```bash kubectl get secret <secret-name> -o jsonpath='{.data\.dockerconfigjson}' | base64 -d ``` 2. **检查Pod是否使用新凭证** - 如果Pod使用Secret作为`imagePullSecrets`,可能需要重启Pod: ```bash kubectl rollout restart deployment/<deployment-name> ``` --- ### 注意事项 1. **敏感信息保护**:避免在命令行历史中遗留密码,可通过环境变量传递: ```bash read -s DOCKER_PASSWORD && kubectl create secret ... --docker-password="$DOCKER_PASSWORD" ``` 2. **JSON格式验证**:错误的JSON格式会导致Secret失效,建议使用`jq`工具辅助编辑。 通过以上步骤,即可安全更新docker-registry类型的Secret
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值