部署到 Kubernetes

Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。在本教程中,我们将使用 Helm —— Kubernetes 的包管理工具,来简化部署过程。

技术架构

Univer 的后端服务在 Kubernetes 上的部署将涉及以下组件:

  • Kubernetes Cluster:你的应用程序将在这里运行。
  • helm:用于在 Kubernetes 上部署和管理应用程序的工具。需要 helm 3 版本。
  • PostgreSQL + RabbitMQ

安装 Helm

访问 Helm 的 官方安装页面 并按照指南安装 Helm。 验证 Helm 是否安装成功,运行以下命令:

helm version

部署

准备 Kubernetes 集群

确保你有一个运行中的 Kubernetes 集群。如果你使用的是云服务提供商,如 Google Kubernetes Engine (GKE) 或 Amazon Elastic Kubernetes Service (EKS),请按照他们的指南创建集群。

部署 Univer 服务

  1. 使用 Helm 安装 Univer 服务:
helm install -n univer --create-namespace \
--set global.istioNamespace="univer" \
univer-stack oci://univer-acr-registry.cn-shenzhen.cr.aliyuncs.com/helm-charts/univer-stack
 
kubectl rollout restart -n univer deployment/collaboration-server
kubectl rollout restart -n univer deployment/universer
  1. 检查部署状态:
kubectl get pods
  1. 部署可观测性组件(可选):
helm upgrade --install -n univer-observability --create-namespace \
--set global.univerNamespace="univer" \
univer-observability oci://univer-acr-registry.cn-shenzhen.cr.aliyuncs.com/helm-charts/univer-observability

验证部署

# 可以简单修改本地 hosts 文件来解析域名。
# 默认域名: univer.example.com
 
open: http://univer.example.com/sheet/

离线部署

下载离线安装包

点击链接下载离线安装包,将安装包解压到服务器。

tar -xvf installation-package.tar # 解压命令,将文件名替换为实际文件名

上传镜像到私有仓库

记住,在跑脚本前你需要本地先登陆到你的私有镜像仓库。

bash load-image.sh --registry ${YOUR_REGISTRY} --namespace ${YOUR_IMAGE_NAMESPACE}

安装服务

脚本依赖 helmkubectl 客户端工具。

bash install.sh

验证服务是否可用

# 可以简单修改本地 hosts 文件来解析域名。
# 默认域名: univer.example.com
 
Visit: http://univer.example.com/sheet/

卸载

bash uninstall.sh

自定义配置

默认配置可以参考 https://github.com/dream-num/helm-charts 仓库,或者执行 helm show values oci://univer-acr-registry.cn-shenzhen.cr.aliyuncs.com/helm-charts/univer-observability 获取。

根据 helm 官方指引,你可以配置一个 values.yaml ,然后执行 helm upgrade --values values.yaml ... 来更新服务。

USIP

universer:
  config:
    usip:
      enabled: true
      uri:
        userinfo: "http://192.168.1.100:8080/userinfo"
        collaborators: "http://192.168.1.100:8080/collaborators"
        role: "http://192.168.1.100:8080/role"
        credential: "http://192.168.1.100:8080/credential"

Database

修改配置使用自己的数据库。

universer:
  config:
    database:
      driver: postgresql
      host: 192.168.1.100
      port: 5432
      dbname: univer
      username: postgres
      password: postgres
 
temporal:
  server:
    config:
      persistence:
        default:
          driver: "sql"
          sql:
            driver: "postgres12"
            host: 192.168.1.100
            port: 5432
            database: temporal
            user: postgres
            password: postgres
 
        visibility:
          driver: "sql"
          sql:
            driver: "postgres12"
            host: 192.168.1.100
            port: 5432
            database: temporal_visibility
            user: postgres
            password: postgres
 
postgresql:
  enabled: false # 不使用默认部署的数据库

Redis

修改配置使用自己的 Redis

universer:
  config:
    redis:
      poolSize: 100
      # 如果是 redis 集群,可以用逗分隔多个地址
      # 例如:192.168.1.100:6379,192.168.1.101:6379
      addr: 192.168.1.100:6379
      read_timeout: 1s
      write_timeout: 1s
      db: 0
      username: ""
      password: ""
 
redis:
  enabled: false

S3

修改配置以使用自己的对象存储

universer:
  config:
    s3:
      accessKeyID: admin
      accessKeySecret: minioadmin
      region: "us-east-1"
      endpoint: http://192.168.1.100:9000
      endpointPublic: ""
      usePathStyle: true
      defaultBucket: univer
 
minio:
  enabled: false

RabbitMQ

universer:
  config:
    rabbitmq:
      cluster:
        enabled: true
        # use comma to separate multiple addresses
        # for example: RABBITMQ_CLUSTER_ADDR=192.168.1.2:5672,192.168.1.5:5672,192.168.1.7:5672
        addr: "192.168.1.2:5672"
        username: "admin"
        password: "rabbitmq"
        vhost: "/"
        schema: amqp
 
rabbitmq:
  enabled: false

常见问题

服务未启动: 检查 Kubernetes 的 Pod 是否正常运行,查看日志以确定问题所在。

下载不了 OCI 制品?

helm 版本要求大于等于 3,如果版本低于 3.8,需要通过 export HELM_EXPERIMENTAL_OCI=1 设置环境变量来开启 OCI 特性,详情请查看 helm 官方文档