Skip to content

高可用安装

oilbeater edited this page Jun 27, 2022 · 12 revisions

Wiki 下的中文文档将不在维护,请访问我们最新的中文文档网站,获取最新的文档更新。

高可用原理

Kube-OVN 的高可用涉及三个方面的高可用:

  1. OVN 控制平面的高可用
  2. kube-ovn-controller 的高可用
  3. 集群网关的高可用

OVN-DB 的高可用

OVN 控制平面包含 ovn-nb,ovn-northd 和 ovn-sb 三个组件,其中 ovn-nb 和 ovn-sb 为控制平面数据库, 多个数据库实例之间通过 RAFT 协议来保证数据的高可用和强一致。ovn-nb 和 ovn-sb 的高可用机制和 etcd 类似, 多个数据库之间通过 RAFT 协议进行选举和数据同步,同一时间只有一个实例作为 leader 承担读写操作,当 leader 故障中断发生时会进行 leader 切换。三个实例的情况下可以容忍一个实例发生故障,并正常对外提供服务。

ovn-northd 将数据信息从 ovn-nb 同步至 ovn-sb 并进行转换,多个 ovn-northd 多个实例运行在 active-backup 模式, 通过在 ovn-sb 内进行注册锁,来保证同一时间只有一个实例工作。当前 active 实例故障后,ovn-sb 内的锁过期失效, backup 实例注册成功成为新的 active 实例继续进行工作。多实例部署情况下,只要有一个 ovn-northd 实例正常工作即可。

在 Kube-OVN 的部署过程中,会将 ovn-nb, ovn-sb 和 ovn-northd 部署在同一个 Pod 中,并会根据 Kubernetes master 的数量自动配置 ovn-central 的实例个数,实例个数等于 Kubernetes Master 的数量。

kube-ovn-controller 的高可用

kube-ovn-controller 负责监听 apiserver 内网络相关资源变更,并同步至 ovn-central,多个 kube-ovn-controller 实例运行在 active-backup 模式,使用 client-go 中的 leader-election 相关库,通过在 apiserver 内注册 configmap 实现分布式锁。当前 active 实例故障后,configmap 内的锁过期失效,backup 实例注册成功成为新的 active 实例继续进行工作。 多实例部署情况下,只要有一个 kube-ovn-controller 实例正常工作即可。

在 Kube-OVN 的部署过程中,默认会根据 Kubernetes master 的数量自动配置 ovn-central 的实例个数,实例个数等于 Kubernetes Master 的数量。

集群网关的高可用

Kube-OVN 的集群网关有分布式和集中式两种模式,分布式网关每个 Pod 从当前所在主机经过 NAT 访问外部网络,不存在单点问题。

集中式网关有两种高可用模式:主备模式,ECMP 模式

主备模式下,kube-ovn-controller 会不断探测网关节点的存活性,选择一台工作正常的节点作为 active 节点,修改 OVN 内路由规则, 将访问外网流量下一跳指向 active 网关节点,所有访问外网的流量会通过 active 网关节点转发。当 active 节点出现故障时, kube-ovn-controller 会自动修改 OVN 内的路由规则指向新的 active 网关节点。网关切换期间,已有连接会发生中断。

ECMP 模式下,所有网关节点都会承担流量,流量根据源 IP 进行哈希选择对应的网关节点。kube-ovn-controller 会不断检测所有网关节点 存活性,如果出现节点异常会重新进行流量分布,将流量哈希到正常工作的网关节点。网关节点更新期间,已有连接会发生中断。

Kube-OVN 默认使用主备模式网关,如需调整续更改 kube-ovn-controller 启动参数 --enable-ecmp=true

高可用部署

使用 install.sh 自动部署

install.sh 会自动根据 Kuberrnetes 集群状态调整部署模式,如果 Kubernetes 为集群模式,自动部署脚本会调整 ovn-central 和 kube-ovn-controller 数量,使用集群模式部署保证高可用

手动部署

ovn-central 高可用

  1. 通过给 node 加标签的方式增加 ovn db 部署的节点,建议总共有奇数个部署 OVN DB 的节点(3,5...)

kubectl label node <Node on which to deploy OVN DB> kube-ovn/role=master

  1. 修改 ovn.yaml 中 ovn-central deployment 的 replicas 为商议步中对应 node 的数量

  2. 修改 ovn.yaml 中 ovn-central deployment 的 env,增加 NODE_IPS 为对应节点的 IP, ovs-ovn daemonset 中的 env 增加 OVN_DB_IPS 为对应节点 IP

      replicas: 3
      containers:
        - name: ovn-central
          image: "kubeovn/kube-ovn:v1.10.0"
          imagePullPolicy: Always
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: NODE_IPS
              value: 192.168.55.10, 192.168.55.11, 192.168.55.12
  1. 部署修改后的 yaml

kubectl apply -f ovn.yaml

等待 ovn-central pod 进入 ready 状态

[root@node2 yamls]# kubectl get pod -n kube-ovn
NAME                           READY   STATUS    RESTARTS   AGE
ovn-central-7bf5744db7-7d88s   1/1     Running   0          73s
ovn-central-7bf5744db7-c7sdh   1/1     Running   0          73s
ovn-central-7bf5744db7-wtn4s   1/1     Running   0          73s

Kube-OVN-Controller 高可用

Kube-OVN-Controller 本身实现了 leader-election,只需要增加 replicas 数量即可实现高可用。

更改 kube-ovn.yaml 中 kube-ovn-controller deployment 的 replicas 数量,env 增加 OVN_DB_IPS 为对应ovn-central节点 IP 并 apply yaml 即可。

Clone this wiki locally