k8s 概述
k8s github地址:https://github.com/kubernetes/kubernetes
官方文档:https://kubernetes.io/zh-cn/docs/home/
k8s,全程是 kubernetes,这个名字源于希腊语,意为"舵手"或"飞行员"
k8s 这个缩写是因为 k 和 s 之间有八个字符
Google 在2014年开源了 k8s 项目,k8s 是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。同样类似的容器编排工具还有 docker swarm/mesos 等,但 k8s 应用最为广泛,社区更为活跃。
什么是 k8s
k8s 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由 Google 开发,现由 Cloud Native Computing Foundation(CNCF)维护。k8s 的目标是简化应用程序的部署和管理,提供弹性、可扩展、高可用的服务。
k8s 基于容器技术,如 docker,作为应用程序的基本构建块。容器是一种轻量级的虚拟化技术,可以将应用程序及其依赖项打包到一个独立的、可移植的运行环境中。通过使用容器,开发者可以将应用程序与其运行环境隔离开来,并实现快速部署和跨平台运行。
k8s 提供了一套丰富的功能,用于管理容器化应用的生命周期。它的核心概念包括:
Pod
:Pod 是 k8s 管理的最小调度单位,它可以包含一个或多个容器,并共享网络和存储资源。Pod 提供了容器之间的通信和协作。Deployment
:Deployment 定义了应用程序的期望状态,并负责创建和管理 Pod 的副本。它支持滚动更新、回滚和扩缩容等操作。Service
:Service 定义了一组 Pod 的访问方式和网络策略,为 Pod 提供了稳定的网络端点。Service 可以通过负载均衡将请求分发到后端的 Pod上。Namespace
:Namespace 提供了一种逻辑隔离的机制,用于将集群中的资源划分为多个虚拟集群。不同的 Namespace 可以拥有独立的资源配额、访问控制策略等。Volume
:Volume 是用于持久化数据的抽象,它可以在 Pod 之间共享和持久化存储数据。k8s 支持多种类型的 Volume,如本地磁盘、网络存储等。
除了上述核心概念之外,k8s 还提供了许多其他功能,包括自动扩展、存储管理、配置管理、日志和监控等。它支持水平扩展和自动化恢复,可以根据应用程序的资源需求和约束条件自动调度和管理容器的运行。k8s 还提供了丰富的 API 和命令行工具,使得开发者和运维人员可以方便地管理和操作容器化应用。
k8s 的设计目标是高度可扩展和高可用的,可以在大规模的集群上运行和管理应用程序。它可以部署在各种云平台和裸机环境中,支持多种操作系统和容器运行时。k8s 已经成为容器编排领域的事实标准,被广泛应用于云原生应用的开发和运维中。
为什么要使用 k8s
当你的应用只是跑在一台机器,直接一个 docker + docker-compose 就够了,方便轻松;
当你的应用需要跑在3、4台机器上,你依旧可以每台机器单独配置运行环境 + 负载均衡;
当你应用访问数不断增加,机器逐渐增加到十几台、上百台、上千台时,每次加机器、软件更新、版本回滚,都会变得非常麻烦、痛不欲生
这时候,k8s 就可以一展身手了;
它是一个全新的基于容器技术的分布式架构领先方案,是谷歌十几年依赖大规模应用容器技术的经验积累和升华的一个重要成果。
运维、部署问题。集群拓展问题、容器编排管理问题
若是咱们的系统设计遵循了 k8s 的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码或功能模块,均可以马上从咱们的视线消失,咱们没必要再费心于负载均衡器和部署实施问题,没必要再考虑引用或本身开发一个复杂的服务治理框架,没必要再头疼于服务监控和故障处理模块的开发。使用 k8s 提供的解决方案,咱们节省了超过30%的开发成本,同时能够将精力更加集中于业务自己,并且因为 k8s 提供了强大的自动化机制,因此系统后期的运维难度和运维成本也大幅度下降。
k8s 是一个开放的开发平台。没有限定任何编程接口,因此不管是 Java、Go、C++ 还是用 python 编写的服务,均可以毫无困难地映射为 k8s 的Service,并经过标准的 TCP 通讯协议进行交互。此外,因为 k8s 平台对现有的编程语言、编程框架、中间价没有任何侵入性,所以现有的系统很容易改造升级并迁移到 k8s 平台上。
IT 行业历来都是一个由新技术驱动的行业。
新兴的容器化技术当前已经被不少公司所采用,其从单机走向集群已成为必然,而云计算的蓬勃发展正在加速这一进程。k8s 做为当前惟一被业界普遍承认和看好的容器分布式系统解决方案,能够预见,在将来几年内,会有大量的新系统选择它,无论这些系统是运行在企业本地服务器或者是被托管到公有云上。
项目部署的发展历程
谈起 k8s 的发展历史,首先回顾一下项目部署的发展历程,分布经历了物理机、虚拟机、容器化三个阶段的演变。
- 传统部署时代:
早期,应用程序直接在物理服务器上运行,无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且维护许多物理服务器的成本很高。
- 虚拟化部署时代:
为了解决物理机存在的弊端,引入了虚拟化技术,支持在单个物理服务器的 CPU 上运行多个虚拟机(VM),每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。虚拟化技术允许应用程序在 VM 之间隔离,提供一定程度的安全,一个应用程序的信息不能被另一应用程序随意访问。虚拟化技术能够更好地利用物理服务器上的资源,由于可轻松地添加或更新应用程序而实现更好的可伸缩性,降低了硬件成本。
- 容器部署时代:
容器类似于 VM,但是具有被放宽的隔离属性,可以在应用程序之间共享操作系统,因此容器被认为是轻量级的隔离。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等,由于它们与基础架构分离,因此可以跨云和操作系统发行版本进行移植。
问题出现:一旦容器多了,如何进行管理
随着微服务、容器化等技术的发展,解决了资源利用率不高的问题,但是随之而来却是如何进行容器管理,过多的容器使得运维工作也成为了一种负担,因此容器编排对于大型依托于容器化部署的分布式系统至关重要。在容器编排方面,k8s 所扮演的角色如下图所示:
k8s 相当于在容器之上,对服务器资源以及容器调度等过程进行管理
k8s 的特点与功能
特点:
- 可移植:支持公有云,私有云,混合云,多重云;
- 可扩展:模块化,插件化,可挂载,可组合;
- 自动化:自动部署,自动重启,自动复制,自动伸缩/扩展。
功能:
- 自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器。
- 自我修复(自愈能力):当容器失败时,会对容器进行重启;当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务。
- 水平扩展:通过简单的命令、用户UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁。
- 服务发现:用户不需使用额外的服务发现机制,就能够基于 k8s 自身能力实现服务发现和负载均衡。
- 滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新。
- 版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退。
- 密钥和配置管理:在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
- 存储编排:自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要,存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph、Cinder 等)公共云存储服务等
k8s 优点
k8s 作为一个容器编排平台,具有许多优点,使其成为云原生应用开发和运维的首选工具
- 自动化管理:k8s 可以自动化地部署、扩展和管理应用程序。它提供了丰富的功能,如自动调度、自动伸缩、自动恢复等,减轻了人工管理的负担,提高了应用程序的可靠性和稳定性。
- 弹性扩展:k8s 支持水平扩展,可以根据应用程序的负载情况动态调整应用程序的副本数量。当负载增加时,k8s 可以自动添加新的副本来处理更多的请求,当负载减少时,k8s 可以自动缩减副本数量,以节省资源。
- 高可用性:k8s 具有高可用性的设计,可以在集群中自动进行容器的调度和迁移,以实现故障转移和负载均衡。它可以检测到容器或节点的故障,并自动重新调度容器到可用节点上,从而确保应用程序的连续可用性。
- 灵活的部署模型:k8s 可以部署各种类型的应用程序,包括微服务架构、传统的单体应用程序、批处理作业等。它提供了丰富的部署配置选项,可以根据应用程序的需求进行定制化配置,并支持多种部署策略,如滚动更新、蓝绿部署等。
- 跨平台和云厂商无关性:k8s 可以在各种云平台和裸机环境中部署和运行,它与特定的操作系统和容器运行时无关。这意味着开发者可以在不同的环境中无缝迁移应用程序,而不必担心依赖于特定的硬件或软件。
- 强大的生态系统:k8s 拥有庞大的社区和丰富的生态系统,提供了许多插件和工具,用于扩展和增强其功能。开发者可以从这些插件中选择适合自己需求的工具,以满足特定的开发和运维需求。
- 可观测性和监控:k8s 提供了丰富的监控和日志功能,可以实时监控应用程序的状态和性能指标,帮助开发者快速诊断和解决问题。它还支持集成外部监控工具和日志分析系统,以进一步增强可观测性。
总的来说,k8s 具有自动化管理、弹性扩展、高可用性、灵活的部署模型、跨平台和云厂商无关性、强大的生态系统以及可观测性和监控等优点,使其成为容器编排领域的事实标准,被广泛应用于云原生应用的开发和运维中。
k8s 设计架构
k8s 集群 = 多个 master node + 多个 work node
k8s 中包含了很多新的概念,它通过整合资源,提供了一套便于应用部署的方案及实现,极大减少了系统运维的工作量。
官方架构设计图:
k8s 通常是集群化部署,一个 k8s 集群由一组被称作节点(Node)的机器组成,一个节点可以理解为一台服务器,这些节点上运行 k8s 所管理的容器化应用。集群具有至少一个控制节点(MasterNode)和若干工作节点(WorkNode),节点可以是物理机或者虚拟机。
控制节点包含了控制平面(Contro Plane),控制平面中的组件用来管理整个集群,工作节点用来托管对应的工作负载 Pod。
一般来说节点上都会包含 kubelet、kube-proxy 等组件以及容器运行时。
需要知道的一些概念:
- 控制平面:让我们从 k8s 集群的神经中枢(即控制平面)开始说起。在这里,我们可以找到用于控制集群的 k8s 组件以及一些有关集群状态和配置的数据。这些核心 k8s 组件负责处理重要的工作,以确保容器以足够的数量和所需的资源运行。 控制平面会一直与您的计算机保持联系。集群已被配置为以特定的方式运行,而控制平面要做的就是确保万无一失。
- kube-apiserver:如果需要与您的 k8s 集群进行交互,就要通过 API。k8s API 是 k8s 控制平面的前端,用于处理内部和外部请求。API 服务器会确定请求是否有效,如果有效,则对其进行处理。您可以通过 REST 调用、kubectl 命令行界面或其他命令行工具(例如 kubeadm)来访问 API。
- kube-scheduler:您的集群是否状况良好?如果需要新的容器,要将它们放在哪里?这些是 k8s 调度程序所要关注的问题。调度程序会考虑容器集的资源需求(例如 CPU 或内存)以及集群的运行状况。随后,它会将容器集安排到适当的计算节点。
- kube-controller-manager:控制器负责实际运行集群,而 k8s 控制器管理器则是将多个控制器功能合而为一。控制器用于查询调度程序,并确保有正确数量的容器集在运行。如果有容器集停止运行,另一个控制器会发现并做出响应。控制器会将服务连接至容器集,以便让请求前往正确的端点。还有一些控制器用于创建帐户和 API 访问令牌。
- etcd:配置数据以及有关集群状态的信息位于 etcd(一个键值存储数据库)中。etcd 采用分布式、容错设计,被视为集群的最终事实来源。
- 容器集 Pod:容器集是 k8s 对象模型中最小、最简单的单元。它代表了应用的单个实例。每个容器集都由一个容器(或一系列紧密耦合的容器)以及若干控制容器运行方式的选件组成。容器集可以连接至持久存储,以运行有状态应用。
- 容器运行时引擎:为了运行容器,每个计算节点都有一个容器运行时引擎。比如 docker,但 k8s 也支持其他符合开源容器运动(OCI)标准的运行时,例如 rkt 和 CRI-O。
- kubelet:每个计算节点中都包含一个 kubelet,这是一个与控制平面通信的微型应用。kubelet 可确保容器在容器集内运行。当控制平面需要在节点中执行某个操作时,kubelet 就会执行该操作。
- kube-proxy:每个计算节点中还包含 kube-proxy,这是一个用于优化 k8s 网络服务的网络代理。kube-proxy 负责处理集群内部或外部的网络通信。
k8s 使用场景
k8s 适用于各种使用场景,尤其适用于云原生应用的开发和运维。以下是一些常见的k8s 使用场景:
- 微服务架构:k8s 可以有效地管理和部署微服务架构。它可以将不同的微服务部署为独立的容器,通过 Service 和 Ingress 等机制实现微服务之间的通信和负载均衡。k8s 提供了弹性扩展和自动恢复的能力,可以根据负载情况动态调整微服务的副本数量,确保高可用性和性能。
- 自动化部署和持续集成/持续交付(CI/CD):k8s 可以与 CI/CD 工具集成,实现自动化的部署和持续交付。开发者可以使用 k8s 的 Deployment 和Service 等资源对象定义应用程序的期望状态,并通过 CI/CD 工具自动构建、测试和发布应用程序到 k8s 集群中。
- 弹性扩展和负载均衡:k8s 支持水平扩展,可以根据应用程序的负载情况动态调整副本数量。它可以根据负载自动添加或删除容器实例,并通过Service 和 Ingress 等机制实现负载均衡,确保请求能够平均分发到后端的容器上。
- 多租户和多环境管理:k8s 提供了 Namespace 的概念,可以将集群中的资源划分为多个虚拟集群,实现多租户的管理。通过使用不同的Namespace,可以将不同的应用程序或不同的环境(如开发、测试、生产)隔离开来,提供更好的资源隔离和安全性。
- 批处理和定时任务:k8s 可以用于批处理作业和定时任务的管理。通过使用 CronJob 等资源对象,可以定义和调度定时任务,例如数据处理、报表生成等。k8s 提供了任务的并行执行、故障恢复和任务状态监控等功能,适用于处理大规模的批处理工作负载。
- 混合云和多云环境管理:k8s 具有跨平台和云厂商无关性的特性,可以在混合云和多云环境中部署和管理应用程序。它可以在不同的云平台上运行,如 AWS、Azure、Google Cloud 等,同时也可以在私有云和裸机环境中部署。这使得开发者可以在不同的环境中无缝迁移应用程序,并减少对特定云厂商的依赖。
总的来说,k8s 适用于微服务架构、自动化部署和 CI/CD、弹性扩展和负载均衡、多租户和多环境管理、批处理和定时任务,以及混合云和多云环境管理等多种使用场景。它提供了丰富的功能和灵活的配置选项,使开发者能够更方便地管理和运维容器化应用程序。