1.1 Kubernetes的诞生到应用

  • Kubernetes的诞生源于对高效管理和部署大规模容器化应用的需求,它由Google基于其内部使用的Borg系统的核心理念而设计,并在2014年开源,迅速吸引了全球开发者和企业的关注。凭借其开放性和灵活性,Kubernetes快速聚集了一个活跃的社区,并得到了包括Red Hat、IBM、Microsoft等在内的众多企业的支持。2015年,Kubernetes加入云原生计算基金会(CNCF),进一步加速了其发展。

  • 随着技术的成熟,Kubernetes开始被广泛应用于企业级生产环境,以其自动化部署、无缝扩展和自我修复的特性,极大地提升了运维效率和系统稳定性。云服务提供商的支持也使得Kubernetes的部署和管理变得更加便捷。如今,Kubernetes不仅是容器编排领域的一个标杆,更成为了云原生技术栈的核心,持续推动着云计算和微服务架构的发展。

1.2 Kubernetes主要特点

  • 自动化部署和扩展:Kubernetes可以自动部署容器并根据需求进行扩展。

  • 自我修复能力:能够自动替换失败的容器,确保服务的持续运行。

  • 服务发现和负载均衡:提供内置的服务发现和负载均衡功能。

  • 滚动更新:支持无停机的滚动更新,以及必要时的回滚操作。

  • 跨主机网络:为容器提供跨主机的网络连接。

  • 安全性:提供包括访问控制和安全策略在内的多种安全特性。

  • 生态系统:拥有一个庞大且活跃的生态系统,支持广泛的工具和服务。

  • 可扩展性:设计上支持大规模集群,能够管理成千上万的节点。

image-20240502200336742

1.3 Kubernetes的应用

1.3.1 为什么Kubernetes被广泛应用

Kubernetes(通常称为K8s)之所以受到广泛欢迎,是因为它提供了一系列的优势,特别是在支持微服务架构、系统迁移、扩容能力以及管理工具方面。

  • 多容器支持:K8s不仅支持Docker,还能运行其他容器技术如Rocket。

  • 微服务架构:K8s非常适合微服务架构,简化了服务的部署和管理。

  • 灵活迁移:系统可以轻松地整体迁移,无论是跨云还是到本地环境。

  • 横向扩容:K8s具备强大的横向扩容能力,可以根据需求动态调整资源。

  • 管理工具:提供了一系列工具,覆盖开发、部署、测试和运维监控的全流程。

1.3.2 具体事件举例

  • Twitter宣布全面采用Kubernetes来管理其容器化基础设施,这一决策反映了Kubernetes在容器编排领域的领先地位和广泛认可。

image-20240502200941285

  • 阿里云在2019年年底停止对Docker Swarm的支持

image-20240502201033497

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或类似的工具:作为容器运行时,负责拉取容器镜像,并运行容器。

image-20240502222719319

1.5.3 核心组件

组件名称功能描述
etcd轻量级且可靠的分布式键值存储系统,用于保存Kubernetes集群的所有数据。
apiserverKubernetes 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集群和应用。
HelmKubernetes的包管理器,用于定义、安装和升级Kubernetes应用。
Rook在Kubernetes上部署和管理存储系统的开源项目。
Istio服务网格,提供智能路由、流量管理、策略执行和数据收集。
Cert-Manager自动化证书管理工具,为Kubernetes服务提供和续订TLS证书。
Argo CDGitOps风格的持续交付工具,用于Kubernetes。
Strimzi在Kubernetes上运行Apache Kafka的支持。
VoyagerIngress控制器和HAProxy负载均衡器的云原生解决方案。
TillerHelm的后端服务,管理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 ServerKubernetes API Server接收请求并验证,将请求信息写入etcd
SchedulerKubernetes Scheduler监听到Pod创建请求后,选择合适的Node节点部署Pod。
Controller ManagerKubernetes Controller Manager根据Scheduler的决策更新状态并指导Pod在选定的Node上创建。
KubeletKubernetes Kubelet在Node节点上接收Master指令,启动容器运行时拉取镜像并启动Pod。
Pod启动Pod容器运行时创建nginx容器,Pod开始在Node上运行。
Service和kube-proxyService, 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),一切都基于分布式的存储系统。

image-20240502222140179


1.6.5 Kubernetes体系结构

image-20240502223518737

步骤组件/角色功能描述
用户提交请求用户通过kubectl提交Pod配置文件(YAML或JSON格式)。
API ServerKubernetes API Server接收并验证Pod创建请求,将配置存储在etcd中。
SchedulerKubernetes Scheduler监听Pod创建请求,选择最合适的Node运行Pod。
KubeletKubernetes Kubelet在选定Node上启动Pod,与容器运行时交互拉取镜像并启动容器。
Replication Controller (RC)Kubernetes Replication Controller监视Pod状态和数量,替换故障Pod以维持指定数量。
ServiceKubernetes Service提供一组相同功能Pods的统一访问接口,保持IP和端口不变。
Kube-proxyKubernetes 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。

image-20240502223938495

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,实现自我修复。

image-20240502224540581

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, etcdKubernetes最核心的功能,提供API构建高层应用,对内提供插件式应用执行环境。
应用层Deployment, Service, Ingress定义应用程序的部署状态和访问方式,提供服务发现和负载均衡功能。
服务发现与负载均衡层Service, Ingress管理服务发现和负载均衡,实现外部和内部通信。
集群管理层Node, Pod, kubelet, kube-proxyNode运行Pods,kubelet管理Pods生命周期,kube-proxy负责网络代理。
集群基础设施层Master节点, API Server, Scheduler, Controller ManagerMaster节点控制集群,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的分层架构,如下图所示

image-20240502225223322

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