重学k8s: 03.Kubernetes集群的几种部署方式及如何选择
2021-08-04
通过上节内容,学习了Kubernetes自己就是一个大型的分布式系统,Kubernetes集群的包含众多组件。集群中的服务器节点分为control-plane
节点和node
节点.
control-plane
节点上需要部署kube-apiserver
、kube-controller-manager
、kube-scheduler
组件。
node
节点上需要部署kubelet
、kube-proxy
组件,另外还需要在node
节点上部署实现了CRI的容器运行时(如: Containerd, CRI-O)。
还需要部署一套etcd集群
作为k8s集群的存储数据库,kube-apiserver使用etcd存储整个集群的状态。
最后还需要在k8s集群中部署一些扩展组件(Addons)包含: 网络和网络策略插件(如Calico)、服务发现插件(如CoreDNS)、可视化管理插件(如Kubernetes Dashboard),才能让整个k8s集群的功能对外可用。
Kubernetes集群如此众多的组件,起初要部署一套生产可用的集群并不是一件容易的事,随着k8s社区的发展,各种部署方案已经变的很成熟,本节将对比介绍几种主流的k8s集群部署方法,并以生产可用为目标作出选型。
Minikube部署 #
Minikube是由k8s社区维护的部署单机版本k8s集群的工具,支持k8s的绝大部分功能,特别适合初学者入门、或个人本地开发测试使用。 Mnikube实际上需要跑在本地虚拟机中(如VirtualBox, VMWare等),而现在个人本地的工作和开发机器的配置cpu和内存都是很大的,因此完全可以在个人本机虚拟机中部署一个多节点k8s集群用于学习和测试。 所以实际中MiniKube用的不是很多,链接https://minikube.sigs.k8s.io/docs/是Minikube的文档,想要在个人本地快速体验k8s功能的用户可以基于此文档进行minikube的部署和使用。
使用官方部署工具部署(kubeadm, kops, kubespray怎么选择) #
k8s社区提供了3个部署工具,分别是kubeadm
, kops
和Kubespray
。这三个工具都被归类到了k8s的生产环境部署文档中https://kubernetes.io/zh/docs/setup/production-environment/tools/,说明这3个工具都已经是生产可用了。
文档https://github.com/kubernetes-sigs/kubespray/blob/master/docs/comparisons.md中给了这3个工具的对比:
- kubespray可以在bare metal和大多数云上,使用ansible作为自动化配置和编排的基础工具,对于熟悉ansible并希望跨多个平台部署k8s集群的人来说是一个选择
- kops自己内部实现的自动化配置和编排功能,与其支持的特定的云平台的独有特性紧密关联(如AWS),所以在其他一些通用的平台上不太灵活
- kubeadm提供了
k8s集群生命周期管理的领域知识,包括自托管、动态服务发现等
,说白话就是,kubeadm提供了官方对k8s集群部署、配置、管理的最佳实践。 - kubespray从2.3版本开始,已经在其内部使用kubeadm来创建k8s集群
通过上面的对比,可以看出,如果你在可预见的将来确定只使用一个平台(如AWS),那么可以选择kops,但是谁又能预见将来呢?因此kops显然不是一个最优选择。 而由于kubeadm提供了官方对k8s集群部署、配置、管理的最佳实践,是必须要学习的。
kubeadm的具体实现是把大部分组件容器化(如kube-apiserver, kube-controller-manager, kube-scheduler, kube-proxy),通过静态Pod(Static Pod)的形式运行,kubeadm自动化绝大部分的集群配置和认证工作,通过简单的配置和命令就可以初始化出一个k8s集群。 另外官方文档中对于如何使用kubeadm部署高可用的k8s集群也给了说明https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/high-availability/、https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/。
到目前为止,使用kubeadm是一个不错的选择,对于集群规模较大且熟悉ansible的用户,使用kubespray(已内置kubeadm)更合适一些。 但因为官方宣布kubeadm生产可用的时间并不长,而且将几个核心组件都容器化部署,屏蔽了很多细节,不如二进制部署的可维护性和可定制性强。 下面将介绍二进制部署方式。
使用二进制部署(使用ansible作为自动化配置和编排的基础工具) #
前面提到了kubeadm虽然自动化了绝大部分集群配置工作,降低了部署的门槛,但其将大多数核心组件以容器运行,同时会屏蔽很多细节,在实际生产环境中还是推荐以二进制的形式部署。 二进制部署是指将k8s的核心组件的可执行文件直接在k8s节点上启动,二进制部署各个组件的初始化和配置工作需要参考kubeadm的最佳实践。
使用二进制部署的最佳实践是,参考kubeadm对k8s集群的配置管理实践,开发一套ansible playbook,实现二进制k8s集群的自动化部署和配置管理。 后续伴随这个k8s的每个版本的升级,学习官方在kubeadm对集群配置管理的调整,维护这套ansible playbook,这样这套二进制部署方案始终与官方kubeadm推荐的配置管理实践保持一致。
参考 #
- https://kubernetes.io/zh/docs/tutorials/hello-minikube/
- https://minikube.sigs.k8s.io/docs/start/
- https://kubernetes.io/zh/docs/setup/production-environment/tools/
- https://github.com/kubernetes-sigs/kubespray/blob/master/docs/comparisons.md
- https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/