1.1 Kubernetes 是什么
1.1.1 Borg
Kubernetes 是谷歌以 Borg 为前身,基于谷歌 15 年生产环境经验开源的一个项目。
Borg 是谷歌公司内部开发的一种大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理。Borg 的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。

1.1.2 Kubernetes 是什么
Kubernetes(通常简称为 K8s)是一个开源的容器编排系统,致力于提供跨主机集群的自动部署、扩展、高可用以及运行应用程序容器的平台。
它由Google开发并捐赠给Cloud Native Computing Foundation(CNCF)管理,逐渐成为业界标准的容器编排和管理平台,继承了 Borg 的许多设计思想和理念。
1.2 Kubernetes 基础概念
1.2.1 为什么要用 Kubernetes
随着项目规模的扩大,管理的容器数量也日益增加,此时使用 Docker 的裸容器部署可能会面临许多问题,例如:
- 宿主机宕机导致该宿主机上的容器不可用,且无法自动恢复;
- 容器虽然在运行,但接口无法访问(健康检查不足);
- 应用程序的部署、回滚及扩缩容变得困难;
- 成百上千的容器及其端口难以维护。
尽管市场上有如 Docker Compose 和 Docker Swarm 等编排工具,但与 Kubernetes 相比,它们的功能仍显不足。
1.2.2 Kubernetes 架构
Kubernetes 集群宏观上可以分为控制面(Master)和数据面(Node),一般情况下控制面是集群的大脑,它负责整个集群的管理和控制,数据面是集群中负责实际跑业务,处理和转发网络流量的部分。

