
1.3.3 容器集群管理系统——Kubernetes
Kubernetes又称k8s,是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。它将构成应用程序的容器分组为最小的可部署计算单元,即Pod(一组容器,这些容器共享存储、网络,以及怎样运行这些容器的声明),以便于管理。Kubernetes建立在Google 15年生产工作负载运行经验的基础上,并结合了来自社区的最佳创意和实践。Kubernetes是开源系统,可以自由地部署在企业内部的私有云、混合云或公有云。
Kubernetes的结构如图1-5所示。

图1-5 Kubernetes的结构
(1)Kubernetes控制平面
Kubernetes控制平面也称为主节点,它负责管理工作节点,确保系统正常运行。对于管理员和用户来说,它是管理集群节点的主要联系点。
Kubernetes控制平面是Kubernetes集群的核心,负责集群中资源的调度和管理,并维护对象状态(例如Pods、Services)。
Kubernetes控制平面包括:
1)调度器(Scheduler):负责监视新创建的、未指定运行节点(Node)的Pods,并选择节点来让Pod在上面运行。调度决策考虑的因素包括单个Pod及Pods集合的资源需求、软/硬件及策略约束、亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。
2)控制管理器(Controller Manager):控制平面的组件负责运行控制器进程。从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。
控制管理器包括:
①节点控制器(Node Controller),负责在节点出现故障时进行通知和响应;
②任务控制器(Job Controller):监测代表一次性任务的Job对象,然后创建Pods来运行这些任务直至完成;
③端点控制器(Endpoints Controller):填充端点(Endpoints)对象,即加入Services与Pods;
④服务账户和令牌控制器(Service Account&Token Controller):为新的命名空间创建默认账户和API访问令牌。
3)API服务器(API Server):该组件负责公开Kubernetes API,以及处理接收请求的工作;设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩,并在这些实例之间平衡流量。
4)Etcd:具有一致性与高可用性的键值数据库,可以作为保存Kubernetes所有集群数据的后台数据库。
5)云控制管理器(Cloud Controller Manager):该组件允许集群连接到云提供商的API之上,并将与该云平台交互的组件同与用户的集群交互的组件分离开来。云控制管理器是仅运行于特定云平台的控制器,因此如果在用户自己的环境中运行Kubernetes,或者在本地计算机中运行学习环境,所部署的集群不需要由云控制器管理器。
(2)Kubernetes Node组件
节点组件会在每个节点上运行,负责维护运行的Pods并提供Kubernetes运行环境。
1)节点代理(kubelet):该组件会在集群中的每个节点(Node)上运行。它保证容器都运行在Pod中。kubelet接收一组通过各类机制提供给它的Pod Specs,确保这些Pod Specs中描述的容器处于健康的运行状态。kubelet不会管理不是由Kubernetes创建的容器。
2)网络代理(kube-proxy):该组件是集群中每个节点上所运行的网络代理,是实现Kubernetes服务概念的一部分。kube-proxy维护节点上的一些网络规则,这些网络规则会允许集群内部或外部的网络会话与Pod进行网络通信。
(3)Kubernetes的特点和优势
1)自动化部署:Kubernetes可在应用程序的整个生命周期内实现一致的声明式自动化。它允许自动化部署、扩展和管理容器化应用程序。这有助于提高运营和开发团队的效率。
2)负载均衡:Kubernetes常见的应用之一就是将传入的流量负载均匀分配给所有容器和服务。这有助于减轻单个容器的压力,可实现同时轻松处理大量流量。
3)简化的DevOps:Kubernetes包含GitOps的概念,其中Git存储库作为应用程序部署的主要事实来源。如果当前部署和Git历史不同,Kubernetes将立即更新部署以反映当前Git的状态。只需要使用所需的修改来更新Git历史记录,Kubernetes就会自动更新应用程序。使用Kubernetes,分配和释放资源实现自动化,无须手动设置;添加或删除节点也是非常的简单,只需要部署Node部件,执行一条kubectl join命令即可加入新的节点。
4)简化部署:Kubernetes显著简化了开发、发布和部署流程,它允许容器集成并简化对来自多个提供商的存储资源访问的管理。
5)提高生产力:使用Kubernetes的好处之一是能够更快地构建应用程序。Kubernetes能够快速构建包含硬件抽象层的服务应用程序。开发人员能够快速推出和发布新的版本,并通过Kubernetes master服务将所有节点作为一个实体进行管理。
6)降低成本:Kubernetes可以降低基础设施成本。自动扩展逻辑(HPA、VPA)及允许动态配置资源的云供应商集成,Kubernetes使基础设施上的手动操作减少了,这可以帮助企业节省时间和金钱。
7)可扩展性:Kubernetes天生具有可扩展性,它可以轻松处理数十个节点上的数百万个请求和数十万个容器。
8)安全性:Kubernetes在构建时考虑了安全性,并具有内置的安全功能,例如日志记录、访问控制和审计。
9)持续交付:持续交付涉及交付7×24h的应用程序,可以实现不停机升级应用。通过持续交付,可以部署新版本的应用程序,几乎不需要人工干预,然后在需要时自动扩展这些应用程序。Kubernetes可以快速托管现代分布式云托管的应用程序并解决许多CI/CD问题。