Я пытаюсь развернуть Jenkins, используя руль с JCASC, чтобы получить секреты хранилища. Я использую локальный minikube
для создания mi k8
кластера и локальный vault
экземпляр на моей машине (не в k8
кластере).
Даже если я пытаюсь использовать initContainerEnv
и ContainerEnv
, я не могу достичь значений хранилища. Для значения CASC_VAULT_TOKEN
я использую корневой токен vault
.
Это helm
команда, которую я запускаю локально:
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
я могу видеть/достигать значения:
>vault kv get cubbyhole/jenkins
============= Data =============
Key Value
--- -----
JENKINS_ADMIN_ID alan
JENKINS_ADMIN_PASSWORD acosta
У кого-нибудь из вас есть идеи, что я могу делать неправильно?
Я не использовал Vault с jenkins, поэтому я не совсем уверен в вашей конкретной ситуации, но я очень хорошо знаком с тем, насколько привередлива диаграмма руля Jenkins, и я смог настроить свой securityRealm (с плагином Google Login), создав k8s secret со значениями, необходимыми в первую очередь:
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 с именем jenkins
в пространстве имен jenkins
После отладки моей установки jenkins я понял, что основная проблема не в моей values.yml
и не в моей интеграции JCASC, поскольку я смог увидеть значения ContainerEnv
, если я войду в свой модуль jenkins с помощью:
kubectl exec -ti mijenkins-0 -- sh
Поэтому мне нужно было открыть свой сервер хранилища, чтобы мои jenkins могли к нему добраться, я использовал этот Учебник по хранилищу для этого. Вкратце, вместо обычного: сервер хранилища -dev
Нам нужно использовать:
vault server -dev -dev-root-token-id root -dev-listen-address 0.0.0.0:8200
Затем нам нужно экспортировать переменную среды для интерфейса командной строки хранилища для обращения к серверу хранилища.
export VAULT_ADDR=http://0.0.0.0:8200
После этого нам нужно определить адрес хранилища, на который мы собираемся перенаправить наш пинг jenkins, для этого нам нужно запустить сеанс 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 к нашему хранилищу, нам просто нужно изменить CASC_VAULT_URL
, чтобы использовать http://192.168.65.2:8200
в нашем основном .yml
файле следующим образом:
- name: CASC_VAULT_URL
value: "http://192.168.65.2:8200"
На самом деле, чего я пытался добиться, так это прикоснуться к локальному серверу хранилища с моим кластером minikube, но с этой информацией, которой вы поделились, я понял, что проблема была не в моем коде, а на самом деле была связь между моим хранилищем и моим локальным кластером kubernetes. Я нашел решение, раскрывающее службу хранилища! Я поделюсь им в комментариях. СПАСИБО!