1、介绍
kubernetes(简称K8S)是一个以“应用”为中心,管理容器生命周期,容器之间关系,集群资源调度的容器编排工具,是一个面向平台的平台。
为什么要简称K8S呢?
1、字母k和字母s中间有8个字母;
2、据说需要搭建8遍才能入门;
1、功能
- 容器编排;
- 应用容器的生命周期管理
- 应用容器之间的关系管理
- 集群资源调度
- 构建其它的平台
2、运行逻辑
- Kubernetes将所有工作节点的资源集结在一起形成一台更加强大的“服务器"
- 计算和存储接口通过Master之上的API Server暴露
- 客户端通过API提交应用程序的运行请求,而后由Master通过调度算法将其自动指派至某特定的工作节点以Pod对象的形式运行
- Master会自动处理因工作节点的添加、故障或移除等变动对Pod的影响
3、节点类型
- Master节点:控制节点
- Worker节点:工作节点
2、Kubernetes组件
2-1、Master节点组件
2-1-1、API Server
- 整个集群的 API 网关,应用程序为 kubekube-apiserver
- 以API形式对外提供服务,服务器程序,监听在某个套接字上
- 基于 http/https 协议以 REST 风格提供,几乎所有功能全部抽象为“资源”及相关的对象
- 声明式 API,用于只需要声明对象的 “终态”,具体业务逻辑由各资源相关Controller 负责完成
- 无状态,数据存储于 etcd 中
2-1-2、Scheduler
- 调度器,负责为那些未能绑定到某节点的Pod,挑选一个最适配的Worker来运行它
- 只会从API接收指令
- 相关程序为 kube -scheduler
2-1-3、Controller Manager
☆ Controller的集合,由一组Kubernetes内置的Controller集结而成
☆ 负责实现客户端通过 API 提交的终态声明,相应用程序为 kubekube-controller-manager
☆ 由相关代码通过一系列步骤驱动 API 对象的“实际状态”接近或等同“期望状态”
☆ 除调度之外的编排决策,几乎都由Controller负责形式
2-1-4、Cluster Store
- 集群状态数据存储系统,通常指的就是 etcd
- 仅会同 API Server交互
2-2、Worker节点组件
2-2-1、kubelet
- Kubernetes集群于每个 Worker 节点上的代理,相应程序为 kubelet
- 接收并执行 Master 发来的指令,管理由 Scheduler 绑定至当前节点上的 Pod 对象的容器
- 通过 API Server 接收 Pod 资源定义,或从节点本地目录中加载静态 Pod 配置
- 借助于兼容 CRI 的容器运行时管理和监控 Pod 相关的容器
2-2-2、kube-proxy
- 运行于每个 Worker 节点上,专用于负责将 Service 资源的定义转为节点本地的实现
- iptables模式:将 Service 资源的 定义转为适配当前节点视角的iptables 规则
- ipvs模式:将 Service 资源的 定义转为适配当前节点视角ipvs 和少量 iptables 规则
- 是打通 Pod 网络在 Service 网络的关键所在
2-2-3、插件
负责扩展 Kubernetes 集群的功能应用程序,通常以 Pod 形式托管运行于 Kubernetes集群之上
2-2-3-1、必须插件
- Network Plugin:网络插件,经由CNI接口,负责为Pod提供专用的通信网络,有多种实现,如:flannel、calico等
- Cluster DNS:通常是指CoreDNS,集群DNS服务器,负责服务注册、发现和名称解析
2-2-3-2、重要插件
- Ingress Controller:Ingress控制器,负责为Ingress资源提供具体的实现,实现http/https协议的七层路由和流量调度,有多种实现,如:Ingress-Nginx、Contour等
- Dashboard: 基于Web的UI
- 指标监控系统: prometheus
- 日志系统:ELK、PLG等
3、POD
Kerbernetes本质上是“以应用为中心”的现代基础设施,Pod是其运行应用及应用调度的最小逻辑单元
- 本质上是共享 Network 、IPC 和UTS 名称空间以及存储资源的容器集
- 可将其想象成一台物理机或虚拟,各容器就是该主上的进程
- 各容器共享网络协议栈、 网络设备、路由、IP 地址和端口等,但 Mount 、PID 和USER 仍隔离
- 每个 Pod 上还可附加一个“存储卷( Volume)”作为该“主机”的外部存储,独立于 Pod 的生命周期,可由 Pod 内的 各容器共享
- 模拟“不可变基础设施”,删除后可通过资源清单重建
- 具有动态性,可容忍误删除或主机故障等异常
- 存储卷可以确保数据能超远pod的生命周期
4、Service
Pod具有动态性,其IP地址在基于配置清单重构后也会重新分配,因而需要服务发现机制的支撑
Kubernetes使用 Service 资源和 DNS 服务( CoreDNS)进行服务发现
- Service能够为一组提供了相同服务的 Pod 提供负载均衡机制,其 IP 地址( Service IP ,也称为 Cluster IP)即为客 户端流量入口
- 一个 Service 对象存在于集群中的各节点之上,不会因个别故障而丢失,可为 Pod 提供固定的前端入口
- Service使用 标签选择器 (Label Selector)筛选并匹配 Pod 对象上的标签( Label),从而发现 Pod(仅具有符合其标签选择器筛条件的 Pod 才可由Service对象作为后端端点使用)
5、工作负载型控制器
Pod 是运行应用的原子单元,其生命周期管理和健康状态监测由 kubelet 负责完成,而诸如更新、扩缩 容和重建等应用编排功能需要由专用的控制器实现,这类控制器即为工作负载型控制器
- ReplicaSet和Deployment
- DaemonSet
- StatefulSet
- Job和CrontJob
工作负载型控制器也通过标签选择器筛选Pod标签从而完成关联
工作负载型控制器的重心
- 确保选定的 Pod 精确符合期望的数量
- 数量不足时依据 Pod 模板 创建,超出时销毁多余的对象
- 按配置定义进行扩容和缩容
- 依照策略和配置进行应用更新
6、网络模型
Kubernetes集群上会存在三个分别用于节点、 Pod 和Service 的网络,于worker上完成交汇,有节点内核中的路由模块,以及iptables/netfilter和ipvs等完成网络间的流量转发
6-1、节点网络
- 集群节点间的通信网络,并负责打通与集群外部端点间的通信
- 网络及各节点地址需要于Kubernetes部署前完成配置,非由Kubernetes管理, 因而需要由管理员手动进行,或借助于主机虚拟化管理程序进行
6-2、Pod网络
- 为集群上的Pod对象提供的网络
- 虚拟网络,需要经由CNI网络插件实现,例如:Flannel、Calico、Cilium等
6-3、Service网络
- 在部署 Kubernetes 集群时指定,各 Service 对象使用的地址将从该网络中分配
- Service对象的 IP 地址存在于其相关的 iptables 或ipvs 规则中
- 由Kubernetes集群自行管理
6-4、通信流量
Kubernetes网络中主要存在 4中类型的通信流量
- 同一Pod内的容器间通信
- Pod间的通信
- Pod与Service间的通信
- 集群外部流量与Service间的通信
Pod网络需要借助于第三方兼容CNI规范的网络插件完成,这些插件需要满足一下功能要求:
- 所有Pod间均可不经NAT机制而直接通信
- 所有节点均可不经NAT机制直接与所有Pod通信
- 所有Pod对象都位于同一平面网络中
7、kubernetes集群部署
7-1、部署模式
7-1-1、独立组件模式
- 除Add-ons(插件)以外,个关键组件以二进制方式部署与节点上,并运行于守护进程;
- 各Add-ons以Pod形式运行;
7-1-2、静态Pod模式
- 控制平面各组件以静态Pod对象运行于Master主机之上
- kubelet和docker以二进制部署,运行为守护进程
- kube-proxy等则以Pod形式运行
- registry.k8s.io(2022年前:k8s.gcr.io)
7-2、安装工具
- 原生安装工具kubeadm
- CNCF认证的安装工具
https://landscape.cncf.io/
7-3、Kubeadm工具
Kubernetes社区提供的集群构建工具
- 负责执行构建一个最小化可用集群并将其启动等必要的基本步骤
- Kubernetes集群全生命周期管理工具,可用于实现集群的部署、升级、降级、卸载等
- Kubernetes仅关心如何初始化并拉起一个集群,其职责仅限于下图中背景着色的部分:
7-4、部署前提
- 支持Kubernetes运行的Linux主机,例如Debian、RedHat等
- 主机2GB以上内存,2核以上CPU(小于此配置,第二主节点加入集群会提示,并且无法加入)
- 各主机间能够通过网络无障碍通信
- hostname、MAC地址已经UUIP都是唯一,主机名能相互解析
- 放行Kubernetes使用的各个端口,或者直接禁用(建议禁用)
- 禁用swap
- 时间同步
因Kubernetes所有镜像都在registry.k8s.io和k8s.gcr.io,建议使用国内阿里源或者华为源,或者根据情况,使用代理
7-5、部署示例
请查看:https://blog.51cto.com/dayu/5825840
标签:kubernetes,Kubernetes,Service,介绍,API,集群,Pod,节点 From: https://blog.51cto.com/dayu/5826044