如何使用 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
集群中)。
即使我正在尝试使用 initContainerEnv
和 ContainerEnv
,我也无法达到保险库值。对于 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"
我正在尝试使用带有 JCASC 的 helm 来部署 Jenkins 以获取保管库机密。我正在使用本地 minikube
在我的机器中创建 mi k8
集群和本地 vault
实例(不在 k8
集群中)。
即使我正在尝试使用 initContainerEnv
和 ContainerEnv
,我也无法达到保险库值。对于 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"