如何使用 helm 将密码从 vault 获取到我的 jenkins 配置作为代码安装?

How to fetch secrets from vault to my jenkins configuration as code installation with helm?

我正在尝试使用带有 JCASC 的 helm 来部署 Jenkins 以获取保管库机密。我正在使用本地 minikube 在我的机器中创建 mi k8 集群和本地 vault 实例(不在 k8 集群中)。

即使我正在尝试使用 initContainerEnvContainerEnv,我也无法达到保险库值。对于 CASC_VAULT_TOKEN 值,我使用 vault 根令牌。 这是 helm 命令 i 运行 在本地:

helm upgrade --install -f values.yml mijenkins jenkins/jenkins

这是我的 values.yml 文件代码:

controller:
  installPlugins:
    # need to add this configuration-as-code due to a known jenkins issue: https://github.com/jenkinsci/helm-charts/issues/595
  - "configuration-as-code:1414.v878271fc496f"
  - "hashicorp-vault-plugin:latest"

  # passing initial environments values to docker basic container
  initContainerEnv:
  - name: CASC_VAULT_TOKEN
    value: "my-vault-root-token"
  - name: CASC_VAULT_URL
    value: "http://localhost:8200"
  - name: CASC_VAULT_PATHS
    value: "cubbyhole/jenkins"
  - name: CASC_VAULT_ENGINE_VERSION
    value: "2"
  ContainerEnv:
  - name: CASC_VAULT_TOKEN
    value: "my-vault-root-token"
  - name: CASC_VAULT_URL
    value: "http://localhost:8200"
  - name: CASC_VAULT_PATHS
    value: "cubbyhole/jenkins"
  - name: CASC_VAULT_ENGINE_VERSION
    value: "2"

  JCasC:
    configScripts:
      here-is-the-user-security: |
        jenkins:
          securityRealm:
            local:
              allowsSignup: false
              enableCaptcha: false
              users:
                - id: "${JENKINS_ADMIN_ID}"
                  password: "${JENKINS_ADMIN_PASSWORD}"

在我的本地 vault 我可以 see/reach 值:

>vault kv get cubbyhole/jenkins
============= Data =============
Key                       Value
---                       -----
JENKINS_ADMIN_ID          alan
JENKINS_ADMIN_PASSWORD    acosta

你们中有人知道我可能做错了什么吗?

我没有将 Vault 与 jenkins 一起使用,所以我不确定您的具体情况,但我非常熟悉 Jenkins 掌舵图的挑剔程度,并且我能够配置我的 securityRealm(使用 Google 登录插件)通过首先使用所需的值创建一个 k8s 秘密:

kubectl create secret generic googleoauth --namespace jenkins \
  --from-literal=clientid=${GOOGLE_OAUTH_CLIENT_ID} \
  --from-literal=clientsecret=${GOOGLE_OAUTH_SECRET}

然后通过以下方式将这些值传递到 helm chart values.yml:

controller:
  additionalExistingSecrets:
  - name: googleoauth
    keyName: clientid
  - name: googleoauth
    keyName: clientsecret

然后像这样将它们读入 JCasC:

...
  JCasC:
    configScripts:
      authentication: |
        jenkins:
          securityRealm:
            googleOAuth2:
              clientId: ${googleoauth-clientid}
              clientSecret: ${googleoauth-clientsecret}

为了使其正常工作,values.yml 还需要包括以下设置:

serviceAccount:
  name: jenkins

rbac:
  readSecrets: true # allows jenkins serviceAccount to read k8s secrets

请注意,我是 运行 jenkins 作为 k8s serviceAccount 在命名空间 jenkins

中调用 jenkins

调试我的 jenkins 安装后,我发现主要问题不是我的 values.yml 也不是我的 JCASC 集成,因为如果我进入我的 jenkins pod,我能够看到 ContainerEnv 值:

kubectl exec -ti mijenkins-0 -- sh

所以我需要公开我的保险库服务器以便我的 jenkins 能够访问它,我使用这个 Vault tutorial 来实现它。其中,简而言之,而不是使用正常的: 保管库服务器-dev

我们需要使用:

vault server -dev -dev-root-token-id root -dev-listen-address 0.0.0.0:8200

然后我们需要为 Vault CLI 导出一个环境变量来寻址 Vault 服务器。

export VAULT_ADDR=http://0.0.0.0:8200

之后,我们需要确定要重定向我们的 jenkins ping 的保险库地址,为此我们需要启动一个 minukube ssh 会话:

minikube ssh

在此 SSH 会话中,检索 Minikube 主机的值。

$ dig +short host.docker.internal
192.168.65.2

检索值后,我们将检索 Vault 服务器的状态以验证网络连接。

$ dig +short host.docker.internal | xargs -I{} curl -s http://{}:8200/v1/sys/seal-status

现在我们可以将我们的 jenkins pod 与我们的保险库连接起来,我们只需要更改 CASC_VAULT_URL 以在我们的主 .yml 文件中使用 http://192.168.65.2:8200,如下所示:

  - name: CASC_VAULT_URL
    value: "http://192.168.65.2:8200"