0

在 argocd 中管理机密时,我使用 base64 对 argocd-secret 中的值进行编码并将其设置为 manifest。

在这种情况下,虽然我使用了 kusotomize、构建和应用它,但由 base64 编码的秘密将进一步编码为 base64。

$ echo -n "clientid" | base64
Y2xpZW50aWQ=

$ echo -n "clientsecret" | base64
Y2xpZW50c2VjcmV0
---
apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
type: Opaque
stringData:
  dex.github.clientID: Y2xpZW50aWQ=
  dex.github.clientSecret: Y2xpZW50c2VjcmV0

如果你使用 kustomize build 构建并检查差异,它看起来像这样

$ kustomize build --load_restrictor none overlays/dev/ap-northeast-1/argocd | k diff -f -

+  dex.github.clientID: WTJ4cFpXNTBhV1E9
+  dex.github.clientSecret: WTJ4cFpXNTBjMlZqY21WMA==

我不明白为什么用 base64 编码的东西会被进一步编码。我要去寻求某人的帮助。

谢谢。

4

2 回答 2

0

实际上是秘密控制器对字符串进行编码。因此,您不能将编码字符串传递给 yaml。您需要将其保留为纯文本:

$ echo -n demo | base64
ZGVtbw==
$ echo -n ZGVtbw== | base64
WkdWdGJ3PT0=

$ kubectl create secret generic demo --from-literal=key=demo
secret/demo created
$ kubectl create secret generic demo2 --from-literal=key=ZGVtbw==
secret/demo2 created

$ kubectl get secret demo demo2 -oyaml
apiVersion: v1
items:
- apiVersion: v1
  data:
    key: ZGVtbw==        <- word demo got encoded
  kind: Secret
  metadata:
    creationTimestamp: "2020-06-04T13:41:27Z"
    name: demo
    namespace: default
    resourceVersion: "10118413"
    selfLink: /api/v1/namespaces/default/secrets/demo
    uid: bc39444c-e4f6-43ba-b151-705e15811831
  type: Opaque

- apiVersion: v1
  data:
    key: WkdWdGJ3PT0=    <- encoded string of demo got encoded further
  kind: Secret
  metadata:
    creationTimestamp: "2020-06-04T13:41:47Z"
    name: demo2
    namespace: default
    resourceVersion: "10118469"
    selfLink: /api/v1/namespaces/default/secrets/demo2
    uid: 2fe63343-06b4-4f47-94cd-9fe8e12fb388
  type: Opaque
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

注意:这并不总是这样。它实际上可以再次改变。过去,你必须对其进行编码,然后你不能,然后再次......

于 2020-06-04T13:50:24.463 回答
0

我复制了您的案例,看起来它不是由kustomize而是由kubectl进一步编码的(由kubectl客户端本身或通过kube-apiserver执行例如kubectl apply命令请求的操作)。

在这里你可以找到一个片段,它揭示了为什么会发生这种情况:

Secret 包含两个地图:datastringData。该data字段用于存储使用 base64 编码的任意数据。提供该stringData 字段是为了方便,并允许您将秘密数据提供为未编码的字符串。

data字段用于存储已经使用 base64 编码的数据,并且当我们应用Secret. 然而,stringData行为完全不同。它允许您以未编码字符串的形式提供秘密数据,因此在您运行时会对其进行进一步编码kubectl apply。在您的示例中,您使用stringData字段,尽管它包含已经编码的数据,但它被视为任何其他字符串,因此会再次编码。

解决方案:只需在您的中使用data而不是stringData映射,Secret并且您的 base64 编码字符串在资源创建期间不会再次编码。

于 2020-06-04T13:09:22.533 回答