零 引入
在传统的应用程序部署中,需要手动配置和管理服务器、网络和存储等基础设施,并且随着应用程序规模的增长,管理复杂性也会大大增加。Kubernetes通过自动化和抽象化的方式,解决了这些挑战,使得应用程序可以以一种更加灵活和可靠的方式进行部署和管理。Kubernetes是一个开源的容器编排和管理平台,它为应用程序容器提供了一种高度可靠且可伸缩的部署、扩展和管理方式。随着容器技术的快速发展,Kubernetes成为了广泛使用的容器编排工具,为企业提供了构建强大、高效和可移植的应用程序环境的解决方案。
在介绍Kubernetes之前,我们有必要先了解一下容器编排技术。
一 容器编排概述
容器映像允许我们以预定义的格式限制应用程序代码、运行时及其所有依赖项。像runC、containerd或cri-o这样的容器运行时可以使用预打包的映像作为源来创建和运行一个或多个容器。这些运行时能够在单个主机上运行容器,但是,在实践中,我们希望有一个容错和可扩展的解决方案,通过构建单个控制器/管理单元(多个主机连接在一起的集合)来实现。该控制器/管理单元通常被称为容器协调器。
探讨为什么要使用容器编排器,容器编排器的不同实现,以及在哪里部署它们。
- 定义容器编排的概念。
- 解释使用容器编排的好处。
- 讨论不同的容器编排选项。
- 讨论不同的容器编排部署选项。
什么是容器?
容器是一种以应用程序为中心的方法,可在您选择的任何基础架构上提供高性能、可扩展的应用程序。容器最适合提供微服务,它为应用程序提供可移植的、隔离的虚拟环境,使其在不受其他运行应用程序干扰的情况下运行。
微服务是用各种现代编程语言编写的轻量级应用程序,具有特定的依赖项、库和环境要求。为了确保应用程序拥有成功运行所需的一切,它与依赖项打包在一起。
容器封装微服务及其依赖关系,但不直接运行它们。容器运行容器映像。
容器映像将应用程序及其运行时、库和依赖项捆绑在一起,它表示为应用程序提供隔离的可执行环境而部署的容器的源。容器可以从特定映像部署在许多平台上,如工作站、虚拟机、公共云等。
什么是容器编排?
在开发环境中,在单个主机上运行容器以开发和测试应用程序可能是一个合适的选择。但是,当迁移到质量保证(QA)和生产(Prod)环境时,这不再是一个可行的选择,因为应用程序和服务需要满足特定的要求:
- 容错
- 按需扩展
- 最佳资源使用
- 自动发现以自动发现并相互通信
- 来自外部世界的可达性
- 无缝更新/回滚,无需任何停机时间
容器编排器是将系统组合在一起以形成集群的工具,在集群中,容器的部署和管理可以大规模自动化,同时满足上述要求。
常见容器编排器
- Amazon Elastic Container Service :由亚马逊网络服务(AWS)提供的托管服务,用于在其基础设施上大规模运行容器。
- Azure Container Instances :Microsoft Azure提供的基本容器编排服务。
- Azure Service Fabric :Microsoft Azure提供的一个开源容器编排器。
- Kubernetes :是一个开源编排工具,最初由谷歌启动,现在是云原生计算基金会(CNCF)项目的一部分。
- Marathon :在ApacheMesos和DC/OS上大规模运行容器的框架。
- Nomad :HashiCorp提供的容器和工作负载协调器。
- Docker Swarm :Docker引擎的一部分。
为什么使用容器编排器?
尽管我们可以手动维护几个容器或编写脚本来管理几十个容器的生命周期,但协调器让用户的工作变得更容易,尤其是在管理在全球基础设施上运行的成百上千个容器时。
容器编排器可以做什么?
- 在创建群集时将主机分组在一起。
- 根据资源可用性安排容器在群集中的主机上运行。
- 使群集中的容器能够相互通信,而不管它们部署到群集中的哪个主机。
- 绑定容器和存储资源。
- 将类似容器的集合分组,并将它们绑定到负载平衡结构,以通过创建接口(容器和客户端之间的抽象级别)来简化对容器化应用程序的访问。
- 管理和优化资源使用情况。
- 允许实施策略以确保对容器内运行的应用程序的访问安全。
下面我们将探讨Kubernetes,它是目前最受欢迎的容器编排工具之一。
二 Kubernetes 简介
什么是 Kubernetes?
According to the Kubernetes website,
"Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications".
Kubernetes comes from the Greek word κυβερνήτης, which means helmsman or ship pilot. With this analogy in mind, we can think of Kubernetes as the pilot on a ship of containers.
Kubernetes is also referred to as k8s (pronounced Kate's), as there are 8 characters between k and s.
Kubernetes is highly inspired by the Google Borg system, a container and workload orchestrator for its global operations for more than a decade. It is an open source project written in the Go language and licensed under the Apache License, Version 2.0.
Kubernetes was started by Google and, with its v1.0 release in July 2015, Google donated it to the Cloud Native Computing Foundation (CNCF), one of the largest sub-foundations of the Linux Foundation.
New Kubernetes versions are released in 4 month cycles. The current stable version is 1.26 (as of December 2022).
Kubernetes容器编排的完全支持功能?
- Automatic bin packing :自动装箱
- Designed for extensibility :弹性扩展
- Self-healing :自愈
- Horizontal scaling :水平缩放
- Service discovery and load balancing :服务发现和负载均衡
Kubernetes容器编排的未来展望?
- Automated rollouts and rollbacks :自动推出和回滚
- Secret and configuration management :机密和配置管理
- Storage orchestration :存储编排
- Batch execution :批量执行
- IPv4/IPv6 dual-stack :IPv4/IPv6双堆栈
为什么使用 Kubernetes?
随着业务规模逐渐扩大,容器越来越多。一系列新问题仅靠Docker是无法解决的,例如:
- 如何协调和调度这些容器?
- 如何在升级应用程序时不会中断服务?
- 如何监视应用程序的运行状况?
- 如何批量重新启动容器里的程序?
- 如何进行扩容和缩容?
Kubernetes正是为解决这些问题而生的。Kubernetes将众多机器有序的管理起来,形成集群,而Kubernetes就相当于是集群的操作系统。
在Kubernetes下,开发者就可以按照如下的方式部署应用。开发者把一个应用列表提交到主节点,Kubernetes会将它们部署到集群的工作节点。组件被部署在哪个节点对于开发者和系统管理员来说都不用关心。这样的部署方式非常的简单。
- 可移植性强
-
- 它可以部署在许多环境中,如本地或远程虚拟机、裸机,或公共/私有/混合/多云设置中。
- 可扩展性优
-
- 能够支持并得到许多第三方开源工具的支持,这些工具增强了Kubernete的功能,并为其用户提供了丰富的功能体验。Kubernetes的功能可以通过编写自定义资源、运算符、自定义API、调度规则或插件来扩展。
Kubernetes 用户
- BlaBlaCar
- BlackRock
- Booking.com
- Box
- CapitalOne
- Haufe Group
- Huawei
- IBM
- ING
- Nokia
- Pearson
- Wikimedia 等等
三 Kubernetes 基础架构组件介绍
Components of Kubernetes Architecture
Master节点
Master是集群的控制节点,可以说是k8s集群的大脑。每个k8s集群中至少需要一个Master节点来维护整个集群的管理和控制,几乎所有的控制命令都是发给它,它负责执行具体的动作。它很重要,如果它不可用,那么我们所有的控制命令都会失效。
Master节点上运行一组关键进程:
- API Server :提供HTTP Rest接口的关键服务,是k8s的接口和通讯总线,用户通过命令行工具或kubectl,dashboard,sdks等方式操作k8s,所有的操作(scheduler,controller manager)都是通过调用apiserver来实现的,apiserver组件可以认为是etcd的代理。是唯一能够操纵etcd的组件。其他外围的组件都只能通过apiserver间接的去操作etcd 。 apiserver也是整个集群的事件总线,其他事件可以订阅到apiserver上,提供认证、授权、访问控制、API注册和发现等机制。当有新的事件发生时,apiserver会将事件通知到外围的组件。
- Controller Manager:k8s里所有资源对象的自动化控制中心,可以理解为资源对象的 “大总管。是保证集群状态最终一致的组件。通过apiserver 监控集群的状态,确保实际状态与预期状态最终一致。比如故障检测、自动扩展、滚动更新等(最终一致调度策略)。
- Scheduler:负责调度决策的组件,掌握当前集群资源的使用情况,相当于 “调度室”。按照预定的调度策略将Pod调度到相应的机器上。例如:当有新的应用发布请求提交到的k8s集群,scheduler负责决策相应的pod应该分配到那些空闲的节点上去。其调度决策算法是可以根据需要进行扩展的。
- 分布式数据库etcd:集群的数据存储,他存储着集群中所有的资源对象。数据存储采用的是键值对存储。保存了整个集群的状态。可以独立部署,也可以和master驻在一起,高可用部署的话,至少需要部署3个节点。
Worker/Node节点
Worker节点是k8s集群资源的提供者,运行具体的Pod,当某个Node宕机时,其工作负载会被Master自动转移到其他Node节点上。默认情况下kubelet会向Master注册自己。一旦Node被纳入集群管理,kubelet进程就会定时向Master节点汇报自身的情况,比如操作系统等信息,这样Master就可以获取每个Node节点的资源使用情况合理的进行调度。如果Node节点在指定时间不上报,那么Master就会认为它〝失联”,标记成"Not Ready” 状态。
Worker节点上运行一组关键进程:
- kubelet:是worker节点资源的管理者(agent),监听apiserver的一些事件,根据master的指示执行相关的动作,比如:启动或关闭pod等,同时也将本节点的一些状态汇报给APIserver等,是worker节点的小脑。
- kube-proxy:管理k8s中的服务网络的(servernetwork)的组件,是k8s服务网络的机制。它负责节点的网络,在主机上维护网络规则并执行连接转发。它还负责对正在服务的pods进行负载平衡。比如一个服务可能会运行多个副本(Pod ),由他来控制具体由哪个Pod提供服务。为Service提供cluster内部的服务发现和负载均衡。
- Docker Engine ( docker):docker引擎,负责本机的容器创建和管理工作。
- Docker Engine/Container Runtime:
-
- 结点容器资源的管理者,负责本机的容器创建和管理工作。kubelet不直接管理节点上的容器资源,而是委推给Container Runtime进行管理(启动或关闭容器,收集容器状态等等)。
- Container Runtime启动容器时,如果本地没有镜像缓存,会到docker hub去拉取对应的镜像缓存到本地。
发布流程样例
下面我们通过一个发布流程样例展示一下k8s集群各个组件是如何配合工作的。
发布流程:
1、Kubectl命令行工具向Api server发送创建一个新的name为newReplicaSet 的pod的请求。Api server 将该资源请求存储到etcd中。
2、Controller Manager监听ReplicaSet修改或创建相关的事件(收到创建通知)。
3、Controller Manager会比较当前的集群状态和预期的集群状态,发现不一致,所以需要创建新的pod。于是根据第一步中kubectl提交的发布模板,在apiserver中创建预期的pod资源。
4、Scheduler会监听到创建pod的请求,于是运行调度算法,将pod分配到空闲的worker节点,然后通过apiserver更新pod的定义,把这些pod指派到具体要发布到那些worker节点上去。
至此,应用还未真正发布,Controller Manager和Scheduler 只是通过apiserver更新了希望的集群状态。
5、pod被分配到预期的某一个
worker节点之后,apiserver就会通知相应节点的kubelet。
6、kubelet接收到通知后,指示节点上面的Container Runtime去运行对应的容器。Container Runtime就会开始下载镜像,启动容器。
7、kubelet开始监控容器的运行。
小结
组件 | 节点 | 作用 |
Etcd | Master or 独立集群 | 集群状态集中存储 |
API Server | Master | 集群接口和通讯总线 |
Scheduler | Master | 调度决策组任(发布到哪些空闲节点) |
Controller Manager | Master | 协调发布状态最终一致组件 |
Kubelet | Worker | worker节点资源管理 |
Container Runtime | Worker | 容器资源管理 |
Kube-Proxy | Worker | 实现服务(Service)抽象组件,屏蔽PodIP的变化和负载均衡 |
Pod | Worker | K8s云平台中提供的虛拟机,K8s基本调度单位 |
Container | Worker | 应用跑在容器中,资源隔离单位 |