1. 控制面
API 服务器 Kube-Apiserver:
整个 Kubernetes 系统的唯一入口,它对外公开了一系列的 RESTful API,并且加上了验证、授权等功能,所有其他组件都只能和它直 接通信,可以说是 Kubernetes 里的联络员。
集群数据存储 Etcd:
是一个高可用的分布式 Key-Value 数据库,用来持久化存储系统里的各种资源对象和状态,相当于 Kubernetes 里的配置管理员。注意 它只与 apiserver 有直接联系,也就是说任何其他组件想要读写 etcd 里的数据都必须经过 apiserver。
调度器 Kube-Scheduler:
负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运行,相当于部署人员。因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通过 apiserver 才能获得。
控制管理器Kube-ControllerManager:
负责管理各种控制器,如 Node Controller 、DaemonSet Controller 、Deployment Controller等等,以维护集群的期望状态,同样地,它也必须通过apiserver 获得存储在 etcd 里的信息,才能够实现对资源的各种操作。
2. 数据面
Kubelet:
负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能,负责 Pod 生命周期管理,执行任务并将 Pod 状态报告给 Master 节点,通过容器运行时(拉取镜像、启动、停止容器等)来运行这些容器。
Kube-proxy:
kube-proxy 是 Kubernetes 集群中一个重要的组件,它的主要作用是管理服务的网络通信。具体来说,kube-proxy 负责以下几个方面:
- 路由请求:将流量从服务(Service)路由到后端的 Pod;
- 服务发现:新 Pod 加入或退出时,自动调整路由,只将流量发送到健康的 Pod;
- 负载均衡:将请求分配给多个 Pod,以实现负载均衡;
- 管理网络规则:根据服务类型配置网络规则,确保请求能正确转发。
Container-runtime:
是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期,是真正干活的。
3. 说明
实际生产环境中,因为控制面要运行如监控组件(Prometheus 的数据采集器)、安全组件、日志组件(EFK 中 filebeat)等,所以控制面除了运行控制面的组件,也会运行数据面的三个组件。
1.2.3 各组件的具体作用
1. API Server:
Kube-APIServer是Kubernetes最重要的核心组件之一,主要提供以下功能:
- 提供集群管理的 REST API 接口,包括:(3A)
- 认证 Authentication
- 授权 Authorization
- 准入 Admission
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过APIServer查询或修改数据,只有APIServer 才可以直接操作etcd)。
- APIServer提供 etcd 数据缓存以减少集群对 etcd 的访问
2. Controller Manager:
Controller Manager是集群的大脑,是确保整个集群动起来的关键;
- 作用是确保 Kubernetes 遵循声明式系统规范,确保系统的真实状态(Actual State)与用户定义的期望状态(Desired State)一致;
- Controller Manager 是多个控制器的组合,每个Controller事实上都是一个Control loop,负责侦听其管控的对象,当对象发生变更时完成配置;
- Controller 配置失败通常会触发自动重试,整个集群会在控制器不断重试的机制下确保最终一致性。
3. Scheduler:
Scheduler 的职责在于监控当前集群所有未调度的Pod,并且获取当前集群所有节点的健康状况和资源使用情况,为待调度Pod选择最佳计算节点,完成调度。
4. etcd:
- etcd 是 CoreOS 公司基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)
- etcd 的官方将它定位成一个可信赖的分布式键值存储服务,它能够为整个分布式集群存储一些关键数据,协助分布式集群的正常运转。
- Raft 从一开始就被设计成一个易于理解和实现的共识算法。每一个 Raft 集群中都包含多个服务器,在任意时刻,每一台服务器只可能处于 Leader、Follower 以及 Candidate(选举) 三种状态;在处于正常的状态时,集群中只会存在一个Leader,其余的服务器都是 Follower。
5. Kubelet:
- Kubernetes的初始化系统(init system)
- 从不同源获取Pod清单,并按需求启停Pod的核心组件:
- Pod 清单可从本地文件目录,给定的HTTPServer或Kube-APIServer等源头获取;
- Kubelet 将容器运行时、网络和存储抽象成了CRI、CNI、CSI。
- 负责汇报当前节点的资源信息和健康状态;
- 负责Pod的健康检查和状态汇报。
6. Kube-Proxy:
kube-proxy 是 Kubernetes 集群中一个重要的组件,它的主要作用是管理服务的网络通信,包括:
服务发现:
- 监听 Kubernetes API 服务器的服务和端点变化,动态更新路由规则。
- 新增或删除服务时,自动调整路由。
负载均衡:
- 在 Pod 之间分配流量,确保负载均衡。
- 支持轮询和最小连接数等多种负载均衡算法。
网络连接转发:
- 创建 iptables 或 IPVS 规则,将虚拟 IP 和端口映射到实际 Pod。
- 外部客户端访问虚拟 IP 时,将流量转发至对应 Pod。
支持多种代理模式:
- Userspace 模式:低性能,逐渐淘汰。
- iptables 模式:常用,性能优于 Userspace。
- IPVS 模式:高性能,适合大规模集群。
处理服务类型:
- ClusterIP:集群内部虚拟 IP。
- NodePort:每个节点开放端口,外部流量可访问。
- LoadBalancer:通过云提供商提供外部访问入口。
7. 插件:
- CoreDNS: 负责为整个集群提供DNS服务;
- Ingress Controller:为服务提供外网入口;
- MetricsServer:提供资源监控;
- Dashboard:提供GUI;
- 存储插件:实现数据的持久化;
- Calico:它负责给每个 Pod 分配一个不会重复的 IP,并且把每个节点当作一个“路由器”,实现不同节点的 Pod 的网络互通。
1.2.4 工作流程
- 每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。
- 每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。
- scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给某个 Node 的 kubelet,kubelet 调用 container-runtime 启动容器。
- controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复。
1.3 Kubernetes 特性
滚动更新和回滚:
Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署方案生态系统。
服务发现和负载均衡:
你无需修改应用来使用陌生的服务发现机制。Kubernetes 为每个 Pod 提供了自己的 IP 地址并为一组 Pod 提供一个 DNS 名称,并且可以在它们之间实现负载均衡。
自我修复:
重新启动失败的容器、在节点死亡时替换并重新调度容器、 杀死不响应用户定义的健康检查的容器, 并且在它们准备好服务之前不会将它们公布给客户端。
存储编排:
自动挂载所选存储系统,包括本地存储、公有云提供商所提供的存储或者诸如 iSCSI 或 NFS 这类网络存储系统。
**Secret 和 配置管理: **
将配置文件和程序进行解耦,部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息暴露出来。
自动装箱:
根据资源需求和其他限制自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载进行混合放置,以提高资源利用率并节省更多资源。
批量执行:
除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。
IPv4/IPv6 双协议栈:
为 Pod 和 Service 分配 IPv4 和 IPv6 地址
水平扩缩:
使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。
为拓展性设计:
无需更改上游源码即可扩展你的 Kubernetes 集群。
评论区