【问题标题】:Create file for secret in pre-install hook在预安装挂钩中为机密创建文件
【发布时间】:2021-06-17 19:23:17
【问题描述】:

我有一个舵图,我需要在安装所有资源之前创建一个文件,以便能够将其存储在一个秘密中。我一直在阅读有关 Helm Hooks 的内容,我想我可以创建一个钩子,插入我的脚本文件,运行我的脚本并生成我需要的文件,我迷失的是如何将我的文件从 pod 中取出并插入作为一个秘密。

这些是我的钩子:

脚本的秘密钩子:

apiVersion: v1
kind: Secret
metadata:
  name: hlf-genesis-block
  namespace: hlf
  annotations:
    "helm.sh/hook": pre-install
    "helm.sh/hook-weight": "0"
    "helm.sh/hook-delete-policy": hook-succeeded
type: Opaque
data:
  createfile.sh: |-
    {{ .Files.Get "scripts/createfile.sh" | b64enc }}

工作挂钩:

apiVersion: batch/v1
kind: Job
metadata:
  name: "post-install-hook"
  annotations:
    "helm.sh/hook": post-install
    "helm.sh/hook-weight": "1"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      volumes:
      - name: scripts
        secret:
          secretName: scripts
      restartPolicy: Never
      containers:
      - name: channel-config
        image: "ubuntu:20.04"
        command: ["bash", "-c", "
                domainname=\"{{ .Values.domainName }}\"
                ./createfile.sh \"$domainname\"
              "]
        volumeMounts:
        - mountPath: /home/
          name: scripts
          readOnly: true

最终机密文件:

apiVersion: v1
kind: Secret
metadata:
  name: hlf-genesis-block
  namespace: hlf
type: Opaque
data:
  secret.txt: |-
    {{ .Files.Get "generatedfile.txt" | b64enc }}

我在想也许像在工作中使用类似这样的东西来分配一个变量:

{{ $secret := echo generatedfile.txt }}

但是我还没有找到它的功能,或者暂时映射一个卷,但即使这样我也无法弄清楚如何从我的工作或临时存储中取出秘密,作为 . Files.Get 从运行 kubectl 的地方工作...

或者也许从作业内部运行 kubectl 来创建秘密?虽然那样我将无法在卸载时删除秘密。

任何想法都会很棒。

谢谢

编辑:

是否可以通过修改映射的秘密卷来修改秘密值?我要试试。

【问题讨论】:

    标签: kubernetes-helm


    【解决方案1】:

    我建议重用 https://github.com/helm/charts/tree/master/stablehttps://github.com/bitnami/charts 以重用现有解决方案

    Helm Template https://github.com/bitnami/charts/blob/master/bitnami/rabbitmq/templates/secrets.yaml 使用 randAlphaNum 模板函数 https://helm.sh/docs/chart_template_guide/function_list/#randalphanum-randalpha-randnumeric-and-randascii 生成秘密。

    每次运行 helm install/upgrade 命令时 randAlphaNum 生成新密钥的问题由 https://github.com/helm/helm/issues/3053#issuecomment-782837107 使用查找模板函数 https://helm.sh/docs/chart_template_guide/functions_and_pipelines/#using-the-lookup-function 解决。下面的代码是从https://github.com/helm/helm/issues/3053#issuecomment-782837107复制而来的

    apiVersion: v1
    kind: Secret
    metadata:
      name: foobar-secret
    type: Opaque
    {{- $previous := lookup "v1" "Secret" .Release.Namespace "foobar-secret" }}
    data:
      {{- if $previous }}
      foobarPassword: {{ $previous.data.foobarPassword }}
      {{- else if .Values.foobarPassword }}
      foobarPassword: {{ .Values.foobarPassword | b64enc | quote }}
      {{- else }}
      foobarPassword: {{ randAlphaNum 40 | b64enc | quote }}
      {{- end }}
    

    编辑:

    初始化 Demo Pod 定义:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-initialization/

    apiVersion: v1
    kind: Pod
    metadata:
      name: init-demo
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: channel-config
          mountPath: /run/channel-config
      # These containers are run during pod initialization
      initContainers:
      - name: channel-config
        image: "ubuntu:20.04"
        command: ["bash", "-c", "cd /run/channel-config && ./createfile.sh \"{{ .Values.domainName }}\""]
        volumeMounts:
        - name: channel-config
          mountPath: "/run/channel-config"
      dnsPolicy: Default
      volumes:
      - name: channel-config
        emptyDir: {}
    

    【讨论】:

    • 嗨@sagar-velankar 谢谢你的回答,但我的问题是我需要运行一个脚本来生成秘密,我不知道如何将秘密从吊舱中取出创建它之后的秘密,我正在考虑使用 pod 中的 kubectl 补丁秘密,但我想找到一种更“掌舵风格的方式”来生成它。我要检查图表,不过谢谢
    • 好的。对不起,我不明白你的问题。您可以使用 initContainer 运行脚本 createfile.sh 以在也由主容器安装的 emptyDir Volume 中生成密码吗?示例是 kubernetes.io/docs/tasks/configure-pod-container/… 。我将使用 init Demo Pod Definition 编辑答案。 Init Containers 需要在主容器启动之前完成。
    • hmmm 这可以工作,但我实际上需要它来更新 2 个部署,而且我认为文件最终不会对两者相同,我认为它有一些时间标记。这个案例是一个超级账本结构区块链,我正在创建它的创世块的文件,在创建它之后,orderer1 和 orderer2 的 2 个不同部署使用它。我可以使用作业创建它并在它们之间共享一个存储,但我更喜欢存储的秘密。
    • 你知道我不知道 initContainers 选项真的很酷,谢谢
    【解决方案2】:

    使用存储是一个很好的解决方案,但为了完整起见,这是我使用秘密的方式:

    我用虚假的值创建了最终的秘密

    apiVersion: v1
    kind: Secret
    metadata:
      name: hlf-genesis-block
      namespace: hlf
    type: Opaque
    data:
      secret.txt: {{ "empty" | b64enc }}
    

    然后我创建了一个角色和一个角色绑定,以便能够修改作业中的秘密

    角色:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: update-secrets
      namespace: hlf
    rules:
      - apiGroups:
          - ""
        resources:
          - secrets
        verbs:
          - get
          - patch
    

    角色绑定:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: update-secrets
      namespace: hlf
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: update-secrets
    subjects:
      - kind: ServiceAccount
        name: default
        namespace: hlf
    

    最后我没有使用钩子,因为作业运行速度比我需要映射一些持久卷并更改命令的部署快得多,如下所示:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: "genesis-job"
    spec:
      template:
        spec:
          volumes:
          - name: scripts
            secret:
              secretName: scripts
          restartPolicy: Never
          containers:
          - name: channel-config
            image: "myrepo/fabric-tools-with-k8s"
            command: ["bash", "-c", "./createfile.sh \"{{ .Values.domainName }}\" && cat genesis.block | base64 > encoded.block  && genesis=$(cat encoded.block | tr -d '\n') && patch="[{\"op\":\"replace\",\"path\":\"/data/genesis.block\",\"value\":\"$genesis\"}]" && kubectl patch secret hlf-genesis-block --type=json -p="$patch""]
            volumeMounts:
            - mountPath: /home/
              name: scripts
              readOnly: true
    

    【讨论】:

    • 您可以使用名为 init 的安装前钩子作业来创建密钥,并使用另一个名为 cleanup 的删除后钩子作业来删除密钥。然后你不必担心在创建秘密之前创建部署。另外我建议将 resourceName = secretname 添加到 ClusterRole 以获得更好的安全性kubernetes.io/docs/reference/access-authn-authz/rbac/… 并为作业使用新的服务帐户以避免授予默认服务帐户权限
    • 好建议,我会这样改,谢谢
    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2020-09-19
    • 2016-02-05
    相关资源
    最近更新 更多