Ошибка авторизации при использовании vault-webhook от bank-vault с типом inject
Возможно кто-то как и я использует в своих кластерах vault secret webhook от bank-vault для создания сущностей вроде configMaps или Secrets из волта. Есть еще один режим работы - Inject, при котором вебхук мутирует манифест сущности pod и "спавнит" процесс оборачивая запуск в свой бинарь, например если вы запускаете условный "yarn start", то после мутации это будет выглядеть как "/vaut/vault-env yarn start". Переменные будут не видны в env, только если внутри контейнера посмотреть их через этот бинарь /vault/vault-env.
И порой, если используется например несколько контейнеров в поде и все они из внутренних приватных registry, причем из разных, а следовательно и для пуллинга будет использоваться разные imagePullSecrets можно встретить ошибку:
Error creating: Internal error occurred: failed calling webhook "pods.vault-secrets-webhook.admission.banzaicloud.com": failed to call webhook: an error on the server ("{\"kind\":\"AdmissionReview\",\"apiVersion\":\"admission.k8s.io/v1beta1\",\"response\":{\"uid\":\"8f38f2a7-90dd-4d43-a7b5-dd93b5065cf3\",\"allowed\":false,\"status\":{\"metadata\":{},\"status\":\"Failure\",\"message\":\"could not mutate object: <object> UNAUTHORIZED: HTTP Basic: Access denied.
Это происходит из-за того, что "хук" не умеет читать массив, заданный в imagePullSecret секции, он просто берет первый элемент и пытается с ним идти в regsitry, а идет он туда только в том случае, если в манифесте явно не указан command. Вебхуку нужно как-то понимать какой процесс (команду) спавнить, следовательно, если этого нет в манифесте, то он берет imagePullSecret (первый элемент в массиве) и идет в registry, чтобы получить манифет образа и достать command (entrypoint) оттуда. Тут то и происходит ошибка, если у нас в поде два контейнера, креды к которым надо брать из разных секретов, описанных в imagePullSecert.
Решение достаточно простое, для подобных кейсов указывать в манифесте явно команду запуска контейнера, тогда веб-хуку не нужно будет идти в registy и данной ошибки не будет, да и скорость развертывания будет выше, так как мы убирает лишний HTTP вызов.
#kubernetes
Post #105
26