一、Kubernetes 简介1.1 什么是 KubernetesKubernetes 是一个可移植的、可扩展的开源容器编排平台用于自动化部署、伸缩和管理容器化应用。Kubernetes 拥有一个庞大且快速增长的生态系统其服务、支持和工具广泛可用。名称来源“Kubernetes” 源于希腊语意为舵手或飞行员。发展历程Google在2014 年开源了 Kubernetes 项目Kubernetes 建立在 Google 在大规模运行生产工作负载方面十几年的经验基础上结合了社区中最好的想法和实践1.2 容器优势优势说明敏捷性敏捷应用程序的创建和部署与使用 VM 镜像相比提高了容器镜像创建的简便性和效率及时性持续开发、集成和部署通过快速简单的回滚由于镜像不可变性支持可靠且频繁的容器镜像构建和部署解耦性关注开发与运维的分离在构建/发布时创建应用程序容器镜像而不是在部署时从而将应用程序与基础架构分离可观测性可观察性不仅可以显示操作系统级别的信息和指标还可以显示应用程序的运行状况和其他指标信号跨平台跨开发、测试和生产的环境一致性在便携式计算机上与在云中相同地运行可移植跨云和操作系统发行版本的可移植性可在 Ubuntu、RHEL、CoreOS、本地、Google Kubernetes Engine 和其他任何地方运行简易性以应用程序为中心的管理提高抽象级别从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序大分布式松散耦合、分布式、弹性、解放的微服务应用程序被分解成较小的独立部分并且可以动态部署和管理而不是在一台大型单机上整体运行隔离性资源隔离可预测的应用程序性能高效性资源利用高效率和高密度1.3 容器化面临的问题单纯使用容器如 Docker在生产环境中会遇到以下挑战弹性的容器化应用管理强大的故障转移能力高性能的负载均衡访问机制便捷的扩展自动化的资源监测…1.4 为什么使用 Kubernetes容器是打包和运行应用程序的好方式。在生产环境中你需要管理运行应用程序的容器并确保不会停机。例如如果一个容器发生故障则需要启动另一个容器。Kubernetes 提供了一个可弹性运行分布式系统的框架是Linux 之上的服务编排框架。Kubernetes 提供的能力能力说明服务发现和负载均衡可以使用 DNS 名称或自己的 IP 地址公开容器如果进入容器的流量很大Kubernetes 可以负载均衡并分配网络流量从而使部署稳定存储编排允许自动挂载你选择的存储系统例如本地存储、公共云提供商等自动部署和回滚可以描述已部署容器的所需状态以受控的速率将实际状态更改为期望状态可以自动化创建新容器、删除现有容器并将所有资源用于新容器自动完成装箱计算允许指定每个容器所需 CPU 和内存RAM当容器指定了资源请求时Kubernetes 可以做出更好的决策来管理容器的资源自我修复重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器并且在准备好服务之前不将其通告给客户端密钥与配置管理允许存储和管理敏感信息例如密码、OAuth 令牌和 ssh 密钥可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置也无需在堆栈配置中暴露密钥…为了生产环境的容器化大规模应用编排必须有一个自动化的框架系统KubernetesK8s等编排软件应运而生。1.5市场份额目前容器化市场份额由Docker牢牢占据市场第一而在容器编排方面的市场KubernetesK8s独占鳌头二、Kubernetes 集群原理2.1 Master-Node 架构Kubernetes 采用Master-Node主从架构Master 和 Worker 的交互方式Master 决定 Worker node 里面都有什么做什么Worker 只和 Master 的 API Server 通信所有对 Kubernetes 集群的“管理操控”增删改查资源都必须通过 API Server但用户的“业务流量”不经过 API Server每一个节点各司其职运维人员使用 UI网页控制台 或者 CLI 命令行操作 K8s 集群的 Master就可以知道整个集群的状况。2.2 核心组件详解Master 主节点组件组件说明API Server访问管理 K8s 集群的唯一入口同时其他组件通过 API Server 实现通信。相当于 MVC 模式中的 Controller 层etcd分布式键值数据库nosql存储了整个 K8s 集群的状态信息。是 K8s 的记账本和记事本Scheduler调度器负责选出最佳的一个节点来部署容器。从所有 Node 节点中剔除不符合条件的节点接着给剩下的 Node 打分得分最高者被选中Controller Manager控制管理器控制容器的数量确保集群状态与期望状态一致。例如期望 5 个容器即便某个节点 Down 了依然要保证容器的数量为 5 个Node Worker工作节点组件组件说明kubelet每一个 Node 节点上必须安装的组件。负责每一个节点上容器的启停以及收集节的信息汇报给 API Server。可以理解为监工kube-proxy网络代理。负责代理网络实现负载均衡和服务发现2.3 工作原理Pod部署流程详解什么是Pod在英文中Pod是豆荚的意思。在这里你可以把容器当成豆子Pod就是装豆子的豆荚。所以Pod是容器的载体是一个容器组。Pod 是 Kubernetes 中最小的可部署单元也是调度的基本单位部署流程详解Kubernetes 部署的是 Pod调度的是 Pod管理的是 Pod。容器只是 Pod 内部的实际运行载体。在 K8s 集群中部署一个容器组Pod的完整过程简略版本a kubectl 向 API Server 发送部署 Pod 的请求b API Server 将请求信息保存到 etcd记录期望状态信息保存完毕etcd会回复apiserverc Controller Manager控制管理器 通过apiserver感知到 etcd 的变化生成 Pod 的部署信息并通过apiserver写回 etcd 信息保存完毕etcd会回复apiserverd Scheduler调度器 通过apiserver感知到 etcd 中的 Pod 信息剔除不合格节点打分选出最佳节点将调度结果通过apiserver写回 etcde 被选中的 Node 上的 kubelet 通过apiserver感知到 etcd 的变化在本地启动容器f kubelet 将容器状态汇报给 API ServerAPI Server 保存到 etcd需注意apiserver是一个切实的中转站除了工作节点的业务请求之外的一切管理请求都要经过它。各组件之间不直接通信全部通过 API Server 进行交互。master节点控制整个集群Controller Manager控制管理器etcd键值数据库redis【记账本记事本】存储集群的状态scheduler调度器api serverapi网关并非真正的网关而是因为所有的控制都需要通过api-server功能类似网关集群的统一入口和中枢神经kubelet负责启动控制平面组件静态 Podkube-proxy负责主节点网络规则node节点worker工作节点kubelet监工每一个node节点上必须安装的组件。管理业务 Pod并通过容器运行时如 Docker实际启停容器kube-proxy代理。实现 Service 网络转发业务流量注意本图为了方便理解把这两个组件只划分到了node工作节点意思是工作node节点只有kubelet和kube-proxy不代表主节点不存在kubelet和kube-proxy组件部署一个应用的详细步骤用户通过 kubectl 提交 应用 创建请求。API Server 接收请求将 应用 对象写入 etcd。Controller Manager 感应到变化生成 Pod 资源对象并通过 API Server 写入 etcd。Scheduler 监听到未被调度的 Pod通过计算选出最合适的节点Node2。Scheduler 将调度结果写入 API ServerAPI Server 更新 etcd。Node2 上的 kubelet 监听到了指派给自己的 Pod 事件调用底层容器运行时启动 Pod。kubelet 将 Pod 的最新运行状态汇报给 API Server最终存入 etcd。核心理解所有组件都通过 API Server 通信etcd 作为状态存储中心Controller Manager 负责维护期望状态Scheduler 负责智能调度。2.4 K8s特性无论访问哪个机器都可以访问到真正应用Service 背后的 Pod有人可能会好奇这是为什么为什么我在没有部署服务的集群主机上也能访问到我在其他服务器部署的服务这主要归功于**kube-proxy网络代理**错误认知你的 Tomcat Pod 跑在了 hd2 上。如果你访问 hd1Master的 IP 加 8080 端口绝对访问不到因为 hd1 机器上根本没这个容器进程真实情况你创建一个 Service类型选 NodePort。Kubernetes 会在集群内所有节点包括 hd1、hd2、hd3 的物理网卡上同时打开一个随机端口比如 30001。此时无论你访问 hd1:30001、hd2:30001 还是 hd3:30001流量都会被 **kube-proxy网络代理**劫持并负载均衡转发到真正运行 Pod 的 hd2 机器上去至于nodeport是什么需要在后续慢慢去学习了解三、组件交互原理串行详解完整的组件交互流程0. 开机默认状态 所有节点的 kubelet、Master 节点的 scheduler调度器、controller-manager控制器管理器 一直监听 Master 的 API Server 发来的事件变化for :: 无限循环监听 1. 运维工程师使用 kubectl命令行工具 kubectl create deploy tomcat --imagetomcat8 → 告诉 Master 让集群使用 tomcat8 镜像部署一个 tomcat 应用 2. kubectl 将请求内容发给 API Server → API Server 保存此次创建信息到 etcd 3. etcd 给 API Server 上报事件 → 刚才有人往我里面保存了一个部署 Tomcat 的信息 4. Controller Manager 监听到 API Server 的事件 → 识别出是部署 Tomcat事件 5. Controller Manager 处理该事件 → Controller Manager 生成 Pod 的部署信息 6. Controller Manager 把 Pod 信息交给 API Server → API Server 再次保存到 etcd 7. etcd 上报事件【Pod 信息】给 API Server 8. Scheduler调度器 专门监听【Pod 信息】从 API Server 监听到 的 → 拿到 Pod 信息计算哪个节点合适 → 生成Pod 调度过后的信息node: node-02 9. Scheduler调度器 把调度结果交给 API Server → API Server 保存到 etcd 10. etcd 上报事件【Pod 调度过后的信息node: node-02】给 API Server 11. 所有节点的 kubelet 专门监听 【pod调度过后的信息node: node-02】 事件 从 API Server 拿到该事件 12. 每个节点的 kubelet 判断是否属于自己的事情 → node-02 的 kubelet 发现是他的事情 13. node-02 的 kubelet 启动这个 Pod → 汇报给 Master 当前启动好的所有信息核心组件对应关系组件角色比喻职责API Server网关/前台所有请求的唯一入口MVC 中的 Controlleretcd记账本/记事本存储集群的所有状态信息键值数据库Scheduler调度员为 Pod 选择最合适的 Node 节点Controller Manager监工/管理者控制容器数量维护期望状态kubelet节点代理/监工启停容器汇报节点状态kube-proxy网络代理负载均衡和服务发现四、Kubernetes 集群安装方法方法说明kubeadm官方推荐安装工具每个组件都是容器化的。默认证书有效期为 1 年二进制安装复杂方式适合深入学习五、核心知识点总结5.1 Kubernetes 核心价值容器编排自动化管理容器化应用服务发现与负载均衡自动分配流量自我修复自动重启失败的容器自动扩缩容根据负载自动调整副本数滚动更新与回滚零停机部署存储编排自动挂载存储系统5.2 组件职责Master 节点控制平面 ├── API Server → 唯一入口所有组件通过它通信 ├── etcd → 存储集群状态键值数据库 ├── Scheduler → 智能调度为 Pod 选择节点 └── Controller Manager → 维持期望状态如始终运行 5 个副本 Worker 节点 ├── kubelet → 节点代理启停容器汇报状态 └── kube-proxy → 网络代理负载均衡5.3 部署流程总结kubectl → API Server → etcd → Controller Manager → Scheduler → kubelet → 容器运行时整个流程通过 API Server 作为中枢etcd 作为状态存储所有组件松耦合协同工作实现了 Kubernetes 的自动化容器编排能力。