
postfinance/vault-kubernetes-synchronizer该镜像提供与Vault集成的工具,用于在Kubernetes环境中实现Vault认证、密钥同步及令牌管理。基于Seth Vargo的vault-kubernetes-authenticator项目,支持三种核心场景:获取一次性Vault令牌、同步Vault密钥至Kubernetes密钥、以及为Pod生命周期内提供持续有效的Vault令牌。
启动初始化容器vault-kubernetes-authenticator向Vault认证并获取令牌,该令牌将在指定TTL后过期,适用于一次性密钥访问场景。
先通过vault-kubernetes-authenticator认证获取令牌,再启动vault-kubernetes-synchronizer初始化容器,将Vault密钥同步至Kubernetes密钥,适用于需要在Kubernetes中持久化使用Vault密钥的场景。
通过vault-kubernetes-authenticator初始化容器获取令牌,再启动vault-kubernetes-token-renewer边车容器定期续期令牌,确保Pod运行期间令牌持续有效。
通过以下环境变量配置Vault客户端,最小配置需包含VAULT_ADDR(建议配合VAULT_SKIP_VERIFY=true用于测试环境):
VAULT_ADDR:Vault服务地址VAULT_CACERT:CA证书路径VAULT_CAPATH:CA证书目录VAULT_CLIENT_CERT:客户端证书路径VAULT_CLIENT_KEY:客户端密钥路径VAULT_CLIENT_TIMEOUT:客户端超时时间VAULT_SKIP_VERIFY:是否跳过TLS验证(布尔值)VAULT_TLS_SERVER_NAME:TLS服务器名称VAULT_WRAP_TTL:包装令牌TTLVAULT_MAX_RETRIES:最大重试次数VAULT_TOKEN:Vault令牌VAULT_MFA:MFA配置VAULT_RATE_LIMIT:速率限制vault-kubernetes-authenticator用于向Vault认证并获取令牌,存储至指定路径供后续使用。
VAULT_ROLE:必填,用于认证的Vault角色名称VAULT_TOKEN_PATH:令牌存储路径(通常为共享卷)VAULT_AUTH_MOUNT_PATH:Kubernetes认证方法挂载路径(默认:kubernetes)SERVICE_ACCOUNT_TOKEN_PATH:Kubernetes服务账户JWT令牌路径(默认:/var/run/secrets/kubernetes.io/serviceaccount/token)ALLOW_FAIL:认证失败时是否允许容器成功终止(默认:false,需后续容器处理无令牌场景)bash# 查看容器日志 $ k logs vault-kubernetes-authenticator-5675d58d95-4wd8v -c vault-kubernetes-authenticator 2018/11/26 14:56:29 successfully authenticated to vault 2018/11/26 14:56:29 successfully stored vault token at /home/vault/.vault-token # 验证令牌 $ k exec -ti vault-kubernetes-authenticator-5675d58d95-4wd8v sh ~ $ VAULT_TOKEN=$(cat /home/vault/.vault-token) ~ $ echo $VAULT_TOKEN 8Pj0EzFLWQv8uWcjbP9hF1MB
vault-kubernetes-synchronizer依赖vault-kubernetes-authenticator,将Vault密钥同步至Kubernetes密钥,支持密钥映射、编码处理及标签管理。
| 映射格式 | Vault密钥路径 | Kubernetes密钥名称 |
|---|---|---|
secret/k8s/first | secret/k8s/first | first |
secret/k8s/first:third | secret/k8s/first | third |
secret/k8s/ | secret/k8s/first | first |
secret/k8s/second | second |
Kubernetes中的标签/名称需符合RFC-1123规范。
若Vault中存储的是二进制数据(如Java KeyStore),需使用base64编码并添加前缀base64:。例如:
bash# 创建Vault密钥(包含base64编码数据) echo "base64:$(base64 -w0 filename)" | vault kv put secret/k8s/jks keystore=-
同步器会自动解码base64:前缀的内容,避免双重编码。
VAULT_TOKEN_PATH:令牌存储路径(与认证容器共享)VAULT_SECRETS:逗号分隔的Vault密钥路径列表(支持上述映射格式)SECRET_PREFIX:Kubernetes密钥名称前缀(如v3t_,则Vault密钥first同步为v3t_first)SYNCHRONIZER_ANNOTATION:用于标记同步器管理的密钥的注解(默认:vault-secret)SYNCHRONIZER_LABELS:添加到同步密钥的标签(格式:k1=v1,k2=v2,重复键会覆盖)vault-kubernetes-authenticator认证失败且ALLOW_FAIL=true:
VAULT_SECRETS对应的Kubernetes密钥是否已存在,存在则继续,缺失则失败Vault中存在两个密钥:
bash$ vault kv get secret/k8s/first ====== Metadata ====== ... === Data === Key Value --- ----- one *** two 23456781 $ vault kv get secret/k8s/second ====== Metadata ====== ... ===== Data ===== Key Value --- ----- green *** poison ivy
配置同步参数:
yaml# deployment.yaml 片段 env: - name: VAULT_SECRETS value: "secret/data/k8s/first,secret/data/k8s/second"
同步后验证:
bash$ k get secrets | grep -e first -e second first Opaque 2 16m second Opaque 2 16m $ k describe secret first Name: first Namespace: vault-test Annotations: vault-secret=secret/data/k8s/first Type: Opaque Data ==== one: 8 bytes two: 8 bytes
vault-kubernetes-token-renewer依赖vault-kubernetes-authenticator,定期续期Vault令牌,确保Pod生命周期内令牌有效。
VAULT_TOKEN_PATH:令牌存储路径(与认证容器共享)VAULT_REAUTH:令牌无效时是否重新认证(默认:false,需同时提供认证容器的环境变量)VAULT_TTL:请求的令牌TTL(Vault可能覆盖此值)bash# 查看认证容器日志 $ k logs vault-kubernetes-token-renewer-844488f7bc-c6ztf -c vault-kubernetes-authenticator 2018/11/26 14:56:30 successfully authenticated to vault 2018/11/26 14:56:30 successfully stored vault token at /home/vault/.vault-token # 查看边车容器日志 $ k logs vault-kubernetes-token-renewer-844488f7bc-c6ztf -c vault-kubernetes-token-renewer 2018/11/26 14:56:32 start renewer loop 2018/11/26 14:56:32 token renewed
permission denied时,需为服务账户添加sys/mounts路径的read权限:
hclpath "sys/mounts" { capabilities = ["read"] }
strconv.Atoi: parsing "": invalid syntax时,需启用KV引擎版本:
bashvault secrets enable -version=2 kv # 启用v2版本 vault kv enable-versioning secret/ # 为现有路径启用版本控制


manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务