-
Notifications
You must be signed in to change notification settings - Fork 451
高可用安装
Wiki 下的中文文档将不在维护,请访问我们最新的中文文档网站,获取最新的文档更新。
Kube-OVN 的高可用涉及三个方面的高可用:
- OVN 控制平面的高可用
- kube-ovn-controller 的高可用
- 集群网关的高可用
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 负责监听 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
会自动根据 Kuberrnetes 集群状态调整部署模式,如果 Kubernetes 为集群模式,自动部署脚本会调整 ovn-central 和
kube-ovn-controller 数量,使用集群模式部署保证高可用
- 通过给 node 加标签的方式增加 ovn db 部署的节点,建议总共有奇数个部署 OVN DB 的节点(3,5...)
kubectl label node <Node on which to deploy OVN DB> kube-ovn/role=master
-
修改
ovn.yaml
中 ovn-central deployment 的 replicas 为商议步中对应 node 的数量 -
修改
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
- 部署修改后的 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 本身实现了 leader-election,只需要增加 replicas 数量即可实现高可用。
更改 kube-ovn.yaml
中 kube-ovn-controller deployment 的 replicas 数量,env 增加 OVN_DB_IPS 为对应ovn-central节点 IP 并 apply yaml 即可。