
postfinance/vault-kubernetes-token-renewervault-kubernetes-authenticator是一个用于Kubernetes环境与Vault集成的工具镜像,提供初始化容器(Init Container)和Sidecar容器,实现Vault令牌获取、Vault密钥同步至Kubernetes密钥以及令牌续期功能,保障Pod在生命周期内安全访问Vault资源。
vault-kubernetes-authenticator向Vault进行身份验证,获取一次性使用的Vault令牌。vault-kubernetes-synchronizer将Vault密钥同步至Kubernetes密钥,并支持标签管理和过期密钥清理。vault-kubernetes-token-renewer定期续期Vault令牌,确保Pod生命周期内令牌有效。启动初始化容器vault-kubernetes-authenticator向Vault进行身份验证并获取令牌,令牌将在指定TTL后过期,适用于一次性访问Vault的场景。
先通过vault-kubernetes-authenticator获取Vault令牌,再启动vault-kubernetes-synchronizer将指定Vault密钥同步为Kubernetes密钥,支持密钥映射、编码处理及标签管理。
先通过vault-kubernetes-authenticator获取令牌,再启动Sidecar容器vault-kubernetes-token-renewer定期续期令牌,确保Pod运行期间令牌持续有效。
vault-kubernetes-token-renewer续期失败时(restartPolicy=always),容器将重启。若令牌已过期无法续期,需重启Pod由vault-kubernetes-authenticator重新获取令牌。VAULT_REAUTH=true,令牌续期失败时将重新认证,此时需确保提供vault-kubernetes-authenticator所需的所有认证环境变量,且令牌消费者需支持重新读取令牌文件。支持通过环境变量配置Vault客户端,常用变量如下:
VAULT_ADDR:Vault服务器地址VAULT_CACERT:CA证书路径VAULT_SKIP_VERIFY:是否跳过TLS验证(默认false)VAULT_TOKEN:Vault令牌VAULT_ROLE:用于身份验证的Vault角色名称最小配置需设置
VAULT_ADDR,若未配置TLS验证,需设置VAULT_SKIP_VERIFY=true。
用于向Vault进行身份验证并获取令牌,存储至指定路径供其他容器使用。
| 环境变量 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|
VAULT_ROLE | 用于身份验证的Vault角色名称 | 是 | - |
VAULT_TOKEN_PATH | 存储令牌的磁盘路径(通常为共享卷) | 否 | - |
VAULT_AUTH_MOUNT_PATH | Vault中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-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、secret/k8s/second | first、second |
Kubernetes密钥名称和标签需符合RFC-1123规范。
若Vault中存储的是二进制数据(如Java KeyStore),需使用base64编码并添加前缀base64:。例如:
bash# 生成Vault密钥内容 echo "base64:$(base64 -w0 filename)"
同步时会自动解码,避免双重编码。
| 环境变量 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|
VAULT_TOKEN_PATH | 存储令牌的磁盘路径(与vault-kubernetes-authenticator共享) | 是 | - |
VAULT_SECRETS | 待同步的Vault密钥列表,逗号分隔(遵循密钥映射规则) | 是 | - |
SECRET_PREFIX | Kubernetes密钥名称前缀(如v3t_,则Vault密钥first同步为v3t_first) | 否 | - |
SYNCHRONIZER_ANNOTATION | 用于标记同步生成的Kubernetes密钥的注解键名 | 否 | 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 === Data === Key Value --- ----- one *** two 23456781 $ vault kv get secret/k8s/second === 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-authenticator获取的令牌,定期续期Vault令牌,确保Pod生命周期内令牌有效。
| 环境变量 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|
VAULT_TOKEN_PATH | 存储令牌的磁盘路径(与vault-kubernetes-authenticator共享) | 是 | - |
VAULT_REAUTH | 令牌无效时是否重新认证(需提供vault-kubernetes-authenticator的认证环境变量) | 否 | 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 # Sidecar容器日志 $ 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
基于Seth Vargo的工作。


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