Velero 对接自签名证书对象存储:--cacert 信任链与 TLS 跳过机制全解析
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
当你使用以自签名证书提供 TLS 保护的 S3 兼容对象存储时,Velero 在备份、恢复或访问备份内容时会因无法验证证书链而连接失败。本文以 Velero 官方文档《Use Velero with a storage provider secured by a self-signed certificate》为主体,完整讲解安装期--cacert信任配置、客户端命令的证书解析链路、自定义 S3 服务器的 TLS 116 告警成因,以及--insecure-skip-tls-verify的适用边界,并结合当前仓库源码说明每个配置项的落点与底层实现,帮助你在自签名环境中正确、安全地打通对象存储 TLS。
一、问题背景:certificate signed by unknown authority
典型的故障现象是:对象存储(S3 兼容服务商或自建 MinIO 等)使用自签名证书或私有 CA 签发的证书时,Velero 与对象存储之间的 TLS 握手在客户端校验阶段失败,报错包含certificate signed by unknown authority。
原因很直接:Velero 默认只信任系统 CA 信任链,自签名证书不在其中。处理思路有两条,本文依次展开:
- 推荐:把签发该证书的 CA bundle 交给 Velero(安装期或客户端命令期),让 TLS 校验走私有信任链;
- 仅测试/开发:跳过对象存储的 TLS 证书校验(存在中间人攻击风险,文档明确不推荐用于生产)。
二、安装时信任自签名证书:velero install --cacert
在velero install命令中,通过--cacert标志提供 PEM 编码证书 bundle 的路径:
velero install \ --plugins <PLUGIN_CONTAINER_IMAGE [PLUGIN_CONTAINER_IMAGE]> \ --provider <YOUR_PROVIDER> \ --bucket <YOUR_BUCKET> \ --secret-file <PATH_TO_FILE> \ --cacert <PATH_TO_CA_BUNDLE>配置后,Velero 在后续备份与恢复过程中自动使用该 CA bundle 验证与存储提供商之间的 TLS 连接。
源码中的参数落点
- 标志定义在 install 命令:
--cacert帮助文本为 "File containing a certificate bundle to use when verifying TLS connections to the object store. Optional."; AsVeleroOptions()会读取该文件内容(见 install.go);- 读取到的证书数据最终写入 BackupStorageLocation 的
spec.objectStorage.caCert字段,见 resources.go 中CACert: caCert的赋值。
也就是说,安装期的--cacert并不是让 CLI 临时记住一份文件,而是把 CA bundle持久化进了 BSL 资源,集群内控制器、备份/恢复 Pod 之后都从 BSL 上取用。
三、BSL 上的证书字段:caCert与caCertRef
从 backupstoragelocation_types.go 可以看到ObjectStorageLocation定义了两个互斥字段:
// CACert defines a CA bundle to use when verifying TLS connections to the provider. // Deprecated: Use CACertRef instead. // +optional CACert []byte `json:"caCert,omitempty"` // CACertRef is a reference to a Secret containing the CA certificate bundle to use // when verifying TLS connections to the provider. The Secret must be in the same // namespace as the BackupStorageLocation. // +optional CACertRef *corev1api.SecretKeySelector `json:"caCertRef,omitempty"`要点:
caCert是内联证书字段,已被标记 Deprecated,文档与源码均建议改用caCertRef;caCertRef指向同一命名空间内一个 Secret(SecretKeySelector包含 Secret 名与 key),把证书与 BSL 资源解耦,便于更新与权限管理;- Validate() 显式校验"不能同时设置
caCert和caCertRef",两者都设置时返回错误cannot specify both caCert and caCertRef in objectStorage,对应的单测见 backupstoragelocation_types_test.go。
四、Velero 客户端访问自签名存储:--cacert标志
当你要用describe、download、logs类命令访问存放在自签名存储中的备份或恢复对象时,同样需要客户端信任该证书。文档给出的用法:
velero backup describe my-backup --cacert <PATH_TO_CA_BUNDLE>标志语义与 BSL 自动回退
从 backup/describe.go 的帮助文本可以确认语义细节:
Path to a certificate bundle to use when verifying TLS connections.If not specified, the CA certificate from the BackupStorageLocation will be used if available.
即:命令行--cacert是可选覆盖项。若不指定,客户端会自动去取 BSL 上配置的 CA 证书(通常就是第二章中安装期写入的那份)。客户端侧的证书提取逻辑集中在 bsl_cacert.go:
GetCACertFromBackup:按备份的spec.storageLocation找到 BSL,取出其 CA 证书;GetCACertFromRestore:先经restore.spec.backupName找到源备份,再走与备份相同的路径;GetCACertFromBSL:读取 BSL 时的优先级为caCertRef(Secret)优先,回退到内联caCert(deprecated);BSL 或备份不存在时返回空字符串而非致命错误,与测试用例 bsl_cacert_test.go 的断言一致。
velero backup download的完整链路可见 download.go:先调用cacert.GetCACertFromBackup取得 BSL 证书,再交给downloadrequest.StreamWithBSLCACert建流下载。客户端全局配置还支持通过环境变量/配置文件提供cacert键(config.go 中ConfigKeyCACert = "cacert"),免去每次输入路径。
五、自定义 S3 兼容服务器的 TLS 告警 116:服务端要求客户端证书
若你使用的是自建 S3 兼容服务器,备份可能失败并报出类似错误:
rpc error: code = Unknown desc = RequestError: send request failed caused by: Get https://minio.com:3000/k8s-backup-bucket?delimiter=%2F&list-type=2&prefix=: remote error: tls: alert(116)按文档解释:
- TLS 1.3(RFC 8446)附录 B.2 中告警码 116 表示
certificate required——服务端要求客户端出示证书; - Velero 作为客户端在 TLS 握手中不会携带客户端证书;
- 而 TLS 1.3 规范中,服务端校验客户端证书本是可选行为,因此正确做法是修改 S3 服务器端的配置,取消强制双向认证(mutual TLS),而不是在 Velero 侧"修复"。
这条排查路径值得单独成节:116 号告警与第一章的unknown authority成因完全不同——前者是服务端策略问题,后者才是客户端信任链问题,混淆二者会走弯路。
六、跳过 TLS 校验:--insecure-skip-tls-verify的适用边界
文档对此有明确的安全警告:--insecure-skip-tls-verify标志不安全、易受中间人攻击,仅面向本地/私有环境的测试与开发场景,不推荐在生产使用。
支持的命令清单
Velero 在以下命令上提供--insecure-skip-tls-verify(文档范围限定于 AWS provider 插件或文件备份 File System Backup 场景下访问对象存储):
velero backup describevelero backup downloadvelero backup logsvelero restore describevelero restore log
命令标志帮助文本同样强调风险,见 describe.go:"If true, the object store's TLS certificate will not be checked for validity. This is insecure and susceptible to man-in-the-middle attacks. Not recommended for production."
永久生效:BSL 的Spec.Config.InsecureSkipTLSVerify
若希望某对象存储永久跳过 TLS 校验,可在 BackupStorageLocation CRD 中把spec.config.InsecureSkipTLSVerify设为true。config是 BSL spec 上的通用map[string]string(见 backupstoragelocation_types.go),由 provider 插件与 Velero 共同解释。
服务端连接的实际行为
客户端下载备份内容时,该布尔值会直接进入 Go 的tls.Config:downloadrequest.go 中InsecureSkipVerify: insecureSkipTLSVerify(代码注释标注了 gosec 豁免理由:"This parameter is useful for some scenarios")。
文件备份场景的透传
Velero 的文件备份(File System Backup)通过 Restic 或 Kopia 在对象存储与集群磁盘之间搬运数据。当你在上述涉及文件备份的 Velero 操作指定--insecure-skip-tls-verify时,Velero 会把这个语义透传给底层工具:例如对 Restic,Velero 会给 Restic 命令追加全局参数--insecure-tls。这一点保证了"CLI 上的开关"与"实际执行数据搬运的工具"行为一致,避免 Velero 自身跳过了校验、而 Restic/Kopia 仍然校验失败的不一致状态。
七、选型建议小结
| 场景 | 推荐做法 | 依据 |
|---|---|---|
| 生产环境、自签名 S3 | velero install --cacert或 BSL 的caCertRef(Secret) | 第二、三章;caCert已废弃,优先caCertRef |
| 客户端 describe/download/logs 访问 | 不传--cacert时自动复用 BSL 证书;跨环境可用时显式传--cacert | bsl_cacert.go |
自建 S3 报tls: alert(116) | 修改服务端取消强制客户端证书 | 第五章 |
| 本地测试/开发 | --insecure-skip-tls-verify或 BSLconfig.InsecureSkipTLSVerify: true | 第六章;明确不用于生产 |
整体原则与文档一致:能用信任链就不用跳过校验;跳过 TLS 是面向测试场景的临时逃生门,其风险(中间人攻击)在备份这种"最后防线"型数据链路上尤其不可忽视。
【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考