Kubernetes(常简称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一个强大的容器编排和管理系统,可以简化应用程序的部署、扩展和管理过程。
1. k8s 架构
1.1. Master 节点
Kubernetes 集群中的 Master 节点是整个集群的控制中心,负责管理和控制集群中的所有操作。
Master 节点核心组件:
- kube-apiserver:作为 Kubernetes API 的前端,处理来自用户和其他组件的 API 请求,并将其转发到适当的组件进行处理。
- kube-controller-manager:负责运行和管理各种控制器,监控集群状态并根据需要进行调整。
- kube-scheduler:负责将新创建的 Pod 调度到集群中的节点上,根据节点资源和其他策略进行决策。
- etcd:一个分布式键值存储系统,用于存储集群的配置数据和状态信息。(也可以部署到集群外的节点)
1.2. Node 节点
Kubernetes 集群中的 Node 节点是运行容器的工作节点。
Node 节点核心组件:
- kubelet:负责管理节点上的容器,与 Master 节点通信,并执行 Master 节点下发的指令。
- kube-proxy:负责为 Pod 提供网络代理和负载均衡功能,以便它们可以与集群内和集群外的其他服务进行通信。
- 容器引擎:负责在节点上运行和管理容器。
注意:Master 节点需要与 Node 节点通信,并且需要启动一些静态 Pod,所有 Master 节点也需要部署这些组件。
1.3. 其他组件
- Flannel、Calico 等:网络插件,它的作用是为 Kubernetes 集群提供网络通信功能。
- kube-dns:它的作用是提供 DNS(Domain Name System)解析服务,为集群中的应用程序提供服务发现和名称解析功能。
- Ingress Controller:它的作用是管理和处理集群中的 Ingress 资源,为应用程序提供外部访问和路由的功能。
- Heapster:一个监控组件,用于收集和聚合集群中的资源使用情况和性能指标数据。它可以提供对集群中的节点、Pod、容器等资源的监控和度量。
- Dashboard:一个基于 Web 的用户界面,用于可视化和管理 Kubernetes 集群。它提供了一个直观的界面,使用户可以轻松地查看和操作集群中的资源。
- Federation:是一种用于管理多个 Kubernetes 集群的解决方案。它允许将多个独立的 Kubernetes 集群组织成一个逻辑上的整体,以便更方便地管理和操作这些集群。
- Fluentd-elasticsearch:Fluentd 是一个开源的日志收集和传输工具,而 Elasticsearch 是一个开源的分布式搜索和分析引擎。Fluentd-Elasticsearch 是将 Fluentd 与 Elasticsearch 结合使用的解决方案,用于实现日志的收集、传输和存储。
- Rancher:k8s管理工具。
2. k8s 集群指令运行流程
在 Kubernetes 集群中执行一个指令(如 kubectl apply -f deployment.yaml
)时,整个系统会经历一系列复杂的交互过程。以下是详细的运行流程解析:
- 客户端指令发起阶段 (kubectl)
- 指令解析:
- 用户执行
kubectl
命令(如apply
,create
,delete
) - kubectl 解析 YAML/JSON 配置文件或命令行参数
- 用户执行
- 认证与授权:
- 读取本地 kubeconfig 文件(默认
~/.kube/config
) - 与 API Server 建立 TLS 连接
- 发送认证信息(证书、token 等)
- API Server 验证用户身份和权限(RBAC)
- 读取本地 kubeconfig 文件(默认
- API 请求构造:
- 将指令转换为 REST API 请求。
- 示例:
kubectl apply -f deployment.yaml
转换为POST /apis/apps/v1/namespaces/default/deployments
- 指令解析:
- API Server 处理阶段
- 请求接收:
- API Server 接收 HTTP 请求
- 进行准入控制(Admission Control):
- 验证资源格式(Schema Validation)
- 执行 Mutating Admission Webhooks(可修改资源)
- 执行 Validating Admission Webhooks(验证资源)
- 持久化存储:
- 将资源对象写入 etcd 分布式键值存储
- 确保数据一致性(通过 Raft 共识算法)
- 事件广播:
- 通过 Watch 机制通知相关控制器资源变更
- 触发后续协调(Reconciliation)流程
- 请求接收:
- 控制器协调阶段
- Deployment Controller:
- 检测到新的 Deployment 对象
- 创建对应的 ReplicaSet
- 计算期望的 Pod 数量
- ReplicaSet Controller:
- 根据副本数创建/删除 Pod 对象
- 更新 Pod 状态到 etcd(通过 API Server 更新 etcd 数据)
- Scheduler 调度:
- 检测到未调度的 Pod
- 根据调度策略选择合适节点:
- 过滤(Filter):排除不满足条件的节点
- 打分(Score):为剩余节点评分
- 将 Pod 绑定到选定节点(更新 etcd)
- Deployment Controller:
- 节点执行阶段 (kubelet)
- Pod 同步:
- 目标节点的 kubelet 通过 Watch 机制发现新分配的 Pod
- 检查本地 Pod 缓存状态
- 容器运行时交互:
- 通过 CRI(Container Runtime Interface)调用容器运行时(Docker/containerd等)
- 拉取镜像(如未本地缓存)
- 创建容器
- 状态上报:
- 定期向 API Server 报告 Pod 状态
- 更新 etcd 中的 Pod 状态
- Pod 同步:
- 服务发现与网络
- Endpoint Controller:
- 监控 Pod 变化
- 更新对应的 Endpoint 对象
- kube-proxy:
- 根据 Service/Endpoint 变化配置网络规则
- 模式选择:
- iptables:创建链式规则
- ipvs:使用内核级负载均衡
- DNS 更新:
- CoreDNS 监控 Service 变化
- 更新集群 DNS 记录
- Endpoint Controller: