Vertica Docker CE 与 Kubernetes 常见问题¶
原文:Docker CE and Kubernetes - FAQs 适用版本:Vertica 10.1.1+(Docker CE)/ K8s Eon Mode
概述¶
近年来容器化因部署简便、资源占用轻量而广泛普及。Vertica 从 10.1.1 起支持 Docker CE 单节点部署(Enterprise Mode),并引入了 Kubernetes (K8s) 多节点容器化环境支持——可在 K8s 集群上部署自愈、高可用、弹性伸缩的 Eon Mode 数据库。
本文中 CE = Community Edition,K8s = Kubernetes。
Docker CE 篇¶
基础问答¶
Q: Vertica CE 容器与 VM 有什么区别? - CE VM 需要虚拟化平台,体积和内存占用更大 - 部署 VM 需要数分钟,Docker 容器可在 1 分钟内通过 Dockerfile 启动 - 容器技术允许环境独立于宿主操作系统运行,以轻量方式打包
Q: CE 镜像包含什么?
- 基于 CentOS 7.9
- 从 Docker Hub 获取:vertica/vertica-ce
- 使用 GitHub Dockerfile 构建,包括:安装依赖库 → 安装 Vertica → 设置 locale → 目录权限 → 创建用户/组 → 编译 VMART 并生成数据 → 设置环境变量
- 同时提供 CentOS 8.3 和 Ubuntu 18.04/20.04 的 Dockerfile
- 默认安装的额外包:Machine Learning、TensorFlow 集成、ORC 集成、Kafka、GIS 扩展
Q: 可以创建带有不同数据集的自定义镜像吗? 可以。公开的 Dockerfile 可修改以替换 VMart 数据集,或在容器启动后连接 Vertica 加载数据集。
Q: 数据如何挂载?
数据目录可通过 docker volumes 或 bind-mounts 挂载。无 bind-mount 时容器运行时会挂载到 /var/lib/docker/volumes/<vol-name>/<dir-name>。
若
/var磁盘空间不足,使用有足够空间的 bind-mount 目录来持久化数据。
默认创建 单节点 Enterprise Mode 数据库。
Q: 如何用 docker-compose 部署?
# docker-compose.yaml
version: "3.9"
services:
vertica:
environment:
APP_DB_USER: "newdbadmin"
APP_DB_PASSWORD: "vertica"
TZ: "Europe/Prague"
container_name: vertica-ce
image: vertica/vertica-ce
ports:
- "5433:5433"
- "5444:5444"
deploy:
mode: global
volumes:
- type: volume
source: vertica-data2
target: /data
volumes:
vertica-data2:
Q: 支持 Docker Swarm 吗? 不官方支持。推荐使用 Kubernetes 解决编排问题(网络、节点间通信等)。如果自己搭建,最简单的场景是 Enterprise Mode 而非 Eon Mode。
Kubernetes 篇¶
基础问答¶
Q: VM 集群 vs K8s 集群部署有何区别? VM 编排(如 ESX vSphere)将 VM 分布到不同资源池;K8s 将容器分布和调度到物理节点。K8s 通常有一个 Master 和多个 Worker 节点。
Q: Vertica 如何在 K8s 中部署?
- 仅支持 Eon Mode。通过 Vertica Operator 将 Eon 数据库部署为一系列 StatefulSet,每个 StatefulSet 对应一个 Vertica Subcluster
- 每个 Pod 对应一个 Vertica "节点"。如 3-pod StatefulSet = 3 节点
- 生产环境建议 1 Pod : 1 Worker Node(避免资源竞争)
- 客户端通过 Service 对象连接(每个 Subcluster 一个 Service),在 Ready Pod 间负载均衡
- 通过 Custom Resource 和 Operator 管理
Q: 部署了哪些 Service?
- Headless Service:维护 DNS 记录和 Pod 有序名称,domain 格式 $(service).$(namespace).svc.cluster.local。无 ClusterIP,K8s 不做负载均衡
- Load Balancing Service:每个 Subcluster 一个(ClusterIP/NodePort/LoadBalancer),管理内外部流量
Q: 外部客户端如何连接?
| 方式 | 说明 |
|---|---|
| NodePort | 每个 ClusterIP 映射到 K8s 节点一个端口(30000-32768)。需外部 LB(如 HAProxy)将端口映射到 5433 |
| LoadBalancer | 仅云平台支持(AKS/EKS)。裸金属需第三方 LB(MetalLB/HAProxy) |
Q: 建议用 K8s 还是 Vertica 做负载均衡? 推荐关闭 Vertica 原生负载均衡,让 K8s Service 管理。两层负载均衡会导致结果不可预期(如 ROUNDROBIN 表现为随机)。
Q: 支持哪些存储 provisioner?
理论上 K8s 的存储类与底层无关,只要文件系统是支持的格式。常用 local-path-provisioner 创建基于主机目录的 local-path 存储类。
Q: 网络插件推荐? Flannel 和 Calico 均可。建议 kube-proxy 使用 iptables 模式(IPVS 在大负载下有已知的客户端断连问题)。
Q: 支持哪些公共存储端? S3、GCS、Azure Blob、HDFS 以及本地 S3 兼容存储(MinIO、Pure Storage)。HTTPS 端点需通过 Secret 提供 CA 证书(AWS S3 无需额外证书)。
高级问答¶
Q: Pod 重启如何不丢数据?
每个 Pod 通过 PVC/PV 绑定到持久存储位置(存放 catalog/tmp/depot)。Eon Mode 下数据库数据在公共存储中,独立于 Pod 生命周期。即使所有 Pod 宕机,也可通过设置 initPolicy: "Revive" 轻松恢复集群。
Q: 如何监控和导出日志?
- Vertica 提供 vlogger sidecar 镜像,将 vertica.log 内容发送到宿主节点的 stdout
- kubectl exec -it <pod> -- vsql 进入 pod 执行 vsql
- kubectl describe vdb <cr_name> 查看 CRD 配置和事件
- kubectl logs <operator-pod> -c manager 查看 Operator 日志
Q: 如何升级?
Operator 自动化版本升级。通过 CR 中的 upgradePolicy 设置在线/离线升级模式。在线升级期间数据为只读。升级路径必须渐进,不能跳版本。
Q: 健康探测机制? 使用 Readiness Probe 检测 Pod 就绪状态(Vertica daemon 运行中且接受连接)。sshd 退出会导致容器 entrypoint 返回 → Pod 被删除 → StatefulSet 控制器重新调度。
Q: 系统内核参数?
Pod 继承宿主机的 sysctl 设置(无需 privileged 模式)。关键参数:kernel.pid_max、vm.swappiness、vm.max_map_count、vm.min_free_kbytes。使用节点 tolerations/affinity 确保 Vertica 调度到已配置的节点。
Q: K-Safety 能否改变? Operator 内置 admission controller 防止 CR 中修改 kSafety。创建时默认为 1。可通过 vsql 修改,但生产环境应保持 kSafety=1(测试环境可设为 0 但限 3 节点)。
Q: 许可证限制? 默认使用 CE 许可证(限 3 Pod + 1TB 数据)。使用自有许可证时通过 Secret 注入: