ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Velero 实战:将 Minio 暴露到集群外部,让 `velero logs` 与 `velero describe` 的预签名 URL 可访问

Velero 实战:将 Minio 暴露到集群外部,让 `velero logs` 与 `velero describe` 的预签名 URL 可访问 Velero 实战将 Minio 暴露到集群外部让velero logs与velero describe的预签名 URL 可访问【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero当你运行velero backup describe、velero logs或velero restore describe等命令获取备份日志与详情时Velero 服务端会生成一个预签名 URLpre-signed URL用于从对象存储中下载对应的备份内容。在官方快速上手示例中备份存储使用的是运行在集群内部的 Minio其默认 Service 类型为ClusterIP因此这些预签名 URL 只能从集群内部访问而 Velero 客户端运行在集群外无法直接下载。本指南以仓库文档 expose-minio.md 为主线完整讲解两种将 Minio 暴露到集群外的方案Service 类型改为NodePort、使用 Ingress并深入解析 Velero 0.10 起引入的publicUrl配置项在备份存储配置BackupStorageLocation中的作用与底层实现。读完本文你将能够在自己搭建的 Minio Velero 实验环境中让所有日志与详情下载链接在集群外正常访问。背景为什么必须把 Minio 暴露到集群外在 get-started.md 描述的快速上手示例中Velero 服务端与 Minio 均部署在集群内Minio 的 Service 默认是ClusterIP类型——这意味着它只对集群内部可达。其 YAML 位于 examples/minio/00-minio-deployment.yaml文件中对应的 Service 定义片段如下apiVersion: v1 kind: Service metadata: namespace: velero name: minio labels: component: minio spec: # ClusterIP is recommended for production environments. # Change to NodePort if needed per documentation, # but only if you run Minio in a test/trial environment, for example with Minikube. type: ClusterIP ports: - port: 9000 targetPort: 9000 protocol: TCP selector: component: minio该文件同时部署了 Minio 的 Deploymentminio/minio:latest默认端口 9000访问密钥minio/minio123以及一个minio-setupJob使用minio/mc客户端创建velerobucket。源码注释明确提示ClusterIP仅推荐用于生产环境若要按文档把 Minio 暴露到集群外应改为NodePort且只建议在测试/试用环境例如 Minikube下这样做。这里的关键机制是当你执行获取日志或描述备份的命令时Velero 服务端会调用对象存储插件生成预签名 URL来下载所需对象。从源码可见这一能力由对象存储接口的CreateSignedURL方法提供pkg/persistence/object_store.go备份内容、备份日志、卷快照、资源列表、恢复日志等对象均通过它生成下载链接return s.objectStore.CreateSignedURL(s.bucket, s.layout.getBackupLogKey(target.Name), DownloadURLTTL)而该接口在 gRPC 插件框架中也有对应实现pkg/plugin/framework/object_store_client.go 与 object_store_server.go。对于 S3 兼容存储包括 Minio预签名 URL 的域名部分取自存储配置中的s3Url或publicUrl。若 Minio 只以ClusterIP存在于集群内客户端拿到的 URL 自然无法从集群外解析。因此要访问这些 URL就必须把 Minio 暴露到集群外部。文档给出了两种方式将 Minio 的 Service 类型从ClusterIP改为NodePort为集群配置 Ingress同时保持 Minio 的 Service 类型为ClusterIP。此外从 Velero 0.10 开始还可以在备份存储配置中为预签名 URL 指定一个新的publicUrl字段值详见下文“理解publicUrl配置”一节。方案一通过 NodePort 类型的 Service 暴露 Minio如果你的 Velero 客户端可以直连集群节点例如运行在 Minikube 或能访问节点 IP/DNS 的环境中将 Minio Service 改为NodePort是最直接的做法。第 1 步修改 Service 类型在 examples/minio/00-minio-deployment.yaml 中把 Service 的spec.type从ClusterIP改为NodePortspec: type: NodePort ports: - port: 9000 targetPort: 9000 protocol: TCP修改后重新应用该文件或将改动固化到自己的集群清单中kubectl apply -f examples/minio/00-minio-deployment.yaml第 2 步获取 Minio 的对外 URL根据运行环境不同获取方式有所区别。如果使用 Minikube可以直接使用其内置命令获取 URLminikube service minio --namespacevelero --url该命令会输出类似http://192.168.49.2:3xxxx的完整可访问地址。其他环境需要分两步手动拼接获取集群中任意一个节点的外部 IP 地址或 DNS 名称该地址必须能被 Velero 客户端所在机器访问将该地址与 Minio Service 的 NodePort 拼接成完整 URL。NodePort 可通过以下命令取得kubectl -n velero get svc/minio -o jsonpath{.spec.ports[0].nodePort}例如节点 IP 为192.168.1.100、NodePort 为31567则 Minio 的对外 URL 为http://192.168.1.100:31567。第 3 步将 Minio URL 写入publicUrl在 examples/minio/05-backupstoragelocation.yaml该文件来自 v0.11.0 发行版 tarball当前仓库examples/minio/目录下仅保留00-minio-deployment.yaml因此在实际操作中可改为直接编辑集群内的BackupStorageLocation资源见下文中取消publicUrl一行的注释填入上一步得到的 Minio URL。必须包含http://或https://前缀spec: provider: aws objectStorage: bucket: velero config: region: minio s3ForcePathStyle: true s3Url: http://minio:9000 publicUrl: http://192.168.1.100:31567在“当前仓库”中配置publicUrl的等价做法由于当前仓库的examples/minio/下只有00-minio-deployment.yaml且新版 Velero 均通过BackupStorageLocationCRDshortName 为bsl管理存储配置你可以用以下两种方式设置publicUrl方式一直接编辑集群内的 BSL 资源kubectl edit backupstoragelocation default -n velero在spec.config下新增publicUrl键值spec: config: region: minio s3ForcePathStyle: true s3Url: http://minio:9000 publicUrl: http://192.168.1.100:31567方式二使用kubectl patch就地更新适合脚本化/自动化场景kubectl patch -n velero backupstoragelocation default --type merge \ -p {spec:{config:{publicUrl:http://192.168.1.100:31567}}}BackupStorageLocation的 CRD 定义位于 config/crd/v1/bases/velero.io_backupstoragelocations.yaml其中spec.config被声明为 provider 专用的配置字段map[string]string类型publicUrl即作为该 map 的一个键传入存储插件。理解publicUrl配置与s3Url的区别publicUrl是 Velero 0.10 起在备份存储配置中新增的字段其语义在 api-types/backupstoragelocation.md 的参数参考表中有明确说明Key类型默认值含义publicUrlstring空示例https://minio.mycluster.com。若指定则在生成下载 URL例如日志下载时优先使用该值而非s3Url。该字段主要面向本地存储服务如 Minio。s3Urlstring非 AWS 托管存储为必填示例http://minio:9000。用于指定 S3 兼容服务的访问地址Velero 也可以根据region和bucket自动生成。主要面向 Minio 之类的本地存储服务。s3ForcePathStyleboolfalse使用 Minio 等本地存储时必须设为true使 AWS SDK 以 path-style而非 virtual-host方式寻址。regionstring空S3 区域未提供时由 AWS S3 API 查询。Minio 场景通常填写minio。signatureVersionstring4生成签名 URL 时使用的签名算法版本取值1或4。默认版本 4 通常正确个别 S3 兼容服务如 Quobyte仅支持版本 1。两者分工不同s3Url是 Velero 服务端写入/读取数据所用的对象存储地址集群内可达即可例如http://minio:9000而publicUrl专用于对外生成预签名下载链接时替换s3Url解决“数据平面在内网、客户端在外网”的地址不一致问题。只有s3Url而不设置publicUrl时生成出的下载 URL 指向的是集群内地址客户端将无法访问。在仓库的 E2E 测试工具中同样能印证这一配置键的存在——test/util/providers/aws_utils.go 定义了常量publicURLKey publicUrl与s3Url、s3ForcePathStyle、signatureVersion等键一起作为 Minio 场景下备份存储配置的标准键集合。方案二通过 Ingress 暴露 Minio保持 ClusterIP如果你的集群已经配置了 Ingress则可以继续沿用 Ingress 方案无需改动 Service 类型。保持 Service 类型为ClusterIP即不需要修改 examples/minio/00-minio-deployment.yaml 中的spec.type为 Minio 配置 Ingress 规则将集群外的某个域名或域名端口路由到minioService 的 9000 端口Ingress 本身的具体配置方式超出 Velero 文档范围请参考你所用 Ingress Controller 的文档在 examples/minio/05-backupstoragelocation.yaml 中取消publicUrl一行的注释填入Ingress 的 URL 与端口作为publicUrl的值。同样地对应到当前仓库的等价做法是编辑BackupStorageLocation的spec.config例如spec: config: region: minio s3ForcePathStyle: true s3Url: http://minio:9000 publicUrl: https://minio.mycluster.com注意Ingress 方案要求 Ingress 规则与publicUrl指向一致且客户端能解析对应域名。若使用 HTTPS还需确保证书可被 Velero 客户端信任自签名证书场景请参阅仓库中的自签名证书相关文档。验证配置是否生效配置完成后可以通过以下方式验证执行日志或详情获取命令观察是否不再报“无法连接/下载失败”类错误velero backup describe BACKUP_NAME velero backup logs BACKUP_NAME若仍失败先确认 Minio 的 NodePort/Ingress 地址在客户端机器上可以直连例如用curl访问publicUrl对应的地址再检查BackupStorageLocation的spec.config是否包含正确的publicUrl不要遗漏http://或https://前缀。常见问题与补充场景HTTPS 场景下日志乱码。如果 Minio 启用了 HTTPS 而publicUrl未正确设置velero describe或velero logs的输出可能出现无法解读的乱码文本。解决办法同样是给BackupStorageLocation添加一个指向 Minio 实例的公开地址例如kubectl patch -n velero backupstoragelocation default --type merge \ -p {spec:{config:{publicUrl:https://MINIO_PUBLIC_IP:9000}}}KinDKubernetes in Docker环境。KinD 不支持 NodePort 类型的 Service可参考 kubernetes-sigs/kind 仓库的相关 issue。此时可以改用kubectl port-forward将 Minio 的 9000 端口转发到本机再在BackupStorageLocation中配置publicUrl: http://localhost:9000。具体操作源自仓库更新版本文档 site/content/docs/v1.18/contributions/minio.mdMINIO_POD$(kubectl get pods -n velero -l componentminio -o jsonpath{.items[0].metadata.name}) kubectl port-forward $MINIO_POD -n velero 9000:9000然后在另一个终端编辑BackupStorageLocation在spec.config下添加publicUrl: http://localhost:9000。集群外访问的前提条件。无论采用哪种方案都必须保证 Velero 客户端所在机器能够实际到达 NodePort、Ingress 或转发地址。此外Minio 部署所在的节点需要留有足够磁盘空间示例 YAML 使用emptyDir存储数据重启后数据会丢失生产使用请替换为 PersistentVolume这一点在仓库多个版本的 Minio 快速上手文档中均有提示。小结把 Minio 暴露到集群外是让 Velero 客户端能够下载日志、查看备份详情的必要一步。核心链路可以概括为Velero 服务端调用对象存储插件的CreateSignedURL生成预签名下载链接 → 链接域名取自BackupStorageLocation配置中的publicUrl未设置则回退到s3Url→ 客户端必须能访问该域名。因此无论选择NodePort还是Ingress方案最终都要把对外可达的 Minio 地址写入publicUrl并且不要遗漏协议前缀。掌握了这一配置你就能在本地 Minio Velero 实验环境中顺畅地排查备份与恢复问题。【免费下载链接】veleroBackup and migrate Kubernetes applications and their persistent volumes项目地址: https://gitcode.com/GitHub_Trending/ve/velero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表