跳转至

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 volumesbind-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:
docker-compose --file ./docker-compose.yml --project-directory <dir> up -d

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_maxvm.swappinessvm.max_map_countvm.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 注入:

kubectl create secret generic license --from-file=license.key=/path/to/license.key

扩展阅读