宏观概述
Kubernetes 主要由以下几个核心组件组成,首先要有个宏观概念:
- API Server(API 服务器): API 服务器是 Kubernetes 集群控制平面的前端,处理来自用户和其它组件的 API 请求,验证请求并将配置数据持久化。
- kubelet: kubelet 是运行在每个节点上的代理,它负责与 Master 节点通信,确保节点上运行的容器处于预期状态。
- kube-proxy: kube-proxy 负责维护节点上的网络规则,以及为服务提供负载均衡和代理服务发现功能,以确保服务之间的网络通信。
- etcd: etcd 是一个分布式键值存储系统,用于保存集群的配置数据、状态和元数据。它是 Kubernetes 控制平面中的重要组件之一。
- Scheduler(调度器): Scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
- Controller Manager(控制器管理器): 控制器管理器包含多个控制器,用于监控集群状态的变化,并根据所需的状态进行调整。负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
组件通信
Kubernetes 多组件之间的通信原理为
1、API Server 负责 etcd 存储的所有操作,且只有 API Server 才直接操作 etcd 集群
2、API Server 对内(集群中的其他组件)和对外(用户)提供统一的 REST API,其他组件均通过 API Server 进行通信
- Controller Manager、Scheduler、Kube-proxy 和 Kubelet 等均通过 API Server watch API 监测资源变化情况,并对资源作相应的操作
- 所有需要更新资源状态的操作均通过 API Server 的 REST API 进行
3、API Server 也会直接调用 Kubelet API(如 logs, exec, attach 等),默认不校验 Kubelet 证书,但可以通过 --kubelet-certificate-authority
开启(而 GKE 通过 SSH 隧道保护它们之间的通信)
典型的创建 Pod 的流程为
用户通过 REST API 创建一个 Pod
API Server 将 Pod 对象的信息存入 Etcd;
Pod 的创建会生成事件,返回给 API Server;
Controller 监听到事件;
Pod 如果需要要挂载盘,Controller 会检查是否有满足条件的 PV;
若满足条件的 PV,Controller 会绑定 Pod 和 PV,将绑定关系告知 API Server;
API Server 将绑定信息写入 Etcd;
生成 Pod Update 事件;
Scheduler 监听到 Pod Update 事件;
Scheduler 会为 Pod 选择 Node;
如有满足条件的 Node,Scheduler 会绑定 Pod 和 Node,并将绑定关系告知 API Server;
API Server 将绑定信息写入 Etcd;
生成 Pod Update 事件;
Kubelet 监听到 Pod Update 事件,创建 Pod;
Kubelet 告知 CRI(容器运行时接口) 下载镜像,CRI调用ImageService下载镜像;
Kubelet 告知 CRI 运行容器,CRI调用RuntimeService启动容器;
Kubelet 告知 Volume Manager,调用CSI,将盘挂载到 Node 同时挂载到 Pod;
CRI 调用 CNI(容器网络接口) 配置容器网络;
端口号
各组件详解:
1. kube-apiserver
kube-apiserver 是 Kubernetes 控制平面的前端,扮演着用户和其它组件与集群交互的入口。它处理来自客户端、命令行工具和控制器的 API 请求,执行验证、授权和数据持久化,将集群的配置状态存储在 etcd 中。
kube-apiserver 的功能和稳定性对于整个集群的可靠性至关重要。
功能和作用:
- API 前端:kube-apiserver 为 Kubernetes 集群提供了一个统一的 API 入口,允许用户、命令行工具和各种组件通过 RESTful API 与集群进行交互。这包括创建、更新和删除资源对象,如 Pod、Service、Deployment 等。
- 认证和授权:kube-apiserver 负责验证请求的身份,确保只有经过身份验证的用户和组件才能访问 API。此外,它也负责授权,根据用户的权限来决定是否允许请求对资源的操作。
- 数据持久化: 集群的配置数据和状态信息存储在 etcd 中,而 kube-apiserver 负责与 etcd 进行通信,将配置数据持久化到 etcd 中,以及从 etcd 中读取数据。
- 资源管理:kube-apiserver 负责监控资源的状态和变化,并在资源状态发生变化时,通知控制器和其他组件进行相应的操作。这有助于保持集群中各个资源的一致性和期望状态。
- 扩展性和自定义:kube-apiserver 支持多版本 API,允许用户自定义资源类型和自定义控制器,以满足特定的业务需求。
2. etcd
etcd 是 Kubernetes 的分布式键值存储系统,被用于保存集群的配置数据、状态和元数据。作为 Kubernetes 控制平面的持久化存储,etcd 的可靠性和一致性对整个集群的稳定运行至关重要。
etcd 的主要特点包括:
- 一致性: etcd 确保数据存储的强一致性。它使用 Raft 共识算法,使集群中的多个节点能够就数据的状态达成一致。
- 分布式: etcd 被设计用于在多个节点构成的集群中运行。这确保了冗余性和容错性。
- 键值存储: etcd 提供了简单的键值数据模型,您可以使用键存储和检索数据。值可以是字符串、二进制数据,甚至是序列化的数据结构,如 JSON。
- 观察机制: etcd 支持观察机制,允许应用程序在特定键被修改时接收通知。这对于构建对配置或其他关键数据的更改做出反应的应用程序非常有用。
- HTTP/gRPC API: etcd 提供了 HTTP 和 gRPC API,从而方便您使用不同的编程语言和平台与集群交互。
- 配置管理: etcd 经常用于存储分布式应用的配置数据。这使得跨多个应用程序实例更新配置设置变得更加容易。
- 服务发现: etcd 可用于服务发现,允许应用程序动态地发现分布式系统中的服务位置。
- 领导者选举: etcd 的 Raft 共识算法也可以用于领导者选举场景,其中分布式系统需要选择一个协调的领导者节点。
- 安全性: etcd 支持认证和传输加密,以确保集群内的通信安全性。
3. kube-scheduler
kube-scheduler 是 Kubernetes 集群中的一个核心组件,负责在集群中选择合适的节点(Node)来运行新创建的 Pod。它根据一系列的策略和条件,将 Pod 分配到最合适的节点上,以实现负载均衡和资源利用最优化。
以下是 kube-scheduler 的主要工作原理和特点:
- 节点选择策略:kube-scheduler 根据一组可配置的节点选择策略来决定将 Pod 分配到哪个节点。这些策略可以根据资源需求、亲和性(Affinity)、反亲和性(Anti-Affinity)、节点污点(Taints)等因素进行设置。
- 资源利用优化:kube-scheduler 会考虑集群中每个节点的资源利用情况,以确保新的 Pod 被分配到资源充足的节点上,从而避免资源浪费和过度拥塞。
- 亲和性和反亲和性:kube-scheduler 可以配置 Pod 对某些节点的亲和性或反亲和性。这意味着 Pod 可以被分配到满足指定标签的节点上,或者避免分配到具有特定标签的节点上。
- 节点污点和容忍度: 节点可以设置污点,表示它们有某些限制条件,如特定的硬件或软件。Pod 可以通过容忍度设置来表示它们可以容忍的节点污点,这样 kube-scheduler 就会将 Pod 分配到与其容忍度匹配的节点上。
- 插件扩展:kube-scheduler 允许用户通过插件来定制节点选择过程。这使得用户可以根据自己的需求添加自定义的调度策略。
- 可扩展性:kube-scheduler 支持同时运行多个调度器实例,每个实例可以具有不同的配置和策略。这种架构可以根据需求进行横向扩展,以处理更大规模的集群。
- 调度延迟: 由于调度器需要考虑多种因素来做出决策,因此在创建新 Pod 时可能会出现一定的调度延迟。这取决于集群的负载、调度策略和其他因素。
4. kube-controller-manager
kube-controller-manager 是 Kubernetes 集群中的一个核心组件,它负责管理各种控制器,监控集群状态,以及确保集群中的实际状态与期望状态保持一致。这些控制器负责自动化集群中的各种任务和功能,例如副本控制、节点管理、服务和端点等。
以下是 kube-controller-manager 的一些主要功能和控制器示例:
- Replication Controller 控制器: 负责管理Pod副本数,确保在集群中始终有指定数量的Pod实例在运行。如果Pod数目少于期望的数量,Replication Controller 将创建新的 Pod 副本。
- Deployment 控制器: 基于声明式配置,管理 Pod 的部署和更新。它可以创建和管理多个版本的应用程序,支持滚动更新和回滚。
- Node Controller 控制器: 负责监控节点的状态,并确保集群中的节点数目保持在所需的范围内。如果节点离线或不可用,Node Controller 将采取措施进行调整。
- Service Controller 控制器: 确保 Service 对象中定义的网络终结点与底层 Pod 的变化保持一致。它通过更新底层的 Endpoints 对象来实现。
- Namespace Controller 控制器: 确保 Namespace 的创建和删除符合预期,并在命名空间被删除时清理相关资源。
- Persistent Volume Controller 控制器: 监控 Persistent Volume 和 Persistent Volume Claim 的状态,确保正确的存储资源分配。
- Job Controller 控制器: 用于管理一次性任务,确保任务的成功执行。它可以处理任务的重试和失败。
- DaemonSet 控制器: 确保每个节点上都运行有一个 Pod 的副本,适用于在每个节点上运行特定任务的场景。
5. kubelet
kubelet 是 Kubernetes 集群中的一个重要组件,运行在每个节点上,负责管理该节点上的容器和Pod。它与控制平面(如 API Server 和 kube-controller-manager)通信,确保节点上的容器与期望的状态保持一致。
以下是 kubelet 的一些主要功能和工作原理:
- Pod 管理:kubelet 负责管理节点上的 Pod。它根据从 API Server 获取的 Pod 定义(PodSpec)来创建、启动、停止和删除容器。
- 容器生命周期管理:kubelet 负责监控容器的运行状态,并在需要时重新启动失败的容器。它还会处理容器的存储卷挂载、网络设置等操作。
- 资源管理:kubelet 监控节点上的资源利用情况,确保不超出节点的资源限制。它可以根据资源请求和限制设置合适的 QoS 类别,并调整 Pod 资源分配。
- 健康检查和探针:kubelet 通过周期性的健康检查和探针来监控容器的健康状态。如果容器不健康,kubelet 将采取相应的措施,如重新启动容器或从服务中移除。
- Pod 事件和状态报告:kubelet 会将节点上发生的事件和状态信息报告给集群的 API Server,以便控制平面能够跟踪每个节点和 Pod 的状态。
- 与控制平面通信:kubelet 与 API Server 和 kube-controller-manager 进行通信,以获取 Pod 定义、报告状态,以及接收指令来启动或停止容器。
- Pod 生命周期钩子:kubelet 支持在容器生命周期各个阶段执行用户定义的钩子,如容器创建前后、停止前后等。
- 资源配额和限制:kubelet 根据 Pod 的资源请求和限制来监视和限制容器的资源使用。
- 镜像管理:kubelet 从指定的容器镜像仓库中下载镜像,以供启动容器。
6. kube-proxy
kube-proxy 是 Kubernetes 集群中的一个核心组件,负责实现集群内部的网络通信。它通过维护节点上的网络规则和转发规则,为 Pod 提供网络代理和负载均衡功能,以便让集群中的各个 Pod 能够相互通信。
以下是 kube-proxy 的一些主要功能和工作原理:
- 负载均衡:kube-proxy 通过创建虚拟 IP 地址或 IPVS 负载均衡规则,将服务(Service)的流量分发到多个后端 Pod。这使得集群内的应用可以在多个实例之间实现负载均衡。
- 网络代理: 对于服务的流量,kube-proxy 在节点上创建规则以将流量重定向到正确的后端 Pod。这种代理方式使得客户端能够透明地访问服务,而无需知道服务背后的 Pod 是如何部署的。
- Service 实现模式:kube-proxy 支持多种 Service 实现模式,如 iptables、IPVS、以及 userspace。不同模式在不同的网络环境中提供不同的性能和特性。
- Service Discovery:kube-proxy 还提供了服务发现的功能,允许客户端通过 Service 名称来访问服务,而不必知道后端 Pod 的具体 IP 地址。
- 规则维护:kube-proxy 监控 Service 和 Endpoint 的变化,以及 Pod 的增删变化。如果有变化,它会更新相应的规则,确保网络流量被正确地路由到目标 Pod。
- 环境适应性:kube-proxy 的底层实现方式取决于集群节点的操作系统和网络环境。它会根据环境的差异来选择适当的实现模式。
- 高可用性: 通常情况下,每个节点上都运行有一个 kube-proxy 实例,以确保在节点故障时仍然可以维护服务的连通性。
7. 容器运行时(Container Runtime)
容器运行时(Container Runtime)是负责创建、运行和管理容器的软件组件。在 Kubernetes 集群中,容器运行时负责在节点上创建和管理容器化的应用程序。
Kubernetes 不直接与容器进行交互,而是通过容器运行时来管理容器。它通过与容器运行时交互来创建、启动、停止和删除容器,以及管理容器的生命周期。
以下是一些常见的容器运行时:
- Docker: Docker 是最为广泛使用的容器运行时。它使用 Docker 镜像来创建和管理容器。Docker 的客户端和服务端模型为容器提供了良好的抽象。
- containerd: containerd 是一个轻量级的容器运行时,最初是由 Docker 开发的,后来成为一个独立的项目。它提供了容器的基本功能,如创建、启动和停止容器。
- CRI-O: CRI-O 是专门为 Kubernetes 设计的容器运行时。它遵循 Kubernetes 容器运行时接口(CRI),支持容器的生命周期管理和镜像管理。
- rkt(Rocket): rkt 是由 CoreOS 开发的容器运行时,具有一些特点,如强调安全性、简化的镜像格式等。
- Kata Containers: Kata Containers 是一个开源项目,将虚拟机和轻量级容器技术相结合,提供更高的隔离性和安全性。
- gVisor: gVisor 是 Google 开源的一个容器运行时,提供了沙箱机制,增强了容器的安全性。
8. CoreDNS / kube-dns
CoreDNS 和 kube-dns 都是 Kubernetes 集群中用于域名解析(DNS)的服务。它们的作用是将 Pod 名称和 Service 名称解析为相应的 IP 地址,从而实现在集群内部进行服务发现和网络通信。
这两者的功能相似,但有些差异。下面我会为你详细解释它们的特点和用途:
- kube-dns:
kube-dns 是 Kubernetes 最早引入的 DNS 解决方案,它由三个部分组成:
- kube-dns Server(SkyDNS): 这是一个 DNS 服务器,负责在 Kubernetes 集群内为服务提供域名解析。它维护着一个 DNS 记录,将 Service 名称映射到相应的 Pod IP 地址。
- etcd:kube-dns 使用 etcd 来存储和管理 DNS 记录。这些记录包括 Service 和 Pod 的域名映射关系。
- Sidecar 容器: 为了让 Pod 能够访问 kube-dns,kube-dns 在每个节点上部署一个名为 "kube-dns" 的 Sidecar 容器。这个容器监听 Pod 中的 DNS 查询,并将其转发给 kube-dns 服务器。
- CoreDNS:
CoreDNS 是一个可插拔的、现代化的 DNS 服务器,逐渐替代了 kube-dns,成为 Kubernetes 的默认 DNS 解决方案。它具有以下特点:
- 模块化架构: CoreDNS 使用模块化架构,允许通过插件来扩展和定制 DNS 功能。这使得它更加灵活和易于扩展。
- 灵活的配置: CoreDNS 使用 Corefile 文件来配置域名解析规则,配置语法更加直观和易于理解。
- 支持多种后端: CoreDNS 支持多种后端数据源,包括文件、etcd、Kubernetes API 等,这使得它可以更好地集成到不同的环境中。
- 性能: CoreDNS 被设计为轻量级且高性能的 DNS 服务器,具有更好的性能表现。
9.Node
在 Kubernetes 中,"Node" 是指集群中的一个工作节点(Worker Node)。工作节点是集群中的计算资源,负责运行容器化应用程序和管理与之相关的资源。每个节点都是一个独立的物理机器或虚拟机,它们一起构成了 Kubernetes 集群的基础架构。
每个节点上都运行了一些关键组件,其中最重要的是 kubelet。以下是节点的主要组成部分和功能:
- Kubelet:kubelet 是运行在每个节点上的代理,负责与 Kubernetes 控制平面通信,并确保节点上的容器和 Pod 按照预期运行。它会根据从 API Server 获取的 Pod 定义来创建和管理容器。
- Container Runtime: 容器运行时是负责在节点上创建和运行容器的软件。常见的容器运行时包括 Docker、containerd、CRI-O 等。
- Kube-proxy:kube-proxy 负责维护节点上的网络规则和转发规则,以支持服务发现和负载均衡。它为 Pod 提供了网络代理功能。
- CNI 插件: CNI(Container Network Interface)插件负责配置和管理容器的网络连接。它们确保 Pod 能够与集群内部和外部进行通信。
- 容器存储卷插件: 这些插件负责将存储卷(例如 Persistent Volume)挂载到容器中,以便应用程序可以访问持久化的数据。
- Node Agent: 节点代理是运行在节点上的一些辅助组件,用于收集节点的健康状况、资源利用情况等信息,并向控制平面报告状态。
- 资源管理器: 资源管理器(如 kubelet)监控节点上的资源使用情况,确保不超出节点的资源限制。
- 操作系统和硬件: 每个节点都运行有操作系统和底层硬件,它们提供了计算、存储和网络资源,用于运行容器化应用程序。
10.Dashboard
几款k8s web管理界面工具:
- Kubernetes Dashboard:这是官方提供的基于网页的Kubernetes用户界面,可以用来部署和管理容器应用,监控集群资源,排查问题等。您可以通过 kubectl apply -f 命令来部署Dashboard,并通过 kubectl proxy 命令来访问Dashboard。。
- Rancher:这是一个开源的企业级多集群Kubernetes管理平台,可以实现Kubernetes集群在混合云和本地数据中心的集中部署和管理,提供了丰富的功能和易用的界面。您可以通过 docker run rancher/rancher 命令来启动Rancher,并通过 http://<SERVER_IP>:8080 来访问Rancher。
- Kuboard:这是一款基于Kubernetes的微服务管理界面,旨在帮助用户快速在Kubernetes上落地微服务。它提供了简洁的仪表盘,方便的应用部署和日志查看,以及完善的中文文档和教程。您可以通过 kubectl apply -f 命令来部署Kuboard,并通过 http://<your.k8s.ip>:32567 来访问Kuboard。
- Lens:这是一款自称为“您管理Kubernetes集群所需的唯一IDE”的开源免费的桌面应用程序,支持多平台和多集群。它提供了直观的用户界面,方便地查看集群状态,监控性能指标,管理工作负载和服务等。您可以从[6]下载Lens,并使用kubeconfig文件来连接Kubernetes集群。
Kubernetes Dashboard
Kubernetes Dashboard 是一个用于可视化管理和监控 Kubernetes 集群的 Web 用户界面。它提供了一种图形化的方式来查看和管理集群中的资源、应用程序和服务,使得用户可以更方便地进行操作和监控。
Kubernetes Dashboard 的主要特点和功能包括:
- 资源概览: 提供集群中各种资源的概览,如节点、Pod、服务、副本控制器、命名空间等。
- Pod 和容器管理: 允许用户查看和管理 Pod 和容器的状态、日志和配置。
- 应用程序部署: 提供一个图形界面,可以创建和管理应用程序部署、副本集和服务。
- 服务发现: 显示集群中的服务,以及它们与后端 Pod 的关联关系。
- 命名空间管理: 允许用户创建和管理命名空间,用于隔离不同的项目和应用程序。
- 事件和日志: 显示集群中的事件和日志,帮助用户了解发生的事件和问题。
- 资源监控: 提供实时的资源监控信息,如 CPU 和内存的使用情况。
- 用户权限: 可以根据用户角色和权限设置,控制用户对集群资源的访问和操作权限。
- 扩展插件: 可以通过插件来扩展 Dashboard 的功能,添加自定义的仪表板和视图。
11.网络插件
Kubernetes 集群需要网络插件来管理容器和 Pod 之间的网络通信,以及服务发现和负载均衡等网络功能。不同的网络插件提供不同的网络模型和功能,您可以根据集群的需求选择适合的插件。以下是一些常见的 Kubernetes 网络插件:
- Flannel: Flannel 是一个轻量级的网络插件,基于虚拟网络的方式,使用了多种后端实现,如基于 Overlay 的 VXLAN 和基于 Host-Gateway 的方式。它创建了一个覆盖整个集群的虚拟网络,使得 Pod 可以跨节点通信。
- Calico: Calico 是一个高性能的网络插件,支持 IP 意识型的路由和 ACL,可以在大规模的集群中提供高效的网络连接。它利用 BGP 协议来实现路由,并通过 Network Policy 实现安全组规则。
- Cilium: Cilium 是一个强大的网络和安全插件,基于 Linux 内核的 BPF(eBPF)技术。它提供了更细粒度的网络和安全策略,支持 HTTP、gRPC 和其他应用层协议的层级路由和负载均衡。
- Weave Net: Weave Net 是一个支持多云环境的网络插件,使用覆盖网络技术,可以在不同的云和物理环境中连接 Pod。
- Antrea: Antrea 是一个基于 Open vSwitch 的 CNI 插件,它提供了网络连接、安全策略和服务发现等功能。
- Multus CNI: Multus 是一个多网络支持的 CNI 插件,允许在一个 Pod 中使用多个网络接口。这对于实现多网络场景(如多个 IP 地址、多个网段)非常有用。
发布者:LJH,转发请注明出处:https://www.ljh.cool/39746.html