Kubernetes简称K8s,是面向容器的分布式集群编排平台。如果说Docker负责把应用打包成标准化容器,Docker Compose只能在单台机器管理多个容器,那么K8s可以调度横跨多台服务器的大量容器,解决单机部署无法应对的集群运维难题,也是当下企业微服务生产环境主流方案。

以下是docker run,docker compose,K8s的对比表:

对比维度docker rundocker composeKubernetes (K8s)
核心定位单容器启动命令,原始容器运行方式单机多容器编排工具分布式集群容器编排平台
运行范围仅启动单个容器;只能在一台机器运行单台服务器,管理多个关联容器跨多台服务器(集群),管理大规模容器
配置形式命令行参数,不易保存、复用YAML 配置文件,声明式,可版本管理YAML 清单文件,标准声明式资源定义
网络能力容器简单网络隔离,手动配置端口支持自定义网桥,容器内部服务发现(单机有效)集群级网络、内置 DNS,跨机器容器通信
故障自愈无,容器崩溃不会自动重启可配置自动重启,机器宕机无法恢复内置自愈,容器 / 节点故障自动调度重建
弹性扩缩容不支持简单横向扩容,仅限单机支持自动扩缩容 HPA,流量驱动动态伸缩
滚动更新完全不支持基础重启更新,无平滑灰度发布原生支持滚动升级、灰度发布、版本回滚
负载均衡需要手动配置端口单机内部简单负载均衡集群原生 Service 负载均衡,支持 Ingress 网关
持久化存储简单宿主机目录挂载本地卷挂载,单机存储PV/PVC 标准化存储,支持集群分布式存储
适用环境临时测试、快速启动单个容器本地开发、小型项目、单机生产服务微服务、大型系统、高可用生产集群
资源限制可配置 CPU / 内存,能力有限支持资源限制,单机约束精细资源配额、资源调度、资源抢占管控
学习成本较低高,组件繁多,架构复杂

        K8s集群分为控制平面工作节点两大模块。控制平面如同集群的大脑,依靠etcd存储全部集群数据,通过apiserver接收所有操作指令,调度器与控制器持续维持服务期望状态;工作节点是真正执行业务的机器,依靠kubelet管理本地容器,kube-proxy处理网络流量,所有节点统一协作完成资源调度。Pod是K8s最小调度单元,在此基础上,Deployment管理无状态服务、StatefulSet适配数据库这类有状态应用,Service提供稳定访问地址,解决容器IP频繁变动的通信问题。 

        接下来我们借助Kind工具,依托 Docker 容器搭建模拟企业架构的 K8s 集群,并通过 kubectl 实现集群所有资源的管控吧!

        这里我说明kind工具和kubectl又是什么:

        Kind 是集群构建工具,它会调用 Docker,启动多个容器来模拟 K8s 的 Master 主控节点和 Worker 工作节点,把整套 K8s 环境搭建出来。 但是 Kind 只负责 “造集群”,集群建好之后,所有运维操作我们要依靠 kubectl。 kubectl 是 K8s 官方标准客户端,作为我们和集群沟通的入口,部署应用、查看状态、验证自愈、滚动更新、容灾测试,全部通过 kubectl 完成。

步骤一:安装kind + kubectl

步骤二:创建 3Master+2Worker 高可用集群

        首先编辑集群配置文件,执行命令vim kind-ha.yaml,保存并退出wq

        3 台控制平面,为什么只在第一台配置端口映射?剩下 Master 和 Worker 不需要配置吗?

        在 Kind 模拟集群中,端口映射只配置在第一个控制平面节点。集群内部网络互通,外部流量通过首台主控节点进入集群,再转发给内部服务。其余 Master、Worker 节点无需配置宿主机端口映射,重复配置不会生效,还会造成网络混乱。        

        这里为什么要用3Master+2Worker呢?

        3 个 Master 是为了控制平面的高可用。 因为Kubernetes 的核心数据存储 etcd 采用 Raft 共识算法,必须依赖奇数个节点才能形成有效投票。3 是最小的可靠配置——允许任意 1 台宕机而集群不挂;如果只有 2 台,一旦网络分区就会出现"脑裂",两边各执一词,集群反而比单节点更危险。

        2 个 Worker 是为了模拟生产架构的分离原则。 在生产环境中,Master 只负责调度与管理,业务 Pod 运行在独立的 Worker 上,避免控制平面组件被业务挤占资源。本地 kind 中用 2 个 Worker,主要是为了练习 Pod 调度策略、节点故障迁移等真实场景。

        然后我们执行命令kind create cluster --config kind-ha.yaml启动集群。

        启动完成后输入命令kubectl get nodes进行基础连通性校验。输入命令docker port kind-control-plane确认端口映射生效(集群默认名称kind)。

更多推荐