想象一个这样的秘密:
apiVersion: v1
kind: Secret
metadata:
name: {{ include "test-cicd.fullname" . }}
labels:
app.kubernetes.io/name: {{ include "test-cicd.name" . }}
helm.sh/chart: {{ include "test-cicd.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
type: Opaque
data:
secret.yaml: |
{{ if eq .Values.env "prod" }}
foo: bar-prod
foo2: bar2_prod
{{ else if eq .Values.evn "dev" }}
foo: bar-dev
{{ end }}有没有可能用Kubeseal封住它?现在这样做,我得到了invalid map key: map[interface {}]interface {}{"include \"test-cicd.fullname\" .":interface {}(nil)},这可能是因为它不是一个“有效”的yaml文件。
我尝试过的一件事是: 1.删除helm模板行2.生成sealedsecret 3.使用helm模板化sealedsecret
但是通过这样做,集群端操作员无法在部署时解密sealedsecret。
发布于 2019-10-08 06:57:52
mkmik在Github上回答了我的问题,所以我在这里也引用它作为记录。
因此,您正在使用客户端模板组成一个保密值。您的secret.yaml文件的某些部分是保密的,但是这些部分必须是模板指令( if),因此不能加密。
您有两个选择:
此答案的其余部分假设您选择了选项(2)
现在,既然您决定使用Helm,您就必须处理这样一个事实,即helm模板不是json/yaml文件,而是Go模板,因此它们不能被设计用于操纵结构化数据格式的工具操纵。
幸运的是,kubeseal有一个--raw命令,它允许您对各个秘密值进行加密,并手动将它们转换为您用来描述k8s资源的任何文件格式。
因此,假设您想要为SealedSecrets资源创建一个Helm模板,该模板将名称和标签值作为参数,并根据布尔prod/dev参数选择要放入的秘密,此示例可能适用于您:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: {{ include "test-cicd.fullname" . }}
annotations:
# this is because the name is a deployment time parameter
# consider also using "cluster-wide" if the namespace is also a parameter
# please make sure you understand the implications, see README
sealedsecrets.bitnami.com/namespace-wide: "true"
labels:
app.kubernetes.io/name: {{ include "test-cicd.name" . }}
helm.sh/chart: {{ include "test-cicd.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
type: Opaque
spec:
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "test-cicd.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
encryptedData:
{{ if eq .Values.env "prod" }}
foo: AgASNmKx2+QYbbhSxBE0KTa91sDBeNSaicvgBPW8Y/q/f806c7lKfF0mnxzEirjBsvF67C/Yp0fwSokIpKyy3gXtatg8rhf8uiQAA3VjJGkl5VYLcad0t6hKQyIfHsD7wrocm36uz9hpH30DRPWtL5qy4Z+zbzHj8AvEV+xTpBHCSyJPF2hyvHXTr6iQ6KJrAKy04MDwjyQzllN5OQJT2w4zhVgTxXSg/c7m50U/znbcJ1x5vWLXLSeiDRrsJEJeNoPQM8OHmosf5afSOTDWQ4IhG3srSBfDExSFGBIC41OT2CUUmCCtrc9o61LJruqshZ3PkiS7PqejytgwLpw/GEnj2oa/uNSStiP9oa9mCY6IUMujwjF9rKLIT456DlrnsS0bYXO2NmYwSfFX+KDbEhCIVFMbMupMSZp9Ol2DTim5SLIgIza/fj0CXaO3jGiltSQ0aM8gLSMK9n3c1V+X5hKmzMI3/Xd01QmhMmwqKp+oy21iidLJjtz67EiWyfIg1l7hiD5IIVlM9Gvg3k67zij5mOcXPkFnMmUQhQWxVKgAf4z8qEgprt03C+q+Wwwt25UDhQicpwoGtVQzU5ChJi09ja5LeW4RrvDf2B5KRp9HXoj1eu93MMl1Kcnx+X7uVT5OqQz28c4wOLT4FDItFzh8zREGZbiG/B3o1vI8MmwvxXj++pQ7SfBxoz9Xe8gmQ7BuXno=
foo2: AgAkaTBYcESwogPiauZ15YbNldmk4a9esyYuR2GDt7hNcv+ycPLHmnsJcYs0hBtqucmrO3HbgCy/hQ6dMRCY12RA7w7XsFqNjZy3kavnhqwM6YkHntK2INwercRNQpO6B9bH6MxQTXcxfJbPqaPt30iTnTAhtpN47lueoyIoka4WWzwG/3PAikXhIlkTaq0hrclRJHRqg4z8Kmcaf5A/BRL2xX8syHbjA7MK9/OoK+zytv+LGrbLLHUtuhNNNQ2PG9u05rP6+59wRduQojEDtB9FTCa+daS+04/F4H1vi6XUNnjkK+Xna1T2Eavyuq2GieKj/7ig96et/4HoTAz44zwVhh8/pk0IFC8srcH3p+rFtZZmjvbURrFahEjFZbav3BDMBNhrU8SI3MDN0Abiyvz4vJJfSxIYcyLD1EQ507q7ZXrqYN/v1EiYgYUACi0JGxSWHB9TlCkZOAdCl+hroXEhBN2u5utLJ12njBQJ8ACNQDOYf+CmtV0y7foCZ6Aaap0pV7a8twyqK8c17kImzfi102Zel8ALfLAzdAXBV9c1+1pH76turnTCE33aSMQlaVF3VTmFQWqB8uIO/FQhZDPo8u/ki3L8J31nepup4/WE7i59IT0/9qGh2LKql4oAv6v4D7qtKziN6DvG7bsJlj14Dln0roiTfTWEEnBqdDER+GKZJlKayOWsPQdN0Wp+2KVfwLM=
{{ else if eq .Values.evn "dev" }}
foo: AgAkaTBYcESwogPi..........
{{ end }}另一种方法是使用两个模板,一个用于prod,另一个用于dev,并使用Helm模板逻辑根据您要部署到的环境来选择正确的文件。
无论如何,这些base64 blobs中的每一个都可以用以下命令生成:
$ kubeseal --raw --scope namespace-wide --from-file=yoursecret.txtPro-tip,如果秘密不在文件中,你可以通过管道传递它:
$ echo -n yoursecret | kubeseal --raw --scope namespace-wide --from-file=/dev/stdin然后,您必须将该命令的输出粘贴到Helm Go模板中。
发布于 2021-04-14 18:25:30
我的方法
对于不同的environments
kubeseal --raw对各个密钥进行加密,然后将它们写入值文件中
我在上面写了一个要点:https://gist.github.com/foogunlana/b75175b4ff62bc07258ea78274c698cd
发布于 2020-10-14 16:36:28
我不会将来自不同环境的凭据放入单个密钥中,因为它可以部署到具有不同密封控制器的不同集群中。
为什么不把每个环境的秘密文件分开呢?
为了封存一个秘密,我使用以下命令:
kubeseal --name=name-of-the-config --controller-namespace=fluxcd \
--controller-name=sealed-secrets --format yaml \
< secret.yaml > sealedsecret.yaml您可以通过以下方式检测helm版本的控制器名称和控制器名称空间:
kubectl get HelmRelease -A -o jsonpath="{.items[?(@.spec.chart@.name=='sealed-secrets')]}"https://stackoverflow.com/questions/58161224
复制相似问题