1.1 Kubernetes的诞生到应用
-
Kubernetes的诞生源于对高效管理和部署大规模容器化应用的需求,它由Google基于其内部使用的Borg系统的核心理念而设计,并在2014年开源,迅速吸引了全球开发者和企业的关注。凭借其开放性和灵活性,Kubernetes快速聚集了一个活跃的社区,并得到了包括Red Hat、IBM、Microsoft等在内的众多企业的支持。2015年,Kubernetes加入云原生计算基金会(CNCF),进一步加速了其发展。
-
随着技术的成熟,Kubernetes开始被广泛应用于企业级生产环境,以其自动化部署、无缝扩展和自我修复的特性,极大地提升了运维效率和系统稳定性。云服务提供商的支持也使得Kubernetes的部署和管理变得更加便捷。如今,Kubernetes不仅是容器编排领域的一个标杆,更成为了云原生技术栈的核心,持续推动着云计算和微服务架构的发展。
1.2 Kubernetes主要特点
-
自动化部署和扩展:Kubernetes可以自动部署容器并根据需求进行扩展。
-
自我修复能力:能够自动替换失败的容器,确保服务的持续运行。
-
服务发现和负载均衡:提供内置的服务发现和负载均衡功能。
-
滚动更新:支持无停机的滚动更新,以及必要时的回滚操作。
-
跨主机网络:为容器提供跨主机的网络连接。
-
安全性:提供包括访问控制和安全策略在内的多种安全特性。
-
生态系统:拥有一个庞大且活跃的生态系统,支持广泛的工具和服务。
-
可扩展性:设计上支持大规模集群,能够管理成千上万的节点。
1.3 Kubernetes的应用
1.3.1 为什么Kubernetes被广泛应用
Kubernetes(通常称为K8s)之所以受到广泛欢迎,是因为它提供了一系列的优势,特别是在支持微服务架构、系统迁移、扩容能力以及管理工具方面。
-
多容器支持:K8s不仅支持Docker,还能运行其他容器技术如Rocket。
-
微服务架构:K8s非常适合微服务架构,简化了服务的部署和管理。
-
灵活迁移:系统可以轻松地整体迁移,无论是跨云还是到本地环境。
-
横向扩容:K8s具备强大的横向扩容能力,可以根据需求动态调整资源。
-
管理工具:提供了一系列工具,覆盖开发、部署、测试和运维监控的全流程。
1.3.2 具体事件举例
-
Twitter宣布全面采用Kubernetes来管理其容器化基础设施,这一决策反映了Kubernetes在容器编排领域的领先地位和广泛认可。
-
阿里云在2019年年底停止对Docker Swarm的支持
1.4 kubernetes概念
-
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
-
Node:Kubernetes中的工作负载节点,负责运行容器。Master节点负责调度并将容器分配到这些Node上。
-
Pod:Kubernetes的最小控制单元,容器化应用程序运行在Pod中。一个Pod可以包含一个或多个紧密相关的容器。
-
Controller:用于管理Pod的生命周期,包括创建、扩展、缩减和删除Pod。常见的控制器有Deployment、ReplicaSet等。
-
Service:为一组执行相同功能的Pod提供统一的访问接口,无论Pod如何变化,Service都保持稳定。
-
Scaling(伸缩):自动调整容器数量。
-
Label:用于在资源上添加标识符,允许通过Selector选择和操作具有相同标签的资源。
-
Namespace:用于隔离集群资源,Pod、Service等可以被分配到不同的Namespace中,实现环境隔离。
-
Volume:用于持久化存储数据。
-
Ingress:管理外部网络访问集群服务的规则。
-
Deployment:负责Pods的部署和更新。
1.5 Kubernetes组件
1.5.1 Master节点
Master节点负责整个Kubernetes集群的管理和控制。它的核心组件包括:
-
API Server:作为系统的大脑,提供Kubernetes API的接口,处理所有的RESTful请求和集群内的数据变化。
-
Scheduler:负责监视新创建的Pods,决定将它们放置在哪个Node上,以达到最优的资源利用和负载均衡。
-
Controller Manager:运行各种控制器进程,例如负责Deployment的控制器会确保指定数量的Pod副本始终运行。
-
etcd:作为集群的数据库,存储了整个Kubernetes集群的状态信息,包括Pods、Service、ConfigMaps等所有资源的信息。
1.5.2 Node节点
Node节点是Kubernetes集群中的工作节点,负责运行应用程序容器。每个Node节点上运行的组件包括:
-
Kubelet:直接与Master节点通信,负责启动Pods中的容器、监控容器运行状态,并上报状态信息回Master。
-
Container Runtime:负责实际运行容器,如Docker、containerd等,Kubernetes通过容器运行时接口(CRI)与这些运行时进行交互。
-
Kube-proxy:负责Pods的网络代理,实现服务发现和负载均衡,确保Pods可以互相通信,以及外部请求能够分发到正确的Pod。
-
Docker或类似的工具:作为容器运行时,负责拉取容器镜像,并运行容器。
1.5.3 核心组件
组件名称 | 功能描述 |
---|---|
etcd | 轻量级且可靠的分布式键值存储系统,用于保存Kubernetes集群的所有数据。 |
apiserver | Kubernetes API的前端,处理资源的增删改查操作,提供认证、授权、访问控制等安全机制。 |
controller manager | 执行集群事件的后台处理,包括故障检测、自动扩展、滚动更新等任务。 |
scheduler | 决定将新的Pods调度到哪个Node上运行,实现资源的最优分配。 |
kubelet | 在每个Node上运行,负责维护容器的生命周期,包括启动容器、监控容器运行状态、管理Volume和网络。 |
Container runtime | 负责镜像管理以及Pod和容器的运行,是容器运行时接口(CRI)的实现。 |
kube-proxy | 实现Kubernetes服务的负载均衡,提供服务发现功能。 |
1.5.4 附加组件
组件名称 | 功能描述 |
---|---|
CoreDNS | 集群内的DNS服务,允许Pods通过DNS名称进行通信。 |
Ingress Controller | 管理外部访问集群服务的规则,通常用于HTTP路由到集群内的多个服务。 |
Monitoring and Logging | 集群通常会集成监控和日志系统,如Prometheus和Elasticsearch,以便于监控和分析集群状态。 |
Network Plugin | 实现Pods之间的网络通信和Pod与外部网络的交互。 |
1.5.5 其他额外的功能组件
组件/工具名称 | 功能描述 |
---|---|
Fluentd/Elasticsearch | 日志收集和存储,通常与Kibana结合使用进行日志可视化和分析。 |
Prometheus | 开源监控系统,用于收集和存储指标,监控Kubernetes集群和应用。 |
Helm | Kubernetes的包管理器,用于定义、安装和升级Kubernetes应用。 |
Rook | 在Kubernetes上部署和管理存储系统的开源项目。 |
Istio | 服务网格,提供智能路由、流量管理、策略执行和数据收集。 |
Cert-Manager | 自动化证书管理工具,为Kubernetes服务提供和续订TLS证书。 |
Argo CD | GitOps风格的持续交付工具,用于Kubernetes。 |
Strimzi | 在Kubernetes上运行Apache Kafka的支持。 |
Voyager | Ingress控制器和HAProxy负载均衡器的云原生解决方案。 |
Tiller | Helm的后端服务,管理Helm charts的状态。 |
Cilium | 提供网络和安全的扩展,支持细粒度的安全性和网络策略。 |
Knative | 构建现代、源代码驱动的、Kubernetes-native应用的库和工具。 |
MetalLB | 为Kubernetes集群提供额外的负载均衡层的负载均衡器。 |
Multus | 允许Pods使用多个网络接口的网络插件。 |
Kube-state-metrics | 提供Kubernetes集群中各种资源的指标收集。 |
Kubecost | 成本监控工具,帮助用户理解Kubernetes集群的资源使用和成本。 |
OpenEBS | 为Kubernetes提供动态存储的开源存储解决方案。 |
SPIRE | 用于Kubernetes的零信任网络和安全的项目。 |
Kong | 可以与Kubernetes集成的API网关和服务网格。 |
GitOps | 使用Git管理基础设施和应用交付的方法论,通过Git仓库维护Kubernetes集群状态。 |
1.5.6 Kubernetes系统各个组件调用关系示例
在Kubernetes中部署nginx服务的过程涉及多个组件的协同工作:
步骤 | 组件/角色 | 功能描述 |
---|---|---|
用户请求 | 用户 | 通过kubectl 命令行工具发起部署nginx服务的请求。 |
API Server | Kubernetes API Server | 接收请求并验证,将请求信息写入etcd 。 |
Scheduler | Kubernetes Scheduler | 监听到Pod创建请求后,选择合适的Node节点部署Pod。 |
Controller Manager | Kubernetes Controller Manager | 根据Scheduler的决策更新状态并指导Pod在选定的Node上创建。 |
Kubelet | Kubernetes Kubelet | 在Node节点上接收Master指令,启动容器运行时拉取镜像并启动Pod。 |
Pod启动 | Pod | 容器运行时创建nginx容器,Pod开始在Node上运行。 |
Service和kube-proxy | Service, kube-proxy | 创建Service对象以访问nginx服务,kube-proxy实现服务发现和负载均衡。 |
访问服务 | 外部请求 | 通过Service访问nginx服务,Service确保请求分配到所有运行的nginx Pod上。 |
1.6 Kubernetes架构
1.6.1 基本架构
-
Master节点:负责整个集群的管理和调度工作。它由以下几个主要组件组成:
-
API Server:集群的前端,提供Kubernetes API接口。
-
Scheduler:负责决定将新的Pods分配到哪个Node上。
-
Controller Manager:运行各种控制器,如Deployment Controller、Service Controller等。
-
etcd:轻量级数据库,存储集群的所有数据。
-
-
Node节点:执行实际工作,运行Pods。每个Node上运行着:
-
Kubelet:负责启动Pods中的容器,以及与Master节点通信。
-
Kube-proxy:负责Pods的网络代理,实现服务发现和负载均衡。
-
1.6.2 应用部署架构分类
-
无中心节点架构:
-
GlusterFS:一个分布式文件系统,提供可扩展的存储解决方案。
-
Ceph:一个统一的分布式存储系统,支持块设备、对象存储和文件系统。
-
-
有中心节点架构:
-
HDFS (Hadoop Distributed File System):一个高度可靠的、可扩展的分布式文件系统,设计用于存储大规模数据集。
-
Kubernetes:虽然Kubernetes本身不直接提供存储服务,但它可以与GlusterFS、Ceph等分布式存储系统配合使用,提供强大的存储解决方案。
-
1.6.3 Kubernetes Cluster组成
-
Master和Node:Kubernetes Cluster由一个或多个Master节点和多个Node节点组成。
-
Kubernetes服务在Node节点上运行的服务,包括但不限于:
-
容器运行时:如Docker或containerd,负责运行容器。
-
网络插件:提供Pods之间的网络连接和外部访问。
-
存储插件:与外部存储系统集成,提供持久化存储。
-
1.6.4 Kubernetes设计架构
-
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。
1.6.5 Kubernetes体系结构
步骤 | 组件/角色 | 功能描述 |
---|---|---|
用户提交请求 | 用户 | 通过kubectl 提交Pod配置文件(YAML或JSON格式)。 |
API Server | Kubernetes API Server | 接收并验证Pod创建请求,将配置存储在etcd 中。 |
Scheduler | Kubernetes Scheduler | 监听Pod创建请求,选择最合适的Node运行Pod。 |
Kubelet | Kubernetes Kubelet | 在选定Node上启动Pod,与容器运行时交互拉取镜像并启动容器。 |
Replication Controller (RC) | Kubernetes Replication Controller | 监视Pod状态和数量,替换故障Pod以维持指定数量。 |
Service | Kubernetes Service | 提供一组相同功能Pods的统一访问接口,保持IP和端口不变。 |
Kube-proxy | Kubernetes Kube-proxy | 实现Service的功能,进行服务发现和负载均衡。 |
1.6.6 Kubernetes控制节点Master
在Kubernetes中,Master节点的作用就像是一个指挥官,它负责整个集群的管理和决策。
-
接收命令:当用户通过
kubectl
命令行工具发起操作,比如部署一个新的Pod,这个命令会发送到Master节点的API Server。 -
存储状态:API Server是所有请求的入口,它处理这些请求,并将相关的信息持久化到etcd。etcd是一个关键的存储系统,它保存了集群的所有状态信息,包括所有的Pods、Service和配置数据。
-
调度决策:一旦Pod的创建请求被API Server接受并存储,Scheduler就会介入。Scheduler的角色是策略制定者,它根据集群当前的状态和Pod的调度要求,决定将这个Pod放在哪个Node上运行。
-
执行操作:Scheduler做出决策后,会通知API Server,API Server更新Pod的状态,指派给选定的Node。然后,Controller Manager会监控这个状态的变化。
-
Node执行:在Node节点上,Kubelet这个组件会定期向API Server报告自己的状态,一旦它接收到新的Pod创建指令,就会与容器运行时(比如Docker)协作,拉取所需的容器镜像,并在Node上启动Pod。
-
监控和维护:Controller Manager会持续监控集群的状态,确保一切运行如预期。如果有Pod失败,Deployment Controller会替换新的Pod来保持应用的稳定性和可用性。
-
服务发现和负载均衡:当Pod运行起来后,为了使服务对内部或外部可见,用户可能会创建Service对象。Kube-proxy负责实现服务发现和负载均衡,确保流量可以正确地分配到后端的Pods。
1.6.7 Etcd概述
etcd是Kubernetes集群中不可或缺的组件,它作为一个高可用的键值存储系统,承担着存储集群状态信息的重要职责。
-
高可用性:etcd通过复制数据到多个节点来保证系统的高可用性,即使部分节点失效,集群仍能正常工作。
-
键值存储:它提供了一个简单的键值存储接口,用于存储和检索数据。
-
服务发现:在分布式系统中,etcd可用于服务发现,允许节点相互发现并通信。
-
轻量级:与ZooKeeper相比,etcd更加轻量级,易于集成和使用。
-
安全性:支持SSL/TLS,提供了数据传输过程中的加密和认证。
-
性能:能够支持高并发写操作,满足高性能需求。
-
一致性:使用Raft一致性算法,保证了分布式系统中数据的强一致性。
1.6.7.1 Etcd的特点
-
简单性:提供了基于HTTP+JSON的API,使得使用curl命令行工具就能轻松操作。
-
安全性:支持SSL客户端认证,增强了数据传输的安全性。
-
快速性:高性能的读写能力,能够应对大量的并发操作。
-
可信性:基于Raft算法,确保了数据的可靠性和一致性。
1.6.7.2 应用场景
-
Kubernetes Node:存储集群的状态信息,如Pods、Service、ConfigMaps等。
-
Worker Node:在分布式工作节点中,etcd可用于存储和同步工作状态。
-
服务发现:作为服务注册与发现中心,允许服务实例动态地加入和离开。
-
消息发布与订阅:可以作为发布/订阅模型的消息中心。
-
负载均衡:存储负载均衡器的配置信息,以便进行流量分发。
-
分布式通知与协调:在分布式系统中,用于节点间的通知和协调工作。
-
分布式锁:提供锁服务,以支持跨多个实例的同步操作。
-
分布式队列:可以作为分布式队列系统,协调任务的执行。
-
集群监控:存储集群监控数据,便于跟踪和分析集群状态。
-
Leader选举:在集群中,用于Leader节点的选举过程。
1.6.7 Kubernetes工作节点Node
在Kubernetes集群中,除了Master节点,其他所有机器都被称为Node节点(在早期的版本中也称为Minion节点)。Node节点是集群中执行实际工作负载的地方,它们负责运行容器化的应用程序。
-
接收任务:Node节点通过Kubelet与Master节点通信,接收运行Pods的任务。这些任务由Master节点的调度器根据资源需求和策略决定。
-
容器运行时:Kubelet使用容器运行时(如Docker或containerd)来拉取容器镜像,并在Node上启动容器。这是Node节点上实际运行应用程序的地方。
-
监控和报告:Kubelet持续监控Pods的状态,包括它们的健康状态和资源使用情况,并将这些信息反馈给Master节点。
-
网络配置:Node上的网络插件负责为Pods配置网络,确保Pods可以相互通信,以及与外部世界通信。
-
Pod管理:Kubelet管理Pods的生命周期,处理Pods的创建、运行和销毁。
-
日志管理:Node节点还负责收集容器的日志,这些日志对于调试和监控应用程序至关重要。
-
服务发现和负载均衡:kube-proxy在Node上运行,负责服务发现和实现Pods之间的负载均衡,以及对外提供稳定的服务访问点。
-
资源监控:Node节点上的资源监控工具(如cAdvisor)收集节点和容器的性能指标,这些信息可以用于监控和调试。
-
自我修复:如果Pod因为某些原因失败,Kubelet会尝试重启Pod,实现自我修复。
Node节点的主要角色和组件的描述:
组件/概念 | 功能描述 |
---|---|
工作负载执行 | Node节点接收并执行由Master节点分配的Docker容器,运行应用程序。 |
故障转移 | Node节点故障时,Master节点自动将工作负载转移到其他健康节点,保证服务连续性。 |
Kubelet | 负责启动和管理Pods中的容器,监控容器状态,与Master节点通信,汇报节点健康状况。 |
资源调度 | Master节点根据Kubelet提供的信息进行资源使用情况的监控和调度。 |
通信中断 | Node节点若在指定时间内未向Master汇报,将被判定为“失联”,Master将转移其工作负载。 |
Kube-proxy | 负责实现Kubernetes Service的通信和负载均衡,监控Pods变化,实现服务发现。 |
Docker Engine | 提供容器运行时环境,创建和管理容器,保证应用程序在隔离且一致的环境中运行。 |
1.7 Kubernetes分层架构
-
Kubernetes的架构设计采用了分层的方法,每一层都为上一层提供服务,同时抽象掉底层的复杂性。
层次 | 组件/概念 | 功能描述 |
---|---|---|
核心层 | API Server, Scheduler, Controller Manager, etcd | Kubernetes最核心的功能,提供API构建高层应用,对内提供插件式应用执行环境。 |
应用层 | Deployment, Service, Ingress | 定义应用程序的部署状态和访问方式,提供服务发现和负载均衡功能。 |
服务发现与负载均衡层 | Service, Ingress | 管理服务发现和负载均衡,实现外部和内部通信。 |
集群管理层 | Node, Pod, kubelet, kube-proxy | Node运行Pods,kubelet管理Pods生命周期,kube-proxy负责网络代理。 |
集群基础设施层 | Master节点, API Server, Scheduler, Controller Manager | Master节点控制集群,API Server提供API接口,Scheduler进行Pod调度,Controller Manager运行控制器。 |
节点基础设施层 | 容器运行时 (如Docker或containerd), OS | 容器运行时管理容器,操作系统提供运行环境。 |
存储层 | Persistent Volumes, Persistent Volume Claims | 提供持久化存储解决方案,供Pods使用。 |
安全层 | 认证, 授权, 网络策略 | 确保集群安全性,包括访问控制和网络安全。 |
底层基础设施 | 硬件资源 | 提供服务器、网络和存储等物理或虚拟硬件资源。 |
管理层 | 系统度量, 自动化, 策略管理 | 系统度量(基础设施、容器、网络度量), 自动化(自动扩展、动态Provision等), 策略管理(RBAC、Quota、PSP、NetworkPolicy等) |
接口层 | kubectl命令行工具, 客户端SDK, 集群联邦 | 提供与Kubernetes集群交互的方法。 |
生态系统 | Kubernetes外部, Kubernetes内部 | 外部:日志、监控、配置管理、CI/CD、Workflow、FaaS、OTS应用、ChatOps等。内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群配置和管理等。 |
-
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示