Kubernetes 概述
- Kubernetes 概述
- 1. Kubernetes系统组件、集群及工作机制
- 1.1 Kubernetes 集群的节点类型
- 1.2 Kubernetes 集群架构
- 1.2.1 API Server
- 1.2.2 Cluster Store (etcd)
- 1.2.3 Controller Manager
- 1.2.4 Scheduler
- 1.2.5 Kubelet
- 1.2.6 Kube Proxy
- 1.3 Kubernetes Add-ons
- 1.4 Pod 和应用
- 1.4.1 为什么要设计 Service 资源?
- 1.4.2 Pod 和工作负载型控制器
- 1.4.3 部署并访问应用
- 1.5 Kubernetes 网络基础
- 1.5.1 Kubernetes 网络模型
- 1.5.2 Kubernetes 集群中的通信流量
Kubernetes 概述
Kubernetes 适用于所有编排语言,且解决更广泛的 MSA 的问题
Kubernetes 还支持配置环境、设置资源约束、RBAC、管理应用程序生命周期、启用自动扩展和自我修复等, 自带反脆弱能力
1. Kubernetes系统组件、集群及工作机制
1.1 Kubernetes 集群的节点类型
由 Master 和 Worker 两类节点组成:
- Master:控制节点
- Worker:工作节点
运行逻辑
- Kubernetes 将所有工作节点的资源集结在一起形成一台更加强大的“服务器”,称为 Kuernetes 集群
- 计算和存储接口通过 Master 之上的 API Server 暴露
- 客户端通过 API 提交应用程序的运行请求,而后由 Master 通过调度算法将其自动指派至某特定的工作节点以 Pod 对象的形式运行
- Master 会自动处理因工作节点的添加、故障或移除等变动对 Pod 的影响
1.2 Kubernetes 集群架构
Kubernetes 属于典型的 Server-Client 形式的二层架构
- Master 主要由 API Server、Controller-Manager 和 Scheduler 三个组件,以及一个用于集群状态存储的 Etcd 存储服务组成,它们构成整个集群的控制平面
- 而每个 Node 节点则主要包含 Kubelet、Kube Proxy 及容器运行时(docker是最为常用的实现)三个组件,它们承载运行各类应用容器
1.2.1 API Server
- 整个集群的 API 网关,相关应用程序为 kube-apiserver
- 基于 http/https 协议以 REST 风格提供,几乎所有功能全部抽象为“资源”及相关的“对象”
- 声明式 API,用于只需要声明对象的“终态”,具体的业务逻辑由各资源相关的 Controller 负责完成
- 无状态,数据存储于 etcd 中
1.2.2 Cluster Store (etcd)
- 集群状态数据存储系统,通常指的就是 etcd
- 仅会同 API Server 交互
1.2.3 Controller Manager
- 负责实现客户端通过 API 提交的终态声明,相应应用程序为 kube-controller-manager
- 由相关代码通过一系列步骤驱动 API 对象的“实际状态”接近或等同“期望状态”
1.2.4 Scheduler
- 调度器,负责为 Pod 挑选出(评估这一刻)最合适的运行节点
- 相关程序为 kube-scheduler
1.2.5 Kubelet
- Kubernetes 集群于每个 Worker 节点上的代理,相应程序为 kubelet
- 接收并执行 Master 发来的指令,管理由 Scheduler 绑定至当前节点上的 Pod 对象的容器
- 通过 API Server 接收 Pod 资源定义,或从节点本地目录中加载静态 Pod 配置
- 借助于兼容 CRI 的容器运行时管理和监控 Pod 相关的容器
1.2.6 Kube Proxy
- 运行于每个 Worker 节点上,专用于负责将 Service 资源的定义转为节点本地的实现
- iptables 模式:将 Service 资源的定义转为适配当前节点视角的 iptables 规则
- ipvs 模式:将 Service 资源的定义转为适配当前节点视角的 ipvs 和少量 iptables 规则
- 是打通 Pod 网络在 Service 网络的关键所在
1.3 Kubernetes Add-ons
负责扩展 Kubernetes 集群的功能的应用程序,通常以 Pod 形式托管运行于 Kubernetes 集群之上
必选插件
- Network Plugin:网络插件,经由 CNI 接口,负责为 Pod 提供专用的通信网络,有多种实现
- CoreOS Flannel
- ProjectCalico
- Cluster DNS:集群 DNS 服务器,负责服务注册、发现和名称解析,当下的实现是 CoreDNS
重要插件
- Ingress Controller:Ingress 控制器,负责为 Ingress 资源提供具体的实现,实现 http/https 协议的七层路由和流量调度,有多种实现,例如 Ingress-Nginx、Contour 等
- Metrics Server:Node 和 Pod 等相关组件的核心指标数据收集器,它接受实时查询,但不存储指标数据
- Kubernetes Dashboard/Kuboard/Rainbond:基于 Web 的UI
- Prometheus:指标监控系统
- ELK/PLG:集中式日志系统
- OpenELB:适用于非云端部署的 Kubernetes 环境的负载均衡器,可利用 BGP 和 ECMP 协议达到性能最优和高可用性
1.4 Pod 和应用
Kubernetes 本质上是“以应用为中心”的现代应用基础设施,Pod 是其运行应用及应用调度的最小逻辑 单元
在设计上,仅应该将具有“超亲密”关系的应用分别以不同容器的形式运行于同一 Pod 内部
- 本质上是共享 Network、IPC 和 UTS 名称空间以及存储资源的容器集
- 可将其想象成一台物理机或虚拟机,各容器就是该主机上的进程
- 各容器共享网络协议栈、网络设备、路由、IP地址和端口等,但 Mount、PID和 USER 仍隔离
- 每个 Pod 上还可附加一个“存储卷(Volume)”作为该“主机”的外部存储,独立于 Pod 的生命周期,可由 Pod 内的各容器共享
- 模拟“不可变基础设施”,删除后可通过资源清单重建
- 具有动态性,可容忍误删除或主机故障等异常
- 存储卷可以确保数据能超越 Pod 的生命周期
1.4.1 为什么要设计 Service 资源?
Pod 具有动态性,其 IP 地址也会在基于配置清单重构后重新进行分配,因而需要服务发现机制的支撑
Kubernetes 使用 Service 资源和 DNS 服务(CoreDNS)进行服务发现
- Service 能够为一组提供了相同服务的 Pod 提供负载均衡机制,其 IP 地址(Service IP,也称为 Cluster IP)即为客 户端流量入口
- 一个 Service 对象存在于集群中的各节点之上,不会因个别节点故障而丢失,可为 Pod 提供固定的前端入口
- Service 使用标签选择器(Label Selector)筛选并匹配 Pod 对象上的标签(Label),从而发现Pod
- 仅具有符合其标签选择器筛选条件的标签的 Pod 才可由 Service 对象作为后端端点使用
1.4.2 Pod 和工作负载型控制器
Pod 是运行应用的原子单元,其生命周期管理和健康状态监测由 kubelet 负责完成,而诸如更新、扩缩 容和重建等应用编排功能需要由专用的控制器实现,这类控制器即工作负载型控制器
- ReplicaSet和 Deployment
- DaemonSet
- StatefulSet
- Job和CronJob
工作负载型控制器也通过标签选择器筛选 Pod 标签从而完成关联
工作负载型控制器的工作重心
- 确保选定的 Pod 精确符合期望的数量
- 数量不足时依据 Pod 模板创建,超出时销毁多余的对象
- 按配置定义进行扩容和缩容
- 依照策略和配置进行应用更新
1.4.3 部署并访问应用
部署应用
- 依照编排需求,选定合适类型的工作负载型控制器
- 创建工作负载型控制器对象,由其确保运行合适数量的 Pod 对象
- 创建 Service 对象,为该组 Pod 对象提供固定的访问入口
请求访问 Service 对象上的服务
- 集群内部的通信流量也称为东西向流量,客户端也是集群上的 Pod 对象;
- Service 同集群外部的客户端之间的通信流量称为南北向流量,客户端是集群外部的进程;
- 另外,集群上的 Pod 也可能会与集群外部的服务进程通信
1.5 Kubernetes 网络基础
1.5.1 Kubernetes 网络模型
Kubernetes 集群上会存在三个分别用于节点、Pod 和 Service 的网络
- 于 worker 上完成交汇
- 由节点内核中的路由模块,以及 iptables/netfilter 和 ipvs 等完成网络间的流量转发
节点网络
- 集群节点间的通信网络,并负责打通与集群外部端点间的通信
- 网络及各节点地址需要于 Kubernetes 部署前完成配置,非由 Kubernetes 管理,因而,需要由管理员手动进行, 或借助于主机虚拟化管理程序进行
Pod 网络
为集群上的 Pod 对象提供的网络
虚拟网络,需要经由 CNI 网络插件实现,例如 Flannel、Calico、Cilium 等
Service网络
- 在部署 Kubernetes 集群时指定,各 Service 对象使用的地址将从该网络中分配
- Service 对象的 IP 地址存在于其相关的 iptables 或 ipvs 规则中
- 由 Kubernetes 集群自行管理
1.5.2 Kubernetes 集群中的通信流量
Kubernetes 网络中主要存在 4 种类型的通信流量
- 同一 Pod 内的容器间通信
- Pod 间的通信
- Pod 与 Service 间的通信
- 集群外部流量与 Service 间的通信
Pod 网络需要借助于第三方兼容 CNI 规范的网络插件完成,这些插件需要满足以下功能要求
- 所有 Pod 间均可不经 NAT 机制而直接通信
- 所有节点均可不经 NAT 机制直接与所有 Pod 通信
- 所有 Pod 对象都位于同一平面网络中