【问题标题】:Removed k8s secret's data persists after updates删除的 k8s secret 的数据在更新后仍然存在
【发布时间】:2021-12-27 17:01:05
【问题描述】:

我有一个 k8s 秘密 yaml 定义,其中一些数据项已经应用到集群中。从 yaml 文件中删除一些数据项,并使用 kubectl apply 更新秘密后,这些删除的数据项仍然保留在 k8s 集群中存在的秘密对象中,如果不从头删除并重新创建秘密,则无法删除它们。但是,这不是通常的行为,只会在极少数情况下发生。知道为什么会发生这种情况吗?如何在不删除整个秘密的情况下修复它?

例子:

$ cat <<EOF|kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials-secret
  namespace: default
type: Opaque
stringData:
  user: foo
  password: bar
EOF

秘密是使用数据项userpassword 创建的。

$ cat <<EOF|kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials-secret
  namespace: default
type: Opaque
stringData:
  password: bar
EOF

从秘密定义中删除user 后,秘密将更新为kubectl apply,但user 数据项仍保留在秘密中。

【问题讨论】:

  • kubectl -n default get secret db-credentials-secret -o yaml 向您展示了什么?
  • 它向我显示了包含所有数据项(包括用户和密码)的秘密定义,即使 password 应该已被删除。此外,它还包括每个 k8s 对象所具有的resourceVersionselfLinkuuid 字段。
  • 您使用的是哪个版本的 Kubernetes,您是如何设置集群的?您是否使用裸机安装或某些云提供商?重现您的问题很重要。
  • @MikołajGłodziak Kubernets 版本是 1.19,集群是 Amazon EKS 设置。
  • 您正在使用已弃用的 Kubernetes 版本。你能更新到最新的吗?

标签: kubernetes kubernetes-secrets


【解决方案1】:

看来你误会了

更新 YAML secret 后,我们必须使用

kubectl apply 

并且需要重新创建部署,否则我们无法将密钥更新到 POD。

您可以重新启动 POD 或使用该特定secret 的部署。

Kubernetes 不会自动更改密钥。

如果您想将此重新启动或重新创建过程设置为自动,您可以使用 Reloader:https://github.com/stakater/Reloader

如果 secret 或 configmap 发生更改,这将重新启动 POD 或部署,并将重新启动 POD/部署

【讨论】:

  • 对不起,我的问题恐怕你还没理解。此处不涉及部署,我只是在谈论 k8s 秘密对象及其包含的数据项。你所说的关于秘密和豆荚的说法实际上是真实的,但这与我在这里揭露的问题无关。
  • 如果您正在应用更改,我建议您检查该密码的-o yaml,以便您检查密码是否更新。
  • 这实际上是重点,在用kubectl apply 更新秘密后,当我用kubectl get secret db-credentials-secret -o yaml 获得秘密时,我得到了所有数据项的秘密(包括已删除的数据项),所以很清楚数据项没有被删除。这只是一个例子,我真正的秘密显然更复杂,我只是试图揭露我已经不止一次观察到的行为。
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2016-11-08
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
相关资源
最近更新 更多