
人们常说:没有最好的架构,只有最合适的架构。对于 Kubernetes 集群部署来说也是如此。在本文中,火山引擎云原生研发工程师王敏杰将给大家介绍一种 Kubernetes 集群部署的大致思路,希望可以给大家带来一些参考。
Kubernetes 集群简介

iptables 模式:使用 iptables 分发的路由规则
IPVS 模式:使用内核的 IPVS 路由功能

最下面是用三个节点的形式来运行一个集群的 Master 节点,作为一个集群的控制面。我们会在每个 Master 节点上启动 etcd 服务, etcd 通过相互绑定,实现独立的 etcd 集群。在每个 Master 节点上会运行 API Server、Controller Manager、Scheduler 等组件,它们不会像 etcd 自己组成一个集群,可以看作是各自独立运行
在 API Server 之上有一个 load balancer,它是把多个 API Server 节点进行串联的关键组件。load balancer 的功能类似于 Nginx,会把 worker node 发送的请求代理到各个 API Server 上,把流量/请求全部分发过去,这样就可以实现 API Server 的 HA 功能

单 Kubernetes 集群部署
没有公网
不能方便地从公网拉取二进制文件或者镜像
自己构建的镜像不希望在公网出现

首先,如上图左边所示,我们启动了一个 HTTP 服务(可以是 Nginx 或 Apache 等服务)。它的作用可以理解成是一个文件服务器,里面存放的是操作系统软件源以及 Kubernetes 集群的二进制文件(Kubelet、Kubectl 等) 其次,我们会安装一个镜像仓库。集群使用的镜像都存放在里面,后续产品或业务组件更新迭代也会把镜像推送到这边来
上面两个服务起来之后,我们会在这个节点或者服务器上启动另外一个容器——控制集群部署脚本。这个容器里的脚本是 Ansible playbook,会通过 SSH 的方式登录到集群的每个节点上进行部署操作

操作系统跳板机配置(ssh-proxy):这一块放到后面讲
操作系统初始化:修改或者更新操作系统的内核参数、依赖的安装包等
部署前检测和配置:集群部署很多时候比较耗时,为了避免部署过程中的一些风险,我们在集群部署之前会进行一些配置或环境检测。如果发现有不符合集群部署的需求就会在这里退出,在这个阶段也会额外修改一些集群对操作系统依赖的配置
Runtime 安装:我们采用的是 Containerd。如果需要使用 Docker 之类的 Runtime,可以在这个步骤中进行替换
二进制文件下载以及组件镜像预下载:为了加快后续的部署效率,我们会提前并行地在需要的节点下载一些二进制文件或组件镜像
etcd 部署安装:Kubeadm 支持 etcd 容器化运行。为了适配更多的部署场景要求,etcd 服务使用二进制方式安装
集群节点二进制文件安装:之后我们会在所有节点上安装 Kubelet,Master 节点上也会安装 Kubectl 以方便后续维护。Kubelet 安装完成之后,第一个 Master 节点会用 Kubeadm init 操作来进行安装,Master2、Master3 则会用 Kubeadm join --control-plane 的方式来进行安装,这样就能完成 Master 节点的部署。在 node 节点上我们会用 Kubeadm join 方式把集群节点加进来
节点创建完成后,都还处于 not ready 的状态,这时需要安装网络组件。我们采用的是 Calico + VXLAN 的方式。Calico 安装完之后集群的所有节点都会进入 ready 状态
集群部署完成之后,为了方便之后的维护,以及维护过程中可以了解部署时的特殊配置,我们会把集群信息全部存放到集群的 ConfigMap 中
多 Kubernetes 集群部署模式
很多情况下,私有云都存在于自建机房。自建机房很可能是纯内网的环境(如果有公网肯定是最好的)
具有不断扩展的业务需求,具有可规划性:可以不断地往集群内添加机器,能够支持规模的扩大
没有大规模的突发业务流量
具有多个可以划分的业务线,或有需要隔离的业务。当有一些业务需要单独进行隔离时,如果这些业务运行在单集群中,从网络等维度上来说可能无法做到真正隔离。但是如果让不同的业务运行在不同的 Kubernetes 集群中,就可以做到完全隔离
所有集群配置都会存放在控制集群中。用户集群中也会存放一些相应的配置,但是它只存放集群自身相关的配置。在控制集群中可以看到所有用户集群的具体配置
控制集群与用户集群之间在部署时仅由一台服务器连接。如果机房存在于不同的 IDC,网络打通会有一些困难;如果用户集群规模比较大时,需要开通很多访问端口权限,工作量会很大。这个设计方案是只要有一台服务器能允许我们正常登陆上去,集群就可以正常的部署
用户集群在添加删除节点的过程中不依赖于控制集群信息,在集群内部就可以完成相应的操作

总结展望
一定程度降低运维人员维护集群的工作量,不会因为集群规模增加带来巨大的工作量。
不会受制于单 Kubernetes 集群的规模限制,可以支持更大的业务发展。
使用多 Kubernetes 集群模式可以很方便的对不同业务进行隔离。
业务组件容器化:如果后面很多业务都要上 Kubernetes,业务组件的容器化将会是必须要做的。
Kubernetes 集群部署简单化:我刚开始接触 Kubernetes 集群的时候,大多数操作都是手动的,API Server、 Controller Manager、Scheduler 等组件没有以容器方式运行,很多都是用 systemd 的形式部署,非常耗时。现在社区有很多集群部署工具,像 Kind、Minikube 对于单集群或测试集群的部署非常方便。Kubespray、Kops 等工具是成型的 HA 的 Kubernetes 集群部署方案。Kubeadm 是一个十分好用的部署工具,它把部署过程拆成了很多小的步骤,只需一条命令就可以完成一个部署操作,非常灵活方便。
Kubernetes 集群配置个性化:当不同的业务上到 Kubernetes 集群或私有云以后,会对集群有一些特殊要求。这种情况下就需要对每个 Kubernetes 集群都有一些个性化的支撑。
多 Kubernetes 集群普遍化:多 Kubernetes 集群更利于集群的使用和运维,我认为未来将更加普遍。
A:常规私有云场景下,可以采用 Calico 的 BGP 网络,这个网络可能会对机房网络有一定的要求,因为它需要依赖于一些物理的路由规则的分发。另外一种方式就是使用 IPVLAN 作为 CNI 的方案,这个方式可能会更适用于 Dubbo 环境,只是对集群的规模会有一定的限制。
A:我们把它设计成分布式 LB 的方式,最主要的目的就是让集群自身不会依赖于一个固定 LB 的 IP。如果集群外部要对它有一个请求,可以额外创建一个 LB 的服务来进行请求。这样即使 LB 挂掉了或者要进行切换,也不会影响集群稳定性。
A:性能是一方面,此外实际的使用环境以及通用性也是需要考虑的。
A:如果只是单纯的使用,VXLAN 和 BGP 可能不会有很大的差异。使用 BGP 更多的是为了把路由信息通过网络设备建立连接,这个过程对物理网络有一些依赖。我们为了有更好的兼容性,还是采用了 VXLAN 模式。当然实际部署过程中,我们也是支持通过修改 env 文件的配置,使用 BGP 进行部署。
6 月 10 日,火山引擎将举办“全擎而进 Tech for Growth”品牌发布会,欢迎企业关注并报名参与,一起见证企业增长新引擎的魅力!
点击【阅读原文】,立即预约!
感谢关注火山引擎云原生(VolcanoEngine),业务咨询请拨打客服热线:400-850-0030

关于火山引擎
火山引擎是字节跳动旗下的数字服务与智能科技品牌,基于公司服务数亿用户的大数据、人工智能和基础服务等能力,为企业客户提供系统化全链路解决方案,助力企业务实地创新,实现业务持续快速的增长。





