在安装 Kubernetes(k8s)时,涉及多个组件,这些组件分布在控制平面节点(Control Plane Node)和工作节点(Worker Node)上,它们相互协作,共同实现了 k8s 的各种功能。以下详细介绍各组件的作用:

控制平面组件(Control Plane Components)

1. kube-apiserver


  • 作用:作为 Kubernetes 控制平面的前端,是整个集群的核心枢纽。它提供了 RESTful API 接口,所有的客户端(如 kubectl 命令行工具、其他组件等)都通过与 kube-apiserver 进行交互来管理和操作集群资源。它负责接收并处理所有的 API 请求,对请求进行认证、授权和准入控制,然后将请求的操作应用到 etcd 数据库中进行持久化存储。

  • 示例:当你使用 kubectl create deployment 命令创建一个 Deployment 资源时,kubectl 会将请求发送给 kube-apiserverkube-apiserver 验证请求的合法性后,将 Deployment 的配置信息存储到 etcd 中。

2. etcd


  • 作用:是一个高可用的键值存储系统,作为 Kubernetes 集群的分布式数据库,用于存储集群的所有状态信息,包括节点信息、Pod 信息、服务信息、配置信息等。kube-apiserver 对集群状态的读写操作都依赖于 etcd。etcd 具备数据持久化和分布式一致性的特性,确保在节点故障或网络分区的情况下,集群状态数据的完整性和一致性。

  • 示例:当一个新的 Pod 被创建时,kube-apiserver 会将该 Pod 的配置信息和状态存储到 etcd 中;当需要查询 Pod 的状态时,kube-apiserver 会从 etcd 中读取相应的数据。

3. kube-scheduler


  • 作用:负责将待调度的 Pod 分配到合适的工作节点上。它会根据节点的资源使用情况(如 CPU、内存、磁盘等)、节点的亲和性和反亲和性规则、Pod 的资源请求和限制等因素,对所有可用的工作节点进行评估和筛选,选择最优的节点来运行 Pod。

  • 示例:如果一个 Pod 请求 2GB 的内存,kube-scheduler 会遍历所有节点,找到有足够内存资源且满足其他调度规则的节点,然后将该 Pod 调度到该节点上。

4. kube-controller-manager


  • 作用:是一组控制器的集合,每个控制器都负责管理集群中的特定资源,确保集群的实际状态与用户期望的状态一致。常见的控制器包括节点控制器(Node Controller)、副本控制器(Replication Controller)、Deployment 控制器、服务账户控制器(Service Account Controller)等。这些控制器通过监听 kube-apiserver 的资源变化事件,根据相应的规则进行自动化的调整和管理。

  • 示例:Deployment 控制器会监控 Deployment 资源的副本数量,当实际副本数量与期望副本数量不一致时,会自动创建或删除 Pod 来达到期望的状态。

5. cloud-controller-manager


  • 作用:这是一个可选组件,主要用于将 Kubernetes 集群与云服务提供商(如 AWS、GCP、Azure 等)的基础设施进行集成。它负责管理与云服务相关的资源,如负载均衡器、存储卷等。通过 cloud-controller-manager,可以利用云服务提供商的特性和功能来优化集群的运行和管理。

  • 示例:在使用云服务提供商的负载均衡器时,cloud-controller-manager 会根据 Kubernetes 服务的配置自动创建和管理对应的云负载均衡器资源。

工作节点组件(Worker Node Components)

1. kubelet


  • 作用:作为工作节点上的主要组件,负责管理节点上的容器生命周期。它会从 kube-apiserver 接收 Pod 的配置信息,使用容器运行时(如 Docker、Containerd 等)来创建、启动、停止和监控 Pod 中的容器。同时,kubelet 会定期向 kube-apiserver 汇报节点和 Pod 的状态信息,确保集群能够实时了解节点和 Pod 的运行情况。

  • 示例:当 kube-apiserver 分配一个 Pod 到某个工作节点时,kubelet 会根据 Pod 的配置信息,使用 Docker 或其他容器运行时创建并启动相应的容器。

2. kube-proxy


  • 作用:运行在每个工作节点上,负责实现 Kubernetes 的服务发现和负载均衡功能。它会监听 kube-apiserver 的服务和端点变化事件,在节点上维护网络规则(如 iptables 或 IPVS 规则),将对服务的请求转发到后端的 Pod 上。通过 kube-proxy,可以实现服务的外部访问和内部通信。

  • 示例:当你创建一个 Kubernetes 服务时,kube-proxy 会在节点上创建相应的网络规则,将对服务 IP 和端口的请求转发到后端的 Pod 上,实现负载均衡。

3. 容器运行时(Container Runtime)


  • 作用:负责实际运行容器的软件,常见的容器运行时有 Docker、Containerd、CRI-O 等。它与 kubelet 进行交互,根据 kubelet 的指令创建、启动、停止和销毁容器。容器运行时管理容器的资源隔离、镜像拉取、存储管理等操作。

  • 示例:当 kubelet 要求创建一个容器时,容器运行时会从镜像仓库中拉取相应的镜像,并使用该镜像创建一个新的容器。

附加组件(Add-ons)

1. CoreDNS


  • 作用:为 Kubernetes 集群提供 DNS 服务,负责解析集群内的服务名称和 Pod IP 地址。它允许 Pod 之间通过服务名称进行通信,而不需要使用具体的 IP 地址,提高了服务的可维护性和灵活性。

  • 示例:当一个 Pod 需要访问另一个服务时,它可以通过服务名称进行访问,CoreDNS 会将服务名称解析为对应的 IP 地址。

2. 网络插件(如 Flannel、Calico 等)


  • 作用:实现 Pod 之间的网络通信,确保不同节点上的 Pod 能够相互访问。网络插件负责为 Pod 分配 IP 地址、建立网络隧道或路由规则,提供网络隔离和安全策略等功能。

  • 示例:Flannel 会在节点之间建立一个覆盖网络,为每个 Pod 分配一个唯一的 IP 地址,使得 Pod 可以像在同一个局域网中一样进行通信。