K8s 集群部署方法原理详解:从架构到实战 1.引言Kubernetes简称 K8s作为当今最主流的容器编排平台已经成为云原生时代的“操作系统”。无论是中小团队还是大型企业掌握 K8s 集群的部署方法都是迈向云原生架构 的关键一步。本文将系统性地梳理 K8s 集群的整体架构、核心组件职责、三种主流部署方式并结合实际实验带你从零搭建一套可用的 Kubernetes 集群。全文既有原理剖析也有可直接复制的实战命令适合有一定 Linux 和 Docker 基础、希望深入理解 K8s 部署原理的读者。2.Kubernetesernetes 集群整体架构一个标准的 Kubernetes 集群主要由**控制节点Master 和工作节点Node**构成。每个节点上都会安装不同的组件各司其职、协同工作。控制平面Master负责集群的决策与调度管理是集群的大脑。工作节点Node真正运行业务 Pod 的地方是集群的四肢。底层依赖所有节点都需要容器运行时如 Docker、containerd来支撑容器的运行。2.1 控制平面核心组件Master控制平面负责集群的所有决策包含以下四个核心组件组件名称核心职责关键特性API Server (kube-apiserver)集群的统一入口所有资源操作的唯一访问点。提供 RESTful API负责认证、授权、准入控制是其他组件通信的枢纽。etcd分布式键值存储数据库保存集群的所有配置数据和状态。高可用、强一致性是集群的“唯一真相源”所有组件状态最终存储于此。Controller Manager (kube-controller-manager)运行各种控制器确保集群的实际状态与期望状态一致。包含节点控制器、副本控制器、端点控制器等以控制循环方式工作。Scheduler (kube-scheduler)负责为新创建的 Pod 选择最合适的工作节点。基于资源需求、策略、亲和性/反亲和性等条件进行调度决策。这四个组件协同工作共同构成了 Kubernetes 集群的“大脑”。2.2 工作节点核心组件Node工作节点是集群的数据平面负责为容器提供运行环境其核心组件及职责如下组件名称核心职责关键特性kubelet节点上的“代理”负责与 API Server 通信管理 Pod 的生命周期。确保节点上 Pod 按预期运行执行容器健康检查挂载存储卷报告节点和 Pod 状态。kube-proxy维护节点上的网络规则实现 Service 的负载均衡和网络代理。支持 iptables、ipvs 等模式为 Pod 提供网络访问和负载均衡能力。Container Runtime负责拉取镜像、创建和运行容器如 Docker、containerd、CRI-O。通过 CRI (Container Runtime Interface) 与 kubelet 交互是 Pod 中容器运行的基础。这些组件协同工作使工作节点能够接收并执行来自控制平面的指令为业务 Pod 提供稳定、高效的运行环境。2.3 组件之间的调用关系当我们要运行一个 Web 服务时各组件之间的协作流程如下1.Kubernetes 环境启动之后Master 和 Node 都会将自身的信息存储到 Etcd 数据库中。2.Web 服务的安装请求会首先被发送到 Master 节点的 API Server 组件。3.API Server 组件会调用 Scheduler 组件来决定到底应该把这个服务安装到哪个 Node 节点上。此时Scheduler 会从 Etcd 中读取各个 Node 节点的信息按照一定的算法进行选择并将结果告知 API Server。4.API Server 调用 Controller Manager 去调度 Node 节点安装 Web 服务。5.kubelet 接收到指令后会通知容器运行时如 Docker由它来启动一个 Web 服务的 Pod。6.如果需要访问 Web 服务就需要通过 kube-proxy 来对 Pod 产生访问的代理。3. K8s 集群创建方式K8s 集群的创建方式主要有三种区别在于底层容器运行时的选择3.1 containerdcontainerd 是默认情况下 K8s 在创建集群时使用的容器运行时。它轻量、稳定是 CNCF 的毕业项目也是目前生产环境中最推荐的容器运行时。3.2 Docker cri-dockerdDocker 的使用普及率最高虽然 Kubernetes 在 1.24 版本后已经移除了 kubelet 对 Docker 的直接支持即移除 dockershim但可以借助 cri-dockerd 插件的方式来实现集群创建。实现集群创建。这种方式适合已有 Docker 使用习惯、希望平滑迁移的团队。3.3 CRI-OCRI-O 是 Kubernetes 创建容器最直接的一种方式专门为 K8s 而生不包含 Docker 的额外功能。在创建集群时需要借助 CRI-O 插件的方式来实现 Kubernetes 集群的创建。注意使用 Docker 和 CRI-O 这两种方式时需要对 kubelet 程序的启动参数进行相应设置。4. K8s 集群部署通用核心原理无论采用哪种部署方式K8s 集群的部署都遵循以下五个通用核心步骤4.1 环境预处理所有节点统一配置保证集群基础环境一致关闭防火墙/SELinux关闭 Swap开启内核转发时间同步配置 K8s 软件源4.2 证书体系构建K8s 所有组件通信基于TLS 双向证书认证。API Server、etcd、kubelet、客户端之间全部通过证书鉴权保证集群通信安全。所有部署方式都必须生成合法 SSL 证书。4.3 控制平面初始化部署 etcd、API Server、调度器、控制器完成集群数据存储与管理初始化搭建集群“大脑”。4.4 工作节点注册加入Worker 节点通过 join 指令携带令牌与证书向 API Server 注册被集群识别纳入管理。4.5 部署 CNI 网络插件补齐集群网络能力实现 Pod 跨主机通信、Service 网络转发集群真正可用。5. K8s 集群部署实战下面以Docker cri-dockerd方式为例完整演示一套 K8s 集群的搭建过程。实验环境规划如下节点角色主机名IP地址操作系统硬件配置软件版本Master (控制平面)k8s-master192.168.1.100Ubuntu 22.04 LTS2核CPU, 4GB内存, 50GB磁盘Kubernetes v1.28, Docker 24.0, cri-dockerd v0.3.7Node1 (工作节点)k8s-node1192.168.1.101Ubuntu 22.04 LTS2核CPU, 4GB内存, 50GB磁盘Kubernetes v1.28, Docker 24.0, cri-dockerd v0.3.7Node2 (工作节点)k8s-node2192.168.1.102Ubuntu 22.04 LTS2核CPU, 4GB内存, 50GB磁盘Kubernetes v1.28, Docker 24.0, cri-dockerd v0.3.7环境说明网络规划所有节点在同一局域网段确保网络互通。主机名已按规划配置避免使用默认主机名。时间同步所有节点已配置 NTP 服务时间偏差小于 1 秒。软件源已配置阿里云 Kubernetes 和 Docker 镜像源加速安装过程。5.1 构建 Harbor 镜像仓库5.1.1 部署 Docker 本地仓库首先在 Harbor 主机上搭建一个基于 HTTPD 的 Docker 软件仓库用于离线分发 Docker 安装包# 安装 httpd 和 createrepo [rootharbor ~]# dnf install httpd createrepo -y # 创建仓库目录 [rootharbor ~]# mkdir /var/www/html/docker/ -p # 修改 httpd 监听端口为 4444 [rootharbor ~]# vim /etc/httpd/conf/httpd.conf Listen 4444 # 启动 httpd [rootharbor ~]# systemctl enable --now httpd # 下载 docker-ce 安装包到本地 [rootharbor ~]# dnf install docker-ce --downloadonly --destdir /mnt/ -y # 移动 rpm 包到仓库目录 [rootharbor ~]# mv /mnt/*.rpm /var/www/html/docker/ # 生成仓库元数据 [rootharbor ~]# createrepo -v /var/www/html/docker/5.1.2 配置 Docker 软件源[rootharbor ~]# cat /etc/yum.repos.d/docker.repo EOF [docker] name docker baseurl http://172.25.254.254:4444/docker gpgcheck 0 EOF # 安装 docker-ce [rootharbor ~]# dnf install docker-ce -y5.1.3 生成 Harbor 证书# 创建证书目录 [rootharbor ~]# mkdir /data/certs -p # 生成自签名证书 [rootharbor ~]# openssl req -newkey rsa:4096 \ -nodes -sha256 -keyout /data/certs/timinglee.org.key \ -x509 -days 3650 -out /data/certs/timinglee.org.crt \ -subj /CNreg.timinglee.org \ -addext subjectAltNameDNS:reg.timinglee.org,IP:172.25.254.2005.1.4 编辑 Harbor 配置文件并启动# 编辑 harbor.yml配置 hostname、证书路径等 [rootharbor ~]# vim /data/harbor/harbor.yml # 启动 Harbor [rootharbor ~]# docker compose up -d [rootharbor ~]# systemctl enable --now harbor [rootharbor harbor]# docker compose ps5.1.5 配置 Docker 信任 Harbor 证书# 创建证书信任目录 [rootharbor harbor]# mkdir /etc/docker/certs.d/reg.timinglee.org/ -p # 复制证书 [rootharbor harbor]# cp /data/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt # 配置 hosts 解析 [rootharbor harbor]# vim /etc/hosts 172.25.254.200 harbor reg.timinglee.org # 重启 Docker 并登录验证 [rootharbor harbor]# systemctl restart docker [rootharbor harbor]# docker login reg.timinglee.org -u admin5.2 集群节点基础环境准备5.2.1 关闭 Swap所有节点执行systemctl disable --now swap.target systemctl mask swap.target sed /swap/s/^/#/g -i /etc/fstab5.2.2 安装 Docker 并配置 Harbor 加速# 在 Harbor 主机中分发证书到所有节点 [rootharbor ~]# for i in 100 10 20 do scp /data/certs/timinglee.org.crt root172.25.254.$i:/etc/docker/certs.d/reg.timinglee.org/ca.crt done # 所有节点启动 docker systemctl enable docker systemctl restart docker # 所有节点配置 docker 加速器 cat /etc/docker/daemon.json EOF { registry-mirrors:[https://reg.timinglee.org] } EOF systemctl restart docker5.2.3 配置主机名解析所有节点编辑/etc/hostsvim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.25.254.100 master 172.25.254.10 node1 172.25.254.20 node2 172.25.254.200 reg.timinglee.org5.2.4 配置 Kubernetes 安装源所有节点配置vim /etc/yum.repos.d/kubernetes.repo [kubernetes] name Kubernetes baseurl https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.35/rpm gpgcheck 0 # 检测软件源 dnf list kubelet5.3 Kubernetes 部署5.3.1 安装 cri-dockerd由于 Kubernetes 1.24 版本后移除了 dockershim需要安装 cri-dockerd 插件才能继续使用 Docker 作为容器运行时# 下载二进制包 [rootdocker-node1 ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.4/cri-dockerd-0.4.4.amd64.tgz # 解压二进制压缩包 [rootdocker-node1 ~]# tar zxf cri-dockerd-0.4.4.amd64.tgz [rootdocker-node1 ~]# cd cri-dockerd5.3.2 配置 cri-dockerd 服务编辑 cri-dockerd 的 systemd 服务文件指定网络插件和基础容器镜像vim /lib/systemd/system/cri-docker.service [Unit] DescriptionCRI Interface for Docker Application Container Engine Documentationhttps://docs.mirantis.com Afternetwork-online.target firewalld.service docker.service Wantsnetwork-online.target Requirescri-docker.socket [Service] Typenotify # 指定网络插件名称及基础容器镜像 ExecStart/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugincni --pod-infra-container-imagereg.timinglee.org/k8s/pause:3.9 ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways # 启动服务 systemctl daemon-reload systemctl start cri-docker.service # 验证套接字文件 ll /var/run/cri-dockerd.sock5.3.3 在 Master 节点拉取 K8s 所需镜像# 拉取 k8s 集群所需要的镜像 [rootk8s-master ~]# kubeadm config images pull \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.30.0 \ --cri-socketunix:///var/run/cri-dockerd.sock # 上传镜像到 Harbor 仓库 [rootk8s-master ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /google/{system(docker tag $0 reg.timinglee.org/k8s/$3)} [rootmaster-node ~]# docker images --format {{.Repository}}:{{.Tag}} | awk -F / /timinglee/{system(docker push $0)}5.3.4 集群初始化# 启动 kubelet 服务 [rootk8s-master ~]# systemctl status kubelet.service # 执行初始化命令 [rootk8s-master ~]# kubeadm init --pod-network-cidr10.244.0.0/16 \ --image-repository reg.timinglee.org/k8s \ --kubernetes-version v1.30.0 \ --cri-socketunix:///var/run/cri-dockerd.sock # 指定集群配置文件变量 [rootk8s-master ~]# echo export KUBECONFIG/etc/kubernetes/admin.conf ~/.bash_profile # 查看节点状态此时为 NotReady因为还没安装网络插件 [rootk8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master.timinglee.org NotReady control-plane 4m25s v1.30.05.3.5 安装 Flannel 网络插件# 下载 Flannel 的 YAML 部署文件 [rootk8s-master ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml # 下载镜像并上传到 Harbor 仓库 [rootk8s-master ~]# docker pull docker.io/flannel/flannel:v0.25.5 [rootk8s-master ~]# docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1 [rootk8s-master ~]# docker tag flannel/flannel:v0.25.5 reg.timinglee.org/flannel/flannel:v0.25.5 [rootk8s-master ~]# docker push reg.timinglee.org/flannel/flannel:v0.25.5 [rootk8s-master ~]# docker tag flannel/flannel-cni-plugin:v1.5.1-flannel1 reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1 [rootk8s-master ~]# docker push reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1 # 编辑 kube-flannel.yml修改镜像下载位置 [rootk8s-master ~]# vim kube-flannel.yml # 修改以下几行 146: image: reg.timinglee.org/flannel/flannel:v0.25.5 173: image: reg.timinglee.org/flannel/flannel-cni-plugin:v1.5.1-flannel1 # 安装 Flannel 网络插件 [rootk8s-master ~]# kubectl apply -f kube-flannel.yml5.3.6 节点扩容Worker 加入集群在所有 Worker 节点上确认部署好以下内容后即可加入集群1.禁用 Swap2.安装 kubelet、kubeadm、kubectl、docker-ce、cri-dockerd3.修改 cri-dockerd 启动文件添加 --network-plugincni 和 --pod-infra-container-imagereg.timinglee.org/k8s/pause:3.94.启动 kubelet 和 cri-docker 服务# 在 Worker 节点执行 join 命令 [rootk8s-node1 2 ~]# kubeadm join 172.25.254.100:6443 \ --token 5hwptm.zwn7epa6pvatbpwf \ --discovery-token-ca-cert-hash sha256:52f1a83b70ffc8744db5570288ab51987ef2b563bf906ba4244a300f61e9db23 \ --cri-socketunix:///var/run/cri-dockerd.sock # 在 master 节点查看所有 node 状态 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master.timinglee.org Ready control-plane 98m v1.30.0 k8s-node1.timinglee.org Ready none 21m v1.30.0 k8s-node2.timinglee.org Ready none 21m v1.30.0提示所有节点的 STATUS 为 Ready 状态说明 Kubernetes 集群已经搭建成功5.4 验证集群# 创建一个测试 Pod [rootk8s-master ~]# kubectl run test --image nginx # 查看 Pod 状态 [rootk8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE test 1/1 Running 0 6m29s # 删除 Pod [rootk8s-master ~]# kubectl delete pod test