[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"consumer-news-detail-1026":3,"consumer-news-interaction-1026":41,"consumer-news-related-1026":44},{"detail":4,"item":36},{"card":5,"schemaVersion":23,"fields":24,"content":30},{"id":6,"kind":7,"targetType":8,"targetId":9,"subtype":7,"typeLabel":10,"title":11,"subtitle":12,"summary":13,"coverUrl":14,"badgeText":15,"href":16,"sourceName":12,"meta":17,"metrics":20,"tags":21,"resolved":22},"NEWS_ARTICLE:1026","news","NEWS_ARTICLE",1026,"资讯","零基础K8s v1.35.7 集群部署保姆级搭建零坑","博客园","k8s版本: v1.35.7 部署 OS：Rocky Linux 10（零基础适配） 集群架构：1 控制节点 + 2 工作节点 容器运行时：containerd 网络组件：flannel:v0.28.9 适配说明：本手册专为零基础编写，摒弃专业默认知识点，每一条命令带详细注释、每一步操作带作用讲解、","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906111904920-1765057255.png","","\u002Fnews\u002F1026",[18,19],"2026","云原生与运维",{},[19],true,"consumer-content-detail-v1",{"sourceName":12,"authorName":25,"categoryName":19,"summary":13,"description":13,"publishTime":26,"updateTime":27,"sourceUrl":28,"language":29},"Docker-沫老师","2026-09-06T11:24","2026-09-11T15:22:03","https:\u002F\u002Fwww.cnblogs.com\u002Fdocker-mo\u002Fp\u002F22861800","中文",{"format":31,"policy":32,"normalized":22,"html":33,"text":34,"wordCount":35,"hasBody":22},"HTML","NEWS_CONTENT_V1","\u003Cp>\u003Cstrong>k8s版本:\u003C\u002Fstrong> \u003Cstrong>v1.35.7\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>部署\u003C\u002Fstrong> \u003Cstrong>OS\u003C\u002Fstrong>：Rocky Linux 10（零基础适配）\u003C\u002Fp>\n\u003Cp>\u003Cstrong>集群架构\u003C\u002Fstrong>：1 控制节点 + 2 工作节点\u003C\u002Fp>\n\u003Cp>\u003Cstrong>容器运行时\u003C\u002Fstrong>：containerd\u003C\u002Fp>\n\u003Cp>\u003Cstrong>网络组件\u003C\u002Fstrong>：flannel:v0.28.9\u003C\u002Fp>\n\u003Cp>\u003Cstrong>适配说明\u003C\u002Fstrong>：本手册专为零基础编写，摒弃专业默认知识点，\u003Cstrong>每一条命令带详细注释、每一步操作带作用讲解、标注必做\u002F禁忌项\u003C\u002Fstrong>，由 CentOS7 迁移适配 Rocky Linux10，全程可无脑复刻执行。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>前置零基础认知\u003C\u002Fstrong>：K8s 集群必须统一环境、关闭系统防护、配置网络内核，否则 100% 部署报错，本文所有全局操作三台机器必须全部执行。\u003C\u002Fp>\n1 集群搭建方案选型（零基础科普）\n\u003Cp>新手必看：不同搭建方式适配不同场景，\u003Cstrong>本教程选择裸机手动部署\u003C\u002Fstrong>，适合学习企业真实部署逻辑，是运维必备技能。\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>搭建方式\u003C\u002Fth>\n   \u003Cth>适用场景\u003C\u002Fth>\n   \u003Cth>零基础通俗讲解\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>minikube\u003C\u002Ftd>\n   \u003Ctd>单机测试、零基础入门体验\u003C\u002Ftd>\n   \u003Ctd>只能在一台电脑上跑的简易 K8s，功能残缺，只能用来简单看看界面，学不到真实集群部署逻辑，不推荐深度学习\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>k3s\u003C\u002Ftd>\n   \u003Ctd>边缘设备、小型测试集群\u003C\u002Ftd>\n   \u003Ctd>精简版 K8s，自动简化很多配置，部署快，但屏蔽了底层原理，\u003Cstrong>新手学不到核心知识\u003C\u002Fstrong>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>裸机手动部署\u003C\u002Ftd>\n   \u003Ctd>企业测试、生产集群、运维学习\u003C\u002Ftd>\n   \u003Ctd>完全手动配置每一项参数，和企业生产环境一致，能吃透 K8s 底层逻辑，\u003Cstrong>新手首选学习方式\u003C\u002Fstrong>，本教程全程采用此方式\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>云平台托管集群\u003C\u002Ftd>\n   \u003Ctd>企业线上生产环境\u003C\u002Ftd>\n   \u003Ctd>云端一键搭建，不用自己配置，成本高，新手无法学习部署原理，只适合直接使用，不适合学习\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>实验架构说明\u003C\u002Fstrong>：本次搭建 1 主 2 从简易集群，满足学习需求；企业生产必须 3 台控制节点实现高可用，防止单点故障。\u003C\u002Fp>\n2 集群环境准备（企业标准｜零基础全注释）\n\u003Cp>💡 \u003Cstrong>核心重点\u003C\u002Fstrong>：本章所有命令，\u003Cstrong>三台节点（1主2从）必须全部执行\u003C\u002Fstrong>！集群环境不一致，后续 100% 报错。\u003C\u002Fp>\n\u003Ch2>2.1 硬件配置要求（新手必读）\u003C\u002Fh2>\n\u003Cul>\n \u003Cli>\u003Cp>节点数量：3 台 Rocky Linux 10 虚拟机\u002F物理机\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>最低配置：内存≥2G、CPU≥2核、硬盘≥30G（配置过低会导致集群卡顿、Pod 启动失败）\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>网络要求：三台机器内网互通、能正常上网（需要下载软件、拉取镜像）\u003C\u002Fp>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>2.2 集群 IP 固定规划\u003C\u002Fh2>\n\u003Cp>K8s 集群禁止 IP 动态变化，必须固定 IP，以下为本次统一规划：\u003C\u002Fp>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>主机名\u003C\u002Fth>\n   \u003Cth>节点角色\u003C\u002Fth>\n   \u003Cth>固定 IP 地址\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>k8s‑master\u003C\u002Ftd>\n   \u003Ctd>控制节点（主节点）\u003C\u002Ftd>\n   \u003Ctd>192.48.75.10\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>k8s‑node1\u003C\u002Ftd>\n   \u003Ctd>工作节点（从节点）\u003C\u002Ftd>\n   \u003Ctd>192.48.75.11\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>k8s‑node2\u003C\u002Ftd>\n   \u003Ctd>工作节点（从节点）\u003C\u002Ftd>\n   \u003Ctd>192.48.75.12\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>注意： 如果你的主机是用克隆的， 一定要把网络配置里面的 uuid 修改或删除\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 生成本机的 uuid\n[root@node ~]# uuidgen \n42b63197-dca2-4f7f-abed-b6edef9b51c1\n\n# 修改配置\n[root@node ~]# vim \u002Fetc\u002FNetworkManager\u002Fsystem-connections\u002Fens160.nmconnection \n[connection]\nid=ens160\nuuid=42b63197-dca2-4f7f-abed-b6edef9b51c1\ntype=ethernet\n\n# 重启服务\n[root@node ~]# systemctl restart NetworkManager\n[root@node ~]# nmcli con down ens160 ;nmcli con up ens160 \n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>2.3 全局环境统一配置（三台节点全执行｜逐行注释）\u003C\u002Fh2>\n\u003Ch3>2.3.1 设置主机名（作用：区分集群节点，方便集群识别）\u003C\u002Fh3>\n\u003Cp>原理：K8s 通过主机名+IP 识别节点，三台机器必须拥有不同主机名，永久生效\u003C\u002Fp>\n\u003Cpre>\u003Ccode># ========== 仅 k8s-node1（主节点）执行 ==========\n# hostnamectl set-hostname 主机名：永久修改系统主机名，重启不失效\nhostnamectl set-hostname k8s-master\n\n# ========== 仅 k8s-node2（从节点）执行 ==========\nhostnamectl set-hostname k8s-node1\n\n# ========== 仅 k8s-node3（从节点）执行 ==========\nhostnamectl set-hostname k8s-node2\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2.3.2 配置 hosts 域名解析（作用：让三台机器互相识别主机名）\u003C\u002Fh3>\n\u003Cp>原理：默认机器无法通过主机名互通，配置 hosts 后，机器输入主机名即可对应到固定 IP，避免集群通信失败\u003C\u002Fp>\n\u003Cpre>\u003Ccode># cat &gt;&gt; \u002Fetc\u002Fhosts：向系统域名配置文件追加内容\n# EOF 为起止标识，中间内容会写入文件\ncat &gt;&gt; \u002Fetc\u002Fhosts &lt;&lt;EOF\n192.48.75.10  k8s-master\n192.48.75.11  k8s-node1\n192.48.75.12  k8s-node2\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2.3.3 关闭防火墙（作用：放行集群所有通信端口）\u003C\u002Fh3>\n\u003Cp>新手必懂原理：Linux 防火墙会拦截端口通信，K8s 集群有成百上千个端口需要互通，手动放行极其麻烦，测试环境直接关闭防火墙，规避端口拦截报错\u003C\u002Fp>\n\u003Cpre>\u003Ccode># systemctl stop：临时关闭防火墙，当前立即生效\nsystemctl stop firewalld\n\n# systemctl disable：永久禁止防火墙开机自启，重启机器不会自动开启\nsystemctl disable firewalld\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2.3.4 关闭 SELinux（作用：解除系统权限拦截，K8s 必关项）\u003C\u002Fh3>\n\u003Cp>原理：SELinux 是 Linux 安全权限机制，会拦截 K8s 读写、创建资源的权限，\u003Cstrong>不关闭集群百分百启动失败\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode># setenforce 0：临时关闭 SELinux，立即生效\nsetenforce 0\n\n# sed 替换命令：修改系统配置文件，永久关闭 SELinux\n# 匹配以SELINUX=开头的行，替换为SELINUX=disabled\nsed -i 's\u002F^SELINUX=.*\u002FSELINUX=disabled\u002F' \u002Fetc\u002Fselinux\u002Fconfig\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2.3.5 关闭 swap 交换分区（K8s 强制要求）\u003C\u002Fh3>\n\u003Cp>新手核心知识点：swap 是硬盘虚拟内存，K8s 调度 Pod 时不允许使用虚拟内存，\u003Cstrong>swap 不关闭，kubeadm 初始化直接报错终止\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode># swapoff -a：临时关闭所有swap分区，立即生效\nswapoff -a\n\n# sed 注释fstab文件中的swap挂载行，永久关闭，重启不恢复\nsed -ri 's\u002F.*swap.*\u002F#&amp;\u002F' \u002Fetc\u002Ffstab\n\n# 检查是否关闭\n[root@k8s-master ~]# free -m\n               total        used        free      shared  buff\u002Fcache   available\nMem:            3877         570        3245           9         289        3306\nSwap:              0           0           0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>注意: 改完fstab先\u003Cstrong>\u003Cstrong>重启\u003C\u002Fstrong>\u003C\u002Fstrong>，再做下面的操作\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode>reboot\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch3>2.3.6 系统时间同步（作用：保证集群所有节点时间一致）\u003C\u002Fh3>\n\u003Cp>原理：K8s 证书、日志、Pod 调度依赖系统时间，三台机器时间偏差过大，会出现鉴权失败、节点离线问题\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cp>每台主机安装软件\u003C\u002Fp>\u003Cpre>\u003Ccode># 判断软件是否安装\nrpm -aq chrony\n\n# dnf install：安装系统时间同步工具chrony（Rocky10默认工具）\ndnf install chrony -y\n\n# 启动chronyd服务并设置开机自启\nsystemctl enable --now chronyd\n\n# 查看当前时间同步源，确认同步成功\nchronyc sources\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n \u003Cli>\u003Cp>master控制节点，设置为时间同步主节点\u003C\u002Fp>\u003Cpre>\u003Ccode># 修改相关配置\n[root@k8s-master ~]# vim \u002Fetc\u002Fchrony.conf \n……\nserver ntp.aliyun.com iburst\n……\nallow 192.48.75.0\u002F24\n\n# 重启服务\n[root@k8s-master ~]# systemctl restart chronyd\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n \u003Cli>\u003Cp>其他两个工作节点配置\u003C\u002Fp>\u003Cpre>\u003Ccode># 修改相关配置\n[root@k8s-node2 ~]# vim \u002Fetc\u002Fchrony.conf \n…… \npool k8s-master  iburst\n…… \n\n# 重启服务\n[root@k8s-node2 ~]# systemctl restart chronyd\n\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003Cblockquote>\n   \u003Cp>测试 是否成功\u003C\u002Fp>\n  \u003C\u002Fblockquote>\u003Cpre>\u003Ccode>[root@k8s-node1 ~]# chronyc sources\nMS Name\u002FIP address         Stratum Poll Reach LastRx Last sample               \n===============================================================================\n^* k8s-master                    4   6    77    45   -162us[-6383us] +\u002F-   42ms\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906111904920-1765057255.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n  \u003Cblockquote>\n   \u003Cp>注意： 一定要是 * 号才代表成功\u003C\u002Fp>\n  \u003C\u002Fblockquote>\n  \u003Chr>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>2.3.7 加载内核模块+配置网络参数（ 集群网络基础核心 | 所有节点执行 ）\u003C\u002Fh3>\n\u003Cp>原理：overlay 是容器存储驱动（容器文件分层存储依赖），br_netfilter 是桥接网络模块（K8s 跨节点网络通信依赖），必须提前加载\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 创建内核模块加载配置文件，开机自动加载所需模块\ncat &gt; \u002Fetc\u002Fmodules-load.d\u002Fcontainerd.conf &lt;&lt;EOF\noverlay      # 容器存储内核模块\nbr_netfilter # 网桥过滤内核模块，用于集群网络转发\nEOF\n\n\n# 手动加载模块，无需重启立即生效\ncat &lt;&lt;EOF &gt; mod.sh\nmodprobe overlay\nmodprobe br_netfilter\nmodprobe ip_conntrack\nEOF\n\nbash mod.sh\n\n\n-------------------------------------------------------------------------\n\n# 加载ipvs相关内核模块\ncat &lt;&lt;EOF &gt; \u002Fetc\u002Fmodules-load.d\u002Fipvs.conf \nip_vs\nip_vs_lc\nip_vs_wlc\nip_vs_rr\nip_vs_wrr\nip_vs_lblc\nip_vs_lblcr\nip_vs_dh\nip_vs_sh\nip_vs_nq\nip_vs_sed\nip_vs_ftp\nip_vs_sh\nnf_conntrack_ipv4\nip_tables\nip_set\nxt_set\nipt_set\nipt_rpfilter\nipt_REJECT\nipip\nEOF\n\n\n# 配置转发相关参数，否则可能会出错\ncat &lt;&lt;EOF &gt;  \u002Fetc\u002Fsysctl.d\u002Fk8s.conf\nnet.bridge.bridge-nf-call-iptables=1\nnet.bridge.bridge-nf-call-ip6tables=1\nnet.ipv4.ip_forward=1\nvm.swappiness=0\nvm.overcommit_memory=1\nvm.panic_on_oom=0\nfs.inotify.max_user_instances=8192\nfs.inotify.max_user_watches=1048576\nfs.file-max=52706963\nfs.nr_open=52706963\nnet.ipv6.conf.all.disable_ipv6=1\nnet.netfilter.nf_conntrack_max=2310720\nEOF\n\n\n# 生效所有内核参数配置\nsysctl -p \u002Fetc\u002Fsysctl.d\u002Fk8s.conf\n\n# 重启系统\nreboot\n\n# 查看是否加载成功\nlsmod | grep ip_vs   # 必须重启之后 ， 这个才能查到\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>2.4 安装 containerd 容器运行时（所有节点执行｜K8s 容器引擎）\u003C\u002Fh2>\n\u003Cp>零基础科普：K8s 1.24 及以上版本不再支持 Docker，必须使用 containerd 作为容器运行引擎，所有 Pod 容器都由它启动管理\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 获取阿里云docker yum源\n[root@k8s-master ~]#  wget -O \u002Fetc\u002Fyum.repos.d\u002Fdocker-ce.repo https:\u002F\u002Fmirrors.aliyun.com\u002Fdocker-ce\u002Flinux\u002Fcentos\u002Fdocker-ce.repo\n\n# 清理并加载\n[root@k8s-master ~]# yum clean all;  yum makecache; yum repolist -v\n\n# 查看YUM源中Containerd软件\n[root@k8s-master ~]# yum list | grep containerd\ncontainerd.io.x86_64          2.3.3-1.el10              docker-ce-stable\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Col>\n \u003Cli>\u003Ch4>安装 containerd\u003C\u002Fh4>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cpre>\u003Ccode># 安装软件\n[root@k8s-master ~]# yum -y install containerd.io.x86_64 \n\n# 设置containerd服务启动及开机自启动\n[root@k8s-master ~]# systemctl enable --now containerd\n\n# 测试可用性\n[root@k8s-master ~]# ctr version\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Col>\n \u003Cli>\u003Ch4>配置containerd\u003C\u002Fh4>\n  \u003Cul>\n   \u003Cli>\u003Cp>生成containerd配置文件\u003C\u002Fp>\u003Cpre>\u003Ccode># 生成默认配置，config.toml这个文件二进制安装方式默认不存在，如果是Yum安装则直接覆盖\ncontainerd config default &gt; \u002Fetc\u002Fcontainerd\u002Fconfig.toml\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n   \u003Cli>\u003Cp>配置containerd cgroup 驱动程序systemd\u003C\u002Fp>\u003Cpre>\u003Ccode># 把SystemdCgroup = false修改为：SystemdCgroup = true，\nsed -i 's\u002FSystemdCgroup = false\u002FSystemdCgroup = true\u002Fg' \u002Fetc\u002Fcontainerd\u002Fconfig.toml\n\ncat \u002Fetc\u002Fcontainerd\u002Fconfig.toml | grep SystemdCgroup\n            SystemdCgroup = true\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n   \u003Cli>\u003Cp>修改sandbox_image 镜像源\u003C\u002Fp>\u003Cpre>\u003Ccode># 修改sandbox_image 镜像源，1.24以下k8s.gcr.io 、1.25 改成了registry.k8s.io，如果FQ了，这步就不用做了\nsed -i \"s#registry.k8s.io\u002Fpause#registry.aliyuncs.com\u002Fgoogle_containers\u002Fpause#g\" \u002Fetc\u002Fcontainerd\u002Fconfig.toml\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n   \u003Cli>\u003Cp>Containerd配置镜像加速\u003C\u002Fp>\u003Cp>endpoint位置添加阿里云的镜像源，\u003Ca href=\"https:\u002F\u002F1qfxozzy.mirror.aliyuncs.xn--com-l68d07r7pg7obca5ld359pbvlq5mwt8gtxybi6al6q0nw\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002F1qfxozzy.mirror.aliyuncs.com这个地址是我自己阿里加速器地址\u003C\u002Fa>，每个人都不一样\u003C\u002Fp>\u003Cpre>\u003Ccode># 新配置，k8s1.34版本之后，没有了上面mirrors相关的配置，直接修改下面这个config_path选项\n# 创建目录\n[root@k8s-master ~]# mkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d\n\n[root@k8s-master ~]# vim \u002Fetc\u002Fcontainerd\u002Fconfig.toml\n\n[plugins.'io.containerd.cri.v1.images'.registry]\n   config_path = '\u002Fetc\u002Fcontainerd\u002Fcerts.d'\n      \n# 然后，在 \u002Fetc\u002Fcontainerd\u002Fcerts.d 目录下为每个需要配置的镜像仓库创建子目录，并添加相应的配置文件。例如，为 docker.io 创建配置：\n\nmkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002F{docker.io,aliyuncs.com}\n\n# 创建index.conf文件添加镜像源地址：\ncat &lt;&lt;EOF | tee \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fdocker.io\u002Findex.conf\nmirrors:\n  - https:\u002F\u002Fregistry-1.docker.io\nEOF\n  \ncat &lt;&lt;EOF | tee \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Faliyuncs.com\u002Findex.conf\nmirrors:\n  - https:\u002F\u002F1qfxozzy.mirror.aliyuncs.com\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n  \u003C\u002Ful>\u003C\u002Fli>\n \u003Cli>\u003Ch4>\u003Cstrong>配置crictl\u003C\u002Fstrong>\u003C\u002Fh4>\n  \u003Cblockquote>\n   \u003Cp>\u003Cstrong>注意：这是1.36\u003Cstrong>\u003Cstrong>之前\u003C\u002Fstrong>\u003C\u002Fstrong>的操作，1.36版本只需要****yum\u003C\u002Fstrong> \u003Cstrong>install\u003C\u002Fstrong> \u003Cstrong>cri-tools -y即可）\u003C\u002Fstrong>\u003C\u002Fp>\n  \u003C\u002Fblockquote>\n  \u003Chr>\u003Cp>因为ctr命令查看镜像非常混乱，可以用这个命令查看镜像\u003C\u002Fp>\u003Cpre>\u003Ccode>cat &lt;&lt;EOF | tee \u002Fetc\u002Fcrictl.yaml\nruntime-endpoint: unix:\u002F\u002F\u002Frun\u002Fcontainerd\u002Fcontainerd.sock\nimage-endpoint: unix:\u002F\u002F\u002Frun\u002Fcontainerd\u002Fcontainerd.sock\ntimeout: 10\ndebug: false\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>重启containerd\u003C\u002Fp>\n\u003Cpre>\u003Ccode>systemctl restart containerd\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Cp>手动安装crictl,这个工具会自动下载,如果不想等,可以自己手动安装\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fkubernetes-sigs\u002Fcri-tools\u002Freleases\u002Fdownload\u002Fv1.27.0\u002Fcrictl-v1.27.0-linux-amd64.tar.gz\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fgithub.com\u002Fkubernetes-sigs\u002Fcri-tools\u002Freleases\u002Fdownload\u002Fv1.27.0\u002Fcrictl-v1.27.0-linux-amd64.tar.gz\u003C\u002Fa>\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 下载 crictl 的最新版本\nwget https:\u002F\u002Fgithub.com\u002Fkubernetes-sigs\u002Fcri-tools\u002Freleases\u002Fdownload\u002Fv1.27.0\u002Fcrictl-v1.27.0-linux-amd64.tar.gz -P \u002Fopt\u002Fbin\n\n# 解压 tar 文件\ntar zxvf crictl-v1.27.0-linux-amd64.tar.gz -C \u002Fusr\u002Flocal\u002Fbin\u002F\n\necho 'export PATH=$PATH:\u002Fusr\u002Flocal\u002Fbin' &gt;&gt; ~\u002F.bashrc\nsource ~\u002F.bashrc\n\ncrictl --version\n\n# 查看镜像\ncrictl image list\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2>2.5 配置 K8s 官方软件源（所有节点执行）\u003C\u002Fh2>\n\u003Cpre>\u003Ccode># 官方源 v1.35\ncat &lt;&lt;EOF | sudo tee \u002Fetc\u002Fyum.repos.d\u002Fkubernetes.repo\n[kubernetes]\nname=Kubernetes\nbaseurl=https:\u002F\u002Fpkgs.k8s.io\u002Fcore:\u002Fstable:\u002Fv1.35\u002Frpm\u002F\nenabled=1\ngpgcheck=1\ngpgkey=https:\u002F\u002Fpkgs.k8s.io\u002Fcore:\u002Fstable:\u002Fv1.35\u002Frpm\u002Frepodata\u002Frepomd.xml.key\nexclude=kubelet kubeadm kubectl cri-tools kubernetes-cni\nEOF\n\n# 清理旧缓存，刷新新软件源缓存\n[root@k8s-node1 ~]# yum clean all; yum makecache ; yum repolist -v\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2>2.6 安装 K8s 核心组件（所有节点执行）\u003C\u002Fh2>\n\u003Cp>组件零基础通俗讲解：\u003C\u002Fp>\n\u003Cul>\n \u003Cli>\u003Cp>\u003Cstrong>kubeadm\u003C\u002Fstrong>：集群初始化工具，负责创建集群、节点加入、重置集群\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>\u003Cstrong>kubelet\u003C\u002Fstrong>：节点守护进程，常驻后台，管理当前节点所有 Pod 的启动、停止、重启\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>\u003Cstrong>kubectl\u003C\u002Fstrong>：集群命令行工具，所有查看、操作集群的命令都靠它执行\u003C\u002Fp>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode># 查看软件源中 有什么版本\n[root@k8s-master ~]# dnf list --showduplicates kubeadm --disableexcludes=kubernetes\n\n# 安装最新版\n# 默认为最新版，对应最新版k8s\nyum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes\n# --disableexcludes=kubernetes 禁掉除了这个kubernetes之外的别的仓库\n\n# 查看版本\n[root@k8s-master ~]# kubectl version\nClient Version: v1.35.7\n[root@k8s-master ~]# yum info kubeadm\n……\nName         : kubeadm\nVersion      : 1.35.7\n\n# 设置kubelet开机自启，集群必备后台服务\nsystemctl enable --now kubelet\nsystemctl status kubelet\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>⚠️ 新手须知：集群未初始化前 kubelet 会报错，属于\u003Cstrong>正常现象\u003C\u002Fstrong>，无需处理！\u003C\u002Fp>\n \u003Cp>服务会出现起不来的现象\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2>2.7 获取镜像\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>特别说明：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>三个节点都要下载\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>注意下载时把版本号修改到官方最新版，即使下载了最新版也可能版本不对应，需要按报错提示下载\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>每次部署都会有版本更新，具体版本要求，运行初始化过程失败会有版本提示\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>kubeadm的版本和镜像的版本最好是对应的\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 查看镜像 \n[root@k8s-master ~]# kubeadm config images list --kubernetes-version v1.35.7\nregistry.k8s.io\u002Fkube-apiserver:v1.35.7\nregistry.k8s.io\u002Fkube-controller-manager:v1.35.7\nregistry.k8s.io\u002Fkube-scheduler:v1.35.7\nregistry.k8s.io\u002Fkube-proxy:v1.35.7\nregistry.k8s.io\u002Fcoredns\u002Fcoredns:v1.13.1\nregistry.k8s.io\u002Fpause:3.10.1\nregistry.k8s.io\u002Fetcd:3.6.6-0\n\n-----------------------------------------------------------\n# 查看国内镜像\n[root@k8s-master ~]# kubeadm config images list --kubernetes-version v1.35.7 --image-repository  registry.aliyuncs.com\u002Fgoogle_containers\nregistry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-apiserver:v1.35.7\nregistry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-controller-manager:v1.35.7\nregistry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-scheduler:v1.35.7\nregistry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-proxy:v1.35.7\nregistry.aliyuncs.com\u002Fgoogle_containers\u002Fcoredns:v1.13.1\nregistry.aliyuncs.com\u002Fgoogle_containers\u002Fpause:3.10.1\nregistry.aliyuncs.com\u002Fgoogle_containers\u002Fetcd:3.6.6-0\n\n------------------------------------------------------------------------------------\n下载镜像\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fetcd:3.6.6-0\n注意：必须用-n指定namespace，否则k8s和crictr都看不到镜像\n下载下来的镜像名称不用重新修改，直接使用aliyun的镜像\n\n\n----------------------------------------------------------------------\n1.35版本官方镜像\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-apiserver:v1.35.7\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-controller-manager:v1.35.7\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-scheduler:v1.35.7\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-proxy:v1.35.7\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fcoredns:v1.13.1\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fpause:3.10.1\nctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fetcd:3.6.6-0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906111958617-1584579262.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n3 集群初始化（仅控制节点执行｜参数逐行详解）\n\u003Cp>💡 核心：仅 \u003Cstrong>k8s-node1（192.48.75.10）\u003C\u002Fstrong> 执行，工作节点禁止执行！本命令用于创建整个 K8s 集群核心架构。\u003C\u002Fp>\n\u003Cp>这里推荐两种方式， 一种命令行， 一种配置文件， 命令行是 相对较老的版本， 建议用配置文件， 两种结果一样\u003C\u002Fp>\n\u003Cul>\n \u003Cli>配置文件\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode>[root@k8s-master ~]# kubeadm config print init-defaults &gt; kubeadm.yml\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>\u003Cstrong>修改刚生成的配置文件\u003C\u002Fstrong> advertiseAddress：为控制平面地址（ Master 主机 IP ） criSocket：为 containerd 的 socket 文件地址 imageRepository：阿里云镜像代理地址，否则拉取镜像会失败 kubernetesVersion：为 k8s 版本\u003C\u002Fp>\n \u003Cp>podSubnet: 10.244.0.0\u002F16 ： 同步网络插件flannal默认的pod网段地址\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cul>\n \u003Cli>socket文件位置\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode>[root@master ~]# find \u002F -name 'containerd.sock'\n\u002Frun\u002Fcontainerd\u002Fcontainerd.sock\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cul>\n \u003Cli>配置文件\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode>apiVersion: kubeadm.k8s.io\u002Fv1beta4\nbootstrapTokens:\n- groups:\n  - system:bootstrappers:kubeadm:default-node-token\n  token: abcdef.0123456789abcdef\n  ttl: 24h0m0s\n  usages:\n  - signing\n  - authentication\nkind: InitConfiguration\nlocalAPIEndpoint:\n  advertiseAddress: 192.48.75.10                               # 修改为自己master的ip\n  bindPort: 6443\nnodeRegistration:\n  criSocket: unix:\u002F\u002F\u002Frun\u002Fcontainerd\u002Fcontainerd.sock    # 修改为containerd的socket\n  imagePullPolicy: IfNotPresent\n  imagePullSerial: true\n  name: k8s-master                                 # 主节点名称\n  taints: null\ntimeouts:\n  controlPlaneComponentHealthCheck: 4m0s\n  discovery: 5m0s\n  etcdAPICall: 2m0s\n  kubeletHealthCheck: 4m0s\n  kubernetesAPICall: 1m0s\n  tlsBootstrap: 5m0s\n  upgradeManifests: 5m0s\n---\napiServer: {}\napiVersion: kubeadm.k8s.io\u002Fv1beta4\ncaCertificateValidityPeriod: 87600h0m0s\ncertificateValidityPeriod: 8760h0m0s\ncertificatesDir: \u002Fetc\u002Fkubernetes\u002Fpki\nclusterName: kubernetes\ncontrollerManager: {}\ndns: {}\nencryptionAlgorithm: RSA-2048\netcd:\n  local:\n    dataDir: \u002Fvar\u002Flib\u002Fetcd\nimageRepository: registry.aliyuncs.com\u002Fgoogle_containers               # 修改为阿里云镜像仓库\nkind: ClusterConfiguration\nkubernetesVersion: 1.35.7                        # 要安装的版本号\nnetworking:\n  dnsDomain: cluster.local\n  serviceSubnet: 10.96.0.0\u002F12\n  podSubnet: 10.244.0.0\u002F16    # 新添加的行，和即将要安装的网络插件有关\nproxy: {}\nscheduler: {}\n\n---                                                       # 此处所有内容为追加\napiVersion: kubelet.config.k8s.io\u002Fv1beta1\nkind: KubeletConfiguration\ncgroupDriver: systemd\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>开始初始化\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>kubeadm init --config=kubeadm.yml\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>如果报错, 请先清理， 然后在初始化\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>kubeadm reset -f; rm -rf \u002Fetc\u002Fkubernetes\u002F*; rm -rf \u002Fvar\u002Flib\u002Fkubelet\u002F*; rm -rf \u002Fvar\u002Flib\u002Fetcd\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>结果如下\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112016031-63704552.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>上面记录了完成的初始化输出的内容，根据输出可以看出手动初始化安装一个Kubernetes集群所需要的关键步骤。其中有以下关键内容：\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>[kubelet] 生成kubelet的配置文件\"\u002Fvar\u002Flib\u002Fkubelet\u002Fconfig.yaml\"\n[certificates]生成相关的各种证书\n[kubeconfig]生成相关的kubeconfig文件\n[bootstraptoken]生成token记录下来，后边使用kubeadm join往集群中添加节点时会用到\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112026222-254158326.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>按照初始化结果运行以下指令\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>export KUBECONFIG=\u002Fetc\u002Fkubernetes\u002Fadmin.conf\n\n# 创建用户kubeconfig配置目录\nmkdir -p $HOME\u002F.kube\n\n# 将集群管理员配置文件复制到用户目录\nsudo cp -i \u002Fetc\u002Fkubernetes\u002Fadmin.conf $HOME\u002F.kube\u002Fconfig\n\n# 修改文件归属为当前用户，授权操作权限\nsudo chown $(id -u):$(id -g) $HOME\u002F.kube\u002Fconfig\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>检测\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>[root@k8s-master ~]# kubectl get nodes\nNAME         STATUS     ROLES           AGE     VERSION\nk8s-master   NotReady   control-plane   3m54s   v1.35.7\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>因为网络插件没有配置\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Cul>\n \u003Cli>命令模式\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n \u003Cp>无注释\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>kubeadm init \\\n--apiserver-advertise-address=192.48.75.10 \\\n--pod-network-cidr=10.244.0.0\u002F16 \\\n--image-repository registry.aliyuncs.com\u002Fgoogle_containers \\\n--cri-socket=unix:\u002F\u002F\u002Fvar\u002Frun\u002Fcontainerd\u002Fcontainerd.sock\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112045079-833528928.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cul>\n \u003Cli>这一步需要一定时间\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cblockquote>\n \u003Cp>注释详解\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>kubeadm init \\\n# 指定主节点API服务监听IP（必须是本机固定IP）\n--apiserver-advertise-address=192.48.75.10 \\\n# 指定集群Pod网段，flannel网络插件固定适配此网段\n--pod-network-cidr=10.244.0.0\u002F16 \\\n# 指定阿里云镜像仓库，替代国外谷歌仓库，解决镜像拉取失败\n--image-repository registry.aliyuncs.com\u002Fgoogle_containers \\\n# 指定容器运行时socket路径，告知K8s使用containerd而非docker\n--cri-socket=unix:\u002F\u002F\u002Fvar\u002Frun\u002Fcontainerd\u002Fcontainerd.sock\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>3.1 配置管理员集群权限（新手操作集群必备）\u003C\u002Fh3>\n\u003Cp>原理：初始化后集群证书默认在系统目录，普通用户无法操作，复制到用户目录并授权，实现普通用户使用 kubectl 命令\u003C\u002Fp>\n\u003Cpre>\u003Ccode>export KUBECONFIG=\u002Fetc\u002Fkubernetes\u002Fadmin.conf\n\n# 创建用户kubeconfig配置目录\nmkdir -p $HOME\u002F.kube\n\n# 将集群管理员配置文件复制到用户目录\nsudo cp -i \u002Fetc\u002Fkubernetes\u002Fadmin.conf $HOME\u002F.kube\u002Fconfig\n\n# 修改文件归属为当前用户，授权操作权限\nsudo chown $(id -u):$(id -g) $HOME\u002F.kube\u002Fconfig\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>3.2 生成永久节点加入命令（解决token过期问题）\u003C\u002Fh3>\n\u003Cp>零基础知识点：默认集群加入令牌24小时过期，此命令生成\u003Cstrong>永久有效\u003C\u002Fstrong>的加入命令，方便后续节点加入集群\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 生成永久有效join命令，输出结果复制到两台工作节点执行\nkubeadm token create --print-join-command --ttl=0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>示例输出（新手直接复制自己机器输出的整条命令）：\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112056323-1380698280.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cp>kubeadm join 192.48.75.10:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxxxx\u003C\u002Fp>\n\u003Cpre>\u003Ccode>kubeadm join 192.48.75.10:6443 --token wfbics.7byjzuftbp70rvc0 --discovery-token-ca-cert-hash sha256:a71bc4fc467db17043269a08914f1e8ec08a4f81b526ae8d6d0c22749cd34c61 \n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>✅ 操作：两台工作节点执行上述命令，即可加入集群\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112103612-1072822193.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Ch3>3.3、测试\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>[root@k8s-master ~]# kubectl get nodes\nNAME         STATUS     ROLES           AGE     VERSION\nk8s-master   NotReady   control-plane   8m50s   v1.26.0\nk8s-node1    NotReady   &lt;none&gt;          53s     v1.26.0\nk8s-node2    NotReady   &lt;none&gt;          50s     v1.26.0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>此时 master 节点状态是\u003Ccode>NotReady\u003C\u002Fcode>，\u003Cstrong>这个是正常现象，还没装网络插件\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n4 部署 Flannel 网络插件（仅控制节点执行｜零基础网络原理）\n\u003Cp>新手必懂：集群初始化后，所有节点都是 \u003Cstrong>NotReady（未就绪）\u003C\u002Fstrong> 状态，因为缺少网络插件！Flannel 负责集群所有 Pod 跨节点通信，不部署集群无法使用。\u003C\u002Fp>\n\u003Cp>注意:flannel和calico只能二选一\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>\u003Cstrong>master节点下载yaml配置文件\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>版本会经常更新，flannel官方存储与github上，如果无法下载需要FQ直接github搜索flannel得到如下地址\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fflannel-io\u002Fflannel\u002Fmaster\u002FDocumentation\u002Fkube-flannel.yml\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fraw.githubusercontent.com\u002Fflannel-io\u002Fflannel\u002Fmaster\u002FDocumentation\u002Fkube-flannel.yml\u003C\u002Fa>\u003C\u002Fstrong>，然后浏览器打开右键另存到本地。\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>因为版本更新比较快， 可以直接访问 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsearch?g=flannel\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">https:\u002F\u002Fgithub.com\u002Fsearch?g=flannel\u003C\u002Fa>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112115855-714448877.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112121893-573088216.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112126928-145160916.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112132149-2144661656.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>可以根据这个网址下载文件\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>下载镜像\u003C\u002Fp>\n\u003Cp>用其他docker 主机下载了镜像\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 下载镜像\ndocker pull rancher\u002Fmirrored-flannelcni-flannel:v0.20.2 \ndocker pull rancher\u002Fmirrored-flannelcni-flannel-cni-plugin:v1.1.2\n\n# 打包镜像\ndocker save rancher\u002Fmirrored-flannelcni-flannel:v0.20.2 -o flannel-v0.20.2.tar\ndocker save rancher\u002Fmirrored-flannelcni-flannel-cni-plugin:v1.1.2 -o flannel-cni-v1.1.2.tar\n\n# k8s‑master 节点导入镜像到 containerd\nctr -n=k8s.io image import flannel-v0.20.2.tar \nctr -n=k8s.io image import flannel-cni-v1.1.2.tar\n\n# 查看\n[root@k8s-master ~]# ctr -n=k8s.io image list | grep flannel\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>修改镜像\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>apiVersion: v1\nkind: Namespace\nmetadata:\n  labels:\n    k8s-app: flannel\n    pod-security.kubernetes.io\u002Fenforce: privileged\n  name: kube-flannel\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  labels:\n    k8s-app: flannel\n  name: flannel\n  namespace: kube-flannel\n---\napiVersion: rbac.authorization.k8s.io\u002Fv1\nkind: ClusterRole\nmetadata:\n  labels:\n    k8s-app: flannel\n  name: flannel\nrules:\n- apiGroups:\n  - \"\"\n  resources:\n  - pods\n  verbs:\n  - get\n- apiGroups:\n  - \"\"\n  resources:\n  - nodes\n  verbs:\n  - get\n  - list\n  - watch\n- apiGroups:\n  - \"\"\n  resources:\n  - nodes\u002Fstatus\n  verbs:\n  - patch\n---\napiVersion: rbac.authorization.k8s.io\u002Fv1\nkind: ClusterRoleBinding\nmetadata:\n  labels:\n    k8s-app: flannel\n  name: flannel\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: flannel\nsubjects:\n- kind: ServiceAccount\n  name: flannel\n  namespace: kube-flannel\n---\napiVersion: v1\ndata:\n  cni-conf.json: |\n    {\n      \"name\": \"cbr0\",\n      \"cniVersion\": \"0.3.1\",\n      \"plugins\": [\n        {\n          \"type\": \"flannel\",\n          \"delegate\": {\n            \"hairpinMode\": true,\n            \"isDefaultGateway\": true\n          }\n        },\n        {\n          \"type\": \"portmap\",\n          \"capabilities\": {\n            \"portMappings\": true\n          }\n        }\n      ]\n    }\n  net-conf.json: |\n    {\n      \"Network\": \"10.244.0.0\u002F16\",\n      \"EnableNFTables\": false,\n      \"Backend\": {\n        \"Type\": \"vxlan\"\n      }\n    }\nkind: ConfigMap\nmetadata:\n  labels:\n    app: flannel\n    k8s-app: flannel\n    tier: node\n  name: kube-flannel-cfg\n  namespace: kube-flannel\n---\napiVersion: apps\u002Fv1\nkind: DaemonSet\nmetadata:\n  labels:\n    app: flannel\n    k8s-app: flannel\n    tier: node\n  name: kube-flannel-ds\n  namespace: kube-flannel\nspec:\n  selector:\n    matchLabels:\n      app: flannel\n      k8s-app: flannel\n  template:\n    metadata:\n      labels:\n        app: flannel\n        k8s-app: flannel\n        tier: node\n    spec:\n      affinity:\n        nodeAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n            nodeSelectorTerms:\n            - matchExpressions:\n              - key: kubernetes.io\u002Fos\n                operator: In\n                values:\n                - linux\n      containers:\n      - args:\n        - --ip-masq\n        - --kube-subnet-mgr\n        command:\n        - \u002Fopt\u002Fbin\u002Fflanneld\n        env:\n        - name: POD_NAME\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.name\n        - name: POD_NAMESPACE\n          valueFrom:\n            fieldRef:\n              fieldPath: metadata.namespace\n        - name: EVENT_QUEUE_DEPTH\n          value: \"5000\"\n        - name: CONT_WHEN_CACHE_NOT_READY\n          value: \"false\"\n        image: ghcr.io\u002Fflannel-io\u002Fflannel:v0.28.9\n        name: kube-flannel\n        resources:\n          requests:\n            cpu: 100m\n            memory: 50Mi\n        securityContext:\n          capabilities:\n            add:\n            - NET_ADMIN\n            - NET_RAW\n          privileged: false\n        volumeMounts:\n        - mountPath: \u002Frun\u002Fflannel\n          name: run\n        - mountPath: \u002Fetc\u002Fkube-flannel\u002F\n          name: flannel-cfg\n        - mountPath: \u002Frun\u002Fxtables.lock\n          name: xtables-lock\n      hostNetwork: true\n      initContainers:\n      - args:\n        - -f\n        - \u002Fflannel\n        - \u002Fopt\u002Fcni\u002Fbin\u002Fflannel\n        command:\n        - cp\n        image: docker.io\u002Francher\u002Fmirrored-flannelcni-flannel-cni-plugin:v1.1.2\n        name: install-cni-plugin\n        volumeMounts:\n        - mountPath: \u002Fopt\u002Fcni\u002Fbin\n          name: cni-plugin\n      - args:\n        - -f\n        - \u002Fetc\u002Fkube-flannel\u002Fcni-conf.json\n        - \u002Fetc\u002Fcni\u002Fnet.d\u002F10-flannel.conflist\n        command:\n        - cp\n        image: docker.io\u002Francher\u002Fmirrored-flannelcni-flannel:v0.20.2\n        name: install-cni\n        volumeMounts:\n        - mountPath: \u002Fetc\u002Fcni\u002Fnet.d\n          name: cni\n        - mountPath: \u002Fetc\u002Fkube-flannel\u002F\n          name: flannel-cfg\n      priorityClassName: system-node-critical\n      serviceAccountName: flannel\n      tolerations:\n      - effect: NoSchedule\n        operator: Exists\n      volumes:\n      - hostPath:\n          path: \u002Frun\u002Fflannel\n        name: run\n      - hostPath:\n          path: \u002Fopt\u002Fcni\u002Fbin\n        name: cni-plugin\n      - hostPath:\n          path: \u002Fetc\u002Fcni\u002Fnet.d\n        name: cni\n      - configMap:\n          name: kube-flannel-cfg\n        name: flannel-cfg\n      - hostPath:\n          path: \u002Frun\u002Fxtables.lock\n          type: FileOrCreate\n        name: xtables-lock\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>执行部署命令（零基础直接复制）：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 如果重新修改了配置文件， 需要先删除旧的  daemonset \n[root@k8s-master ~]# kubectl delete daemonset kube-flannel-ds -n kube-flannel\n\n# 应用yaml配置，部署flannel网络插件\n[root@k8s-master ~]# kubectl apply -f kube-flannel.yml\n\u003C\u002Fcode>\u003C\u002Fpre>\n5 集群状态验证（零基础结果解读教学）\n\u003Cp>部署完成后等待 1-3 分钟，等待所有网络 Pod 启动就绪，执行以下验证命令：\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 查看所有集群节点状态\n[root@k8s-master ~]# kubectl get pods -n kube-flannel -o wide\n\n# 正常结果：三个节点全部显示 Ready\n[root@k8s-master ~]#  kubectl get nodes\n\n# 查看集群所有Pod运行状态\n# 正常结果：所有Pod状态为Running，无报错、无重启\n[root@k8s-master ~]#  kubectl get pod -A\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>✅ \u003Cstrong>集群搭建成功标准\u003C\u002Fstrong>：节点全部 Ready、系统 Pod 全部 Running，无异常状态。\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fi1.wp.com\u002Fimg2024.cnblogs.com\u002Fblog\u002F2979143\u002F202609\u002F2979143-20260906112148381-231201692.png?w=720&amp;quality=65&amp;strip=all\" alt=\"image\">\u003C\u002Fp>\n\u003Chr>\n6 kubectl命令补全设置\n\u003Cblockquote>\n \u003Cp>默认的 kubectl 是没有命令补全的， 需要我们自己设置\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>kubectl 自动补全\nsource &lt;(kubectl completion bash)\necho \"source &lt;(kubectl completion bash)\" &gt;&gt; ~\u002F.bashrc\n需要退出当前shell重新登录以使其生效\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>现在使用， 就可以直接 tab 了\u003C\u002Fp>\n\u003C\u002Fblockquote>\n7 k8s 接入Harbor\n\u003Col>\n \u003Cli>\u003Ch2>环境准备\u003C\u002Fh2>\u003Cpre>\u003Ccode># 创建仓库证书统一存放目录（新标准规范）\nmkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n \u003Cli>\u003Ch2>域名解析配置（所有节点）\u003C\u002Fh2>\n  \u003Cblockquote>\n   \u003Cp>所有K8s节点配置hosts解析，保证能正常解析Harbor地址：\u003C\u002Fp>\n  \u003C\u002Fblockquote>\u003Cpre>\u003Ccode># 替换为你的Harbor服务器IP与域名\necho \"192.48.75.165 harbor.company.local\" &gt;&gt; \u002Fetc\u002Fhosts\n\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Col>\n \u003Cli>\u003Ch2>Harbor HTTPS 带证书仓库（生产环境）\u003C\u002Fh2>\n  \u003Cblockquote>\n   \u003Cp>生产环境强制使用HTTPS，导入Harbor CA证书，保证镜像拉取安全可信。\u003C\u002Fp>\n  \u003C\u002Fblockquote>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>步骤 1：所有 K8s 节点配置 hosts 域名解析\u003C\u002Fh3>\n\u003Cblockquote>\n \u003Cp>集群每一台机器，master、每个 worker 都执行\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>#写入hosts\necho \"192.48.75.165 harbor.company.local\" &gt;&gt; \u002Fetc\u002Fhosts\n\n#验证解析是否生效\nping harbor.company.local\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>步骤 2：操作系统全局信任 Harbor CA 根证书（所有节点）\u003C\u002Fh3>\n\u003Cp>让 curl、wget 等系统工具信任 harbor 的 https 证书\u003C\u002Fp>\n\u003Cpre>\u003Ccode>mkdir -p \u002Fetc\u002Fpki\u002Fca-trust\u002Fsource\u002Fanchors\u002F\n#把harbor服务器ca.crt拷贝到本机\nscp root@192.48.75.165:\u002Fopt\u002Fharbor\u002Fcert\u002Fca.crt \u002Fetc\u002Fpki\u002Fca-trust\u002Fsource\u002Fanchors\u002F\n#更新系统证书库\nupdate-ca-trust\n\n#验证系统https访问harbor是否正常\ncurl -I https:\u002F\u002Fharbor.company.local\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>步骤 3：containerd 镜像仓库证书目录配置（所有节点）\u003C\u002Fh3>\n\u003Cblockquote>\n \u003Cp>containerd 拉镜像，会读取\u003Ccode>\u002Fetc\u002Fcontainerd\u002Fcerts.d\u003C\u002Fcode>目录下证书，这是 containerd 独立证书体系，\u003Cstrong>不依赖系统 ca‑trust\u003C\u002Fstrong>。 目录名\u003Cstrong>必须完全等于 harbor 域名\u003C\u002Fstrong>：\u003Ccode>harbor.company.local\u003C\u002Fcode>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>#创建根目录\nmkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d\n#创建对应域名的证书目录\nmkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local\n\n#拷贝harbor ca.crt到此目录\nscp root@192.48.75.165:\u002Fopt\u002Fharbor\u002Fcert\u002Fca.crt \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local\u002F\nchmod 644 \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local\u002Fca.crt\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>步骤 4：修改 containerd 配置文件 \u003Ccode>\u002Fetc\u002Fcontainerd\u002Fconfig.toml\u003C\u002Fcode>\u003C\u002Fh3>\n\u003Cblockquote>\n \u003Cp>⚠️删掉文档里面的 \u003Ccode>[].auth\u003C\u002Fcode> 明文账号密码块！！不要写 username password！！ 只保留 registry 的 config_path，mirrors、tls 配置。 重点：mirrors、configs 的 key 域名必须是真实域名\u003Ccode>harbor.company.local\u003C\u002Fcode>，不要写 harbor.k8s.local！\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>找到 \u003Ccode>[plugins.\"io.containerd.grpc.v1.cri\".registry]\u003C\u002Fcode>，修改 config_path：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>[plugins.\"io.containerd.grpc.v1.cri\".registry]\n  config_path = \"\u002Fetc\u002Fcontainerd\u002Fcerts.d\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>文件末尾追加下面完整片段\u003C\u002Fp>\n\u003Cpre>\u003Ccode>#镜像仓库镜像配置，key写真实harbor域名 harbor.company.local\n[plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"harbor.company.local\"]\n  endpoint = [\"https:\u002F\u002Fharbor.company.local\"]\n\n#TLS证书配置，关闭跳过证书校验\n[plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"harbor.company.local\".tls]\n  ca_file = \"\u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local\u002Fca.crt\"\n  insecure_skip_verify = false\n\n###########【重要】这里不要加auth块！不要写admin密码！！生产禁止明文！！###########\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>所有节点重启 containerd 生效\u003C\u002Fh4>\n\u003Cpre>\u003Ccode>systemctl daemon-reload;systemctl restart containerd\nsystemctl status containerd\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n \u003Cp>校验配置是否加载成功，检查没有报错即可。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch4>测试 containerd 能否拉镜像（节点本地测试）\u003C\u002Fh4>\n\u003Cblockquote>\n \u003Cp>\u003Ccode>--creds\u003C\u002Fcode>仅临时测试用，\u003Cstrong>不会写入配置文件，测试完就完事\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>crictl pull --creds admin:Harbor123456 harbor.company.local\u002Fnginx\u002Fnginx:v1.19\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>成功：代表节点证书、网络全部正常。\u003C\u002Fp>\n\u003Cp>失败：排查 hosts、ca.crt 文件路径、config.toml 语法、containerd 状态。\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>注意：\u003Cstrong>crictl 测试成功 ≠ Pod 可以跑起来\u003C\u002Fstrong>。Pod 不会使用\u003Ccode>--creds\u003C\u002Fcode>参数，Pod 依赖 k8s 的 secret。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>步骤 5：K8s 集群创建 ImagePullSecret（只需要在 master 执行，集群资源，worker 不用执行）\u003C\u002Fh3>\n\u003Cblockquote>\n \u003Cp>secret 是 k8s 集群资源，只需要执行一次，\u003Cstrong>生效在当前命名空间 (default)\u003C\u002Fstrong> --docker-server 只写域名，不带 https:\u002F\u002F\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>kubectl create secret docker-registry harbor-secret \\\n--docker-server=harbor.company.local \\\n--docker-username=admin \\\n--docker-password=Harbor123456\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>查看 secret 是否创建成功\u003C\u002Fp>\n\u003Cpre>\u003Ccode>kubectl get secrets\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>输出列表能看到\u003Ccode>harbor‑secret\u003C\u002Fcode>。\u003C\u002Fp>\n\u003Ch3>步骤 6【推荐】配置当前命名空间全局默认镜像秘钥\u003C\u002Fh3>\n\u003Cblockquote>\n \u003Cp>default 命名空间所有 Pod 自动带上拉取秘钥，yaml 不需要每次写\u003Ccode>imagePullSecrets\u003C\u002Fcode> \u003Cstrong>仅 master 执行\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>kubectl patch serviceaccount default -p '{\"imagePullSecrets\": [{\"name\": \"harbor-secret\"}]}'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>校验 sa 配置是否写入成功：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>kubectl get sa default -o yaml\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>看到输出包含\u003Ccode>imagePullSecrets: - name: harbor-secret\u003C\u002Fcode>代表配置完成。\u003C\u002Fp>\n\u003Cblockquote>\n \u003Cp>⚠️注意：\u003Cstrong>已经存在的旧 Pod 不会自动继承 sa 配置，旧 Pod 必须删除重建\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode># 删除旧的 pod\n  kubectl delete pod harbor-demo-pod\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>步骤 7：编写测试 Pod yaml harbor-demo-pod.yaml\u003C\u002Fh3>\n\u003Cblockquote>\n \u003Cp>因为已经配置全局 sa，yaml 中\u003Cstrong>不需要写 imagePullSecrets\u003C\u002Fstrong>\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cpre>\u003Ccode>apiVersion: v1\nkind: Pod\nmetadata:\n  name: harbor-demo-pod\nspec:\n  containers:\n  - name: nginx\n    image: harbor.company.local\u002Fnginx\u002Fnginx:v1.19\n    ports:\n    - containerPort: 80\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>执行创建 pod\u003C\u002Fp>\n\u003Cpre>\u003Ccode># 构建pod\n[root@k8s-master ~]# kubectl apply -f harbor-demo-pod.yaml\n\n# 查看\n[root@k8s-master ~]# kubectl get po\nNAME              READY   STATUS             RESTARTS   AGE\nharbor-demo-pod   1\u002F1     Running            0          13m\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>步骤 8：排错流程（出现 ImagePullBackOff 必做）\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>#查看pod完整事件，看真实报错原因\nkubectl describe pod harbor-demo-pod\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Col>\n \u003Cli>\u003Ch2>crictl 命令\u003C\u002Fh2>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n \u003Cp>注意：\u003Cstrong>crictl 没有 push 推送镜像命令！推送镜像请用 docker 或者 nerdctl，crictl 只负责 CRI，也就是 K8s 节点拉镜像，不负责上传镜像到 Harbor\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ctable>\n \u003Cthead>\n  \u003Ctr>\n   \u003Cth>\u003C\u002Fth>\n   \u003Cth>\u003C\u002Fth>\n   \u003Cth>\u003C\u002Fth>\n  \u003C\u002Ftr>\n \u003C\u002Fthead>\n \u003Ctbody>\n  \u003Ctr>\n   \u003Ctd>命令\u003C\u002Ftd>\n   \u003Ctd>作用\u003C\u002Ftd>\n   \u003Ctd>常用示例\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>crictl images\u003C\u002Ftd>\n   \u003Ctd>列出本地所有镜像\u003C\u002Ftd>\n   \u003Ctd>crictl images\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>crictl pull\u003C\u002Ftd>\n   \u003Ctd>拉取镜像\u003C\u002Ftd>\n   \u003Ctd>crictl pull --creds user:pass harbor.company.local\u002Fxxx:tag\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>crictl rmi\u003C\u002Ftd>\n   \u003Ctd>删除本地镜像\u003C\u002Ftd>\n   \u003Ctd>crictl rmi harbor.company.local\u002Fnginx\u002Fnginx:v1.19\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>crictl inspecti\u003C\u002Ftd>\n   \u003Ctd>查看镜像详细元数据\u003C\u002Ftd>\n   \u003Ctd>crictl inspecti harbor.company.local\u002Fnginx\u002Fnginx:v1.19\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>crictl load\u003C\u002Ftd>\n   \u003Ctd>导入本地 tar 镜像包\u003C\u002Ftd>\n   \u003Ctd>crictl load -i xxx.tar\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n   \u003Ctd>crictl save\u003C\u002Ftd>\n   \u003Ctd>导出镜像到 tar 包\u003C\u002Ftd>\n   \u003Ctd>crictl save -o output.tar harbor.company.local\u002Fnginx\u002Fnginx:v1.19\u003C\u002Ftd>\n  \u003C\u002Ftr>\n \u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Chr>\n8 新手高频报错解决方案\n\u003Col>\n \u003Cli>\u003Ch2>节点一直 NotReady\u003C\u002Fh2>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cul>\n \u003Cli>\u003Cp>90% 原因：Flannel Pod 未启动成功，执行 \u003Ccode>kubectl get pod -n kube-flannel\u003C\u002Fcode> 查看异常日志\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>10% 原因：swap 未彻底关闭、内核参数未生效，重新执行环境配置命令\u003C\u002Fp>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n \u003Cli>\u003Ch2>containerd 启动失败\u003C\u002Fh2>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cul>\n \u003Cli>\u003Cp>核心原因：toml 配置文件空格、缩进错误（新手最容易出错）\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>解决方案：直接复制本教程完整配置覆盖，不要手动修改格式\u003C\u002Fp>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n \u003Cli>\u003Ch2>初始化镜像拉取失败\u003C\u002Fh2>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cul>\n \u003Cli>\u003Cp>检查机器外网是否通畅\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>确认初始化命令使用了阿里云镜像仓库参数\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>Swap 没关闭\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>主机名填写错误\u003C\u002Fp>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n \u003Cli>\u003Ch2>工作节点加入集群失败\u003C\u002Fh2>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cul>\n \u003Cli>\u003Cp>核对三台机器 hosts 解析是否一致\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>确认防火墙、SELinux、swap 全部关闭\u003C\u002Fp>\u003C\u002Fli>\n \u003Cli>\u003Cp>确认所有节点时间同步一致\u003C\u002Fp>\u003C\u002Fli>\n\u003C\u002Ful>","k8s版本: v1.35.7 部署 OS：Rocky Linux 10（零基础适配） 集群架构：1 控制节点 + 2 工作节点 容器运行时：containerd 网络组件：flannel:v0.28.9 适配说明：本手册专为零基础编写，摒弃专业默认知识点，每一条命令带详细注释、每一步操作带作用讲解、标注必做\u002F禁忌项，由 CentOS7 迁移适配 Rocky Linux10，全程可无脑复刻执行。 前置零基础认知：K8s 集群必须统一环境、关闭系统防护、配置网络内核，否则 100% 部署报错，本文所有全局操作三台机器必须全部执行。 1 集群搭建方案选型（零基础科普） 新手必看：不同搭建方式适配不同场景，本教程选择裸机手动部署，适合学习企业真实部署逻辑，是运维必备技能。 搭建方式 适用场景 零基础通俗讲解 minikube 单机测试、零基础入门体验 只能在一台电脑上跑的简易 K8s，功能残缺，只能用来简单看看界面，学不到真实集群部署逻辑，不推荐深度学习 k3s 边缘设备、小型测试集群 精简版 K8s，自动简化很多配置，部署快，但屏蔽了底层原理，新手学不到核心知识 裸机手动部署 企业测试、生产集群、运维学习 完全手动配置每一项参数，和企业生产环境一致，能吃透 K8s 底层逻辑，新手首选学习方式，本教程全程采用此方式 云平台托管集群 企业线上生产环境 云端一键搭建，不用自己配置，成本高，新手无法学习部署原理，只适合直接使用，不适合学习 实验架构说明：本次搭建 1 主 2 从简易集群，满足学习需求；企业生产必须 3 台控制节点实现高可用，防止单点故障。 2 集群环境准备（企业标准｜零基础全注释） 💡 核心重点：本章所有命令，三台节点（1主2从）必须全部执行！集群环境不一致，后续 100% 报错。 2.1 硬件配置要求（新手必读） 节点数量：3 台 Rocky Linux 10 虚拟机\u002F物理机 最低配置：内存≥2G、CPU≥2核、硬盘≥30G（配置过低会导致集群卡顿、Pod 启动失败） 网络要求：三台机器内网互通、能正常上网（需要下载软件、拉取镜像） 2.2 集群 IP 固定规划 K8s 集群禁止 IP 动态变化，必须固定 IP，以下为本次统一规划： 主机名 节点角色 固定 IP 地址 k8s‑master 控制节点（主节点） 192.48.75.10 k8s‑node1 工作节点（从节点） 192.48.75.11 k8s‑node2 工作节点（从节点） 192.48.75.12 注意： 如果你的主机是用克隆的， 一定要把网络配置里面的 uuid 修改或删除 # 生成本机的 uuid [root@node ~]# uuidgen 42b63197-dca2-4f7f-abed-b6edef9b51c1 # 修改配置 [root@node ~]# vim \u002Fetc\u002FNetworkManager\u002Fsystem-connections\u002Fens160.nmconnection [connection] id=ens160 uuid=42b63197-dca2-4f7f-abed-b6edef9b51c1 type=ethernet # 重启服务 [root@node ~]# systemctl restart NetworkManager [root@node ~]# nmcli con down ens160 ;nmcli con up ens160 2.3 全局环境统一配置（三台节点全执行｜逐行注释） 2.3.1 设置主机名（作用：区分集群节点，方便集群识别） 原理：K8s 通过主机名+IP 识别节点，三台机器必须拥有不同主机名，永久生效 # ========== 仅 k8s-node1（主节点）执行 ========== # hostnamectl set-hostname 主机名：永久修改系统主机名，重启不失效 hostnamectl set-hostname k8s-master # ========== 仅 k8s-node2（从节点）执行 ========== hostnamectl set-hostname k8s-node1 # ========== 仅 k8s-node3（从节点）执行 ========== hostnamectl set-hostname k8s-node2 2.3.2 配置 hosts 域名解析（作用：让三台机器互相识别主机名） 原理：默认机器无法通过主机名互通，配置 hosts 后，机器输入主机名即可对应到固定 IP，避免集群通信失败 # cat >> \u002Fetc\u002Fhosts：向系统域名配置文件追加内容 # EOF 为起止标识，中间内容会写入文件 cat >> \u002Fetc\u002Fhosts \u003C\u003CEOF 192.48.75.10 k8s-master 192.48.75.11 k8s-node1 192.48.75.12 k8s-node2 EOF 2.3.3 关闭防火墙（作用：放行集群所有通信端口） 新手必懂原理：Linux 防火墙会拦截端口通信，K8s 集群有成百上千个端口需要互通，手动放行极其麻烦，测试环境直接关闭防火墙，规避端口拦截报错 # systemctl stop：临时关闭防火墙，当前立即生效 systemctl stop firewalld # systemctl disable：永久禁止防火墙开机自启，重启机器不会自动开启 systemctl disable firewalld 2.3.4 关闭 SELinux（作用：解除系统权限拦截，K8s 必关项） 原理：SELinux 是 Linux 安全权限机制，会拦截 K8s 读写、创建资源的权限，不关闭集群百分百启动失败 # setenforce 0：临时关闭 SELinux，立即生效 setenforce 0 # sed 替换命令：修改系统配置文件，永久关闭 SELinux # 匹配以SELINUX=开头的行，替换为SELINUX=disabled sed -i 's\u002F^SELINUX=.*\u002FSELINUX=disabled\u002F' \u002Fetc\u002Fselinux\u002Fconfig 2.3.5 关闭 swap 交换分区（K8s 强制要求） 新手核心知识点：swap 是硬盘虚拟内存，K8s 调度 Pod 时不允许使用虚拟内存，swap 不关闭，kubeadm 初始化直接报错终止 # swapoff -a：临时关闭所有swap分区，立即生效 swapoff -a # sed 注释fstab文件中的swap挂载行，永久关闭，重启不恢复 sed -ri 's\u002F.*swap.*\u002F#&\u002F' \u002Fetc\u002Ffstab # 检查是否关闭 [root@k8s-master ~]# free -m total used free shared buff\u002Fcache available Mem: 3877 570 3245 9 289 3306 Swap: 0 0 0 注意: 改完fstab先重启，再做下面的操作 reboot 2.3.6 系统时间同步（作用：保证集群所有节点时间一致） 原理：K8s 证书、日志、Pod 调度依赖系统时间，三台机器时间偏差过大，会出现鉴权失败、节点离线问题 每台主机安装软件 # 判断软件是否安装 rpm -aq chrony # dnf install：安装系统时间同步工具chrony（Rocky10默认工具） dnf install chrony -y # 启动chronyd服务并设置开机自启 systemctl enable --now chronyd # 查看当前时间同步源，确认同步成功 chronyc sources master控制节点，设置为时间同步主节点 # 修改相关配置 [root@k8s-master ~]# vim \u002Fetc\u002Fchrony.conf …… server ntp.aliyun.com iburst …… allow 192.48.75.0\u002F24 # 重启服务 [root@k8s-master ~]# systemctl restart chronyd 其他两个工作节点配置 # 修改相关配置 [root@k8s-node2 ~]# vim \u002Fetc\u002Fchrony.conf …… pool k8s-master iburst …… # 重启服务 [root@k8s-node2 ~]# systemctl restart chronyd 测试 是否成功 [root@k8s-node1 ~]# chronyc sources MS Name\u002FIP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* k8s-master 4 6 77 45 -162us[-6383us] +\u002F- 42ms 注意： 一定要是 * 号才代表成功 2.3.7 加载内核模块+配置网络参数（ 集群网络基础核心 | 所有节点执行 ） 原理：overlay 是容器存储驱动（容器文件分层存储依赖），br_netfilter 是桥接网络模块（K8s 跨节点网络通信依赖），必须提前加载 # 创建内核模块加载配置文件，开机自动加载所需模块 cat > \u002Fetc\u002Fmodules-load.d\u002Fcontainerd.conf \u003C\u003CEOF overlay # 容器存储内核模块 br_netfilter # 网桥过滤内核模块，用于集群网络转发 EOF # 手动加载模块，无需重启立即生效 cat \u003C\u003CEOF > mod.sh modprobe overlay modprobe br_netfilter modprobe ip_conntrack EOF bash mod.sh ------------------------------------------------------------------------- # 加载ipvs相关内核模块 cat \u003C\u003CEOF > \u002Fetc\u002Fmodules-load.d\u002Fipvs.conf ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp ip_vs_sh nf_conntrack_ipv4 ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip EOF # 配置转发相关参数，否则可能会出错 cat \u003C\u003CEOF > \u002Fetc\u002Fsysctl.d\u002Fk8s.conf net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 vm.swappiness=0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF # 生效所有内核参数配置 sysctl -p \u002Fetc\u002Fsysctl.d\u002Fk8s.conf # 重启系统 reboot # 查看是否加载成功 lsmod | grep ip_vs # 必须重启之后 ， 这个才能查到 2.4 安装 containerd 容器运行时（所有节点执行｜K8s 容器引擎） 零基础科普：K8s 1.24 及以上版本不再支持 Docker，必须使用 containerd 作为容器运行引擎，所有 Pod 容器都由它启动管理 # 获取阿里云docker yum源 [root@k8s-master ~]# wget -O \u002Fetc\u002Fyum.repos.d\u002Fdocker-ce.repo https:\u002F\u002Fmirrors.aliyun.com\u002Fdocker-ce\u002Flinux\u002Fcentos\u002Fdocker-ce.repo # 清理并加载 [root@k8s-master ~]# yum clean all; yum makecache; yum repolist -v # 查看YUM源中Containerd软件 [root@k8s-master ~]# yum list | grep containerd containerd.io.x86_64 2.3.3-1.el10 docker-ce-stable 安装 containerd # 安装软件 [root@k8s-master ~]# yum -y install containerd.io.x86_64 # 设置containerd服务启动及开机自启动 [root@k8s-master ~]# systemctl enable --now containerd # 测试可用性 [root@k8s-master ~]# ctr version 配置containerd 生成containerd配置文件 # 生成默认配置，config.toml这个文件二进制安装方式默认不存在，如果是Yum安装则直接覆盖 containerd config default > \u002Fetc\u002Fcontainerd\u002Fconfig.toml 配置containerd cgroup 驱动程序systemd # 把SystemdCgroup = false修改为：SystemdCgroup = true， sed -i 's\u002FSystemdCgroup = false\u002FSystemdCgroup = true\u002Fg' \u002Fetc\u002Fcontainerd\u002Fconfig.toml cat \u002Fetc\u002Fcontainerd\u002Fconfig.toml | grep SystemdCgroup SystemdCgroup = true 修改sandbox_image 镜像源 # 修改sandbox_image 镜像源，1.24以下k8s.gcr.io 、1.25 改成了registry.k8s.io，如果FQ了，这步就不用做了 sed -i \"s#registry.k8s.io\u002Fpause#registry.aliyuncs.com\u002Fgoogle_containers\u002Fpause#g\" \u002Fetc\u002Fcontainerd\u002Fconfig.toml Containerd配置镜像加速 endpoint位置添加阿里云的镜像源，https:\u002F\u002F1qfxozzy.mirror.aliyuncs.com这个地址是我自己阿里加速器地址，每个人都不一样 # 新配置，k8s1.34版本之后，没有了上面mirrors相关的配置，直接修改下面这个config_path选项 # 创建目录 [root@k8s-master ~]# mkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d [root@k8s-master ~]# vim \u002Fetc\u002Fcontainerd\u002Fconfig.toml [plugins.'io.containerd.cri.v1.images'.registry] config_path = '\u002Fetc\u002Fcontainerd\u002Fcerts.d' # 然后，在 \u002Fetc\u002Fcontainerd\u002Fcerts.d 目录下为每个需要配置的镜像仓库创建子目录，并添加相应的配置文件。例如，为 docker.io 创建配置： mkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002F{docker.io,aliyuncs.com} # 创建index.conf文件添加镜像源地址： cat \u003C\u003CEOF | tee \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fdocker.io\u002Findex.conf mirrors: - https:\u002F\u002Fregistry-1.docker.io EOF cat \u003C\u003CEOF | tee \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Faliyuncs.com\u002Findex.conf mirrors: - https:\u002F\u002F1qfxozzy.mirror.aliyuncs.com EOF 配置crictl 注意：这是1.36之前的操作，1.36版本只需要****yum install cri-tools -y即可） 因为ctr命令查看镜像非常混乱，可以用这个命令查看镜像 cat \u003C\u003CEOF | tee \u002Fetc\u002Fcrictl.yaml runtime-endpoint: unix:\u002F\u002F\u002Frun\u002Fcontainerd\u002Fcontainerd.sock image-endpoint: unix:\u002F\u002F\u002Frun\u002Fcontainerd\u002Fcontainerd.sock timeout: 10 debug: false EOF 重启containerd systemctl restart containerd 手动安装crictl,这个工具会自动下载,如果不想等,可以自己手动安装 https:\u002F\u002Fgithub.com\u002Fkubernetes-sigs\u002Fcri-tools\u002Freleases\u002Fdownload\u002Fv1.27.0\u002Fcrictl-v1.27.0-linux-amd64.tar.gz # 下载 crictl 的最新版本 wget https:\u002F\u002Fgithub.com\u002Fkubernetes-sigs\u002Fcri-tools\u002Freleases\u002Fdownload\u002Fv1.27.0\u002Fcrictl-v1.27.0-linux-amd64.tar.gz -P \u002Fopt\u002Fbin # 解压 tar 文件 tar zxvf crictl-v1.27.0-linux-amd64.tar.gz -C \u002Fusr\u002Flocal\u002Fbin\u002F echo 'export PATH=$PATH:\u002Fusr\u002Flocal\u002Fbin' >> ~\u002F.bashrc source ~\u002F.bashrc crictl --version # 查看镜像 crictl image list 2.5 配置 K8s 官方软件源（所有节点执行） # 官方源 v1.35 cat \u003C\u003CEOF | sudo tee \u002Fetc\u002Fyum.repos.d\u002Fkubernetes.repo [kubernetes] name=Kubernetes baseurl=https:\u002F\u002Fpkgs.k8s.io\u002Fcore:\u002Fstable:\u002Fv1.35\u002Frpm\u002F enabled=1 gpgcheck=1 gpgkey=https:\u002F\u002Fpkgs.k8s.io\u002Fcore:\u002Fstable:\u002Fv1.35\u002Frpm\u002Frepodata\u002Frepomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF # 清理旧缓存，刷新新软件源缓存 [root@k8s-node1 ~]# yum clean all; yum makecache ; yum repolist -v 2.6 安装 K8s 核心组件（所有节点执行） 组件零基础通俗讲解： kubeadm：集群初始化工具，负责创建集群、节点加入、重置集群 kubelet：节点守护进程，常驻后台，管理当前节点所有 Pod 的启动、停止、重启 kubectl：集群命令行工具，所有查看、操作集群的命令都靠它执行 # 查看软件源中 有什么版本 [root@k8s-master ~]# dnf list --showduplicates kubeadm --disableexcludes=kubernetes # 安装最新版 # 默认为最新版，对应最新版k8s yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes # --disableexcludes=kubernetes 禁掉除了这个kubernetes之外的别的仓库 # 查看版本 [root@k8s-master ~]# kubectl version Client Version: v1.35.7 [root@k8s-master ~]# yum info kubeadm …… Name : kubeadm Version : 1.35.7 # 设置kubelet开机自启，集群必备后台服务 systemctl enable --now kubelet systemctl status kubelet ⚠️ 新手须知：集群未初始化前 kubelet 会报错，属于正常现象，无需处理！ 服务会出现起不来的现象 2.7 获取镜像 特别说明： 三个节点都要下载 注意下载时把版本号修改到官方最新版，即使下载了最新版也可能版本不对应，需要按报错提示下载 每次部署都会有版本更新，具体版本要求，运行初始化过程失败会有版本提示 kubeadm的版本和镜像的版本最好是对应的 # 查看镜像 [root@k8s-master ~]# kubeadm config images list --kubernetes-version v1.35.7 registry.k8s.io\u002Fkube-apiserver:v1.35.7 registry.k8s.io\u002Fkube-controller-manager:v1.35.7 registry.k8s.io\u002Fkube-scheduler:v1.35.7 registry.k8s.io\u002Fkube-proxy:v1.35.7 registry.k8s.io\u002Fcoredns\u002Fcoredns:v1.13.1 registry.k8s.io\u002Fpause:3.10.1 registry.k8s.io\u002Fetcd:3.6.6-0 ----------------------------------------------------------- # 查看国内镜像 [root@k8s-master ~]# kubeadm config images list --kubernetes-version v1.35.7 --image-repository registry.aliyuncs.com\u002Fgoogle_containers registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-apiserver:v1.35.7 registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-controller-manager:v1.35.7 registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-scheduler:v1.35.7 registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-proxy:v1.35.7 registry.aliyuncs.com\u002Fgoogle_containers\u002Fcoredns:v1.13.1 registry.aliyuncs.com\u002Fgoogle_containers\u002Fpause:3.10.1 registry.aliyuncs.com\u002Fgoogle_containers\u002Fetcd:3.6.6-0 ------------------------------------------------------------------------------------ 下载镜像 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fetcd:3.6.6-0 注意：必须用-n指定namespace，否则k8s和crictr都看不到镜像 下载下来的镜像名称不用重新修改，直接使用aliyun的镜像 ---------------------------------------------------------------------- 1.35版本官方镜像 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-apiserver:v1.35.7 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-controller-manager:v1.35.7 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-scheduler:v1.35.7 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fkube-proxy:v1.35.7 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fcoredns:v1.13.1 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fpause:3.10.1 ctr -n=k8s.io image pull registry.aliyuncs.com\u002Fgoogle_containers\u002Fetcd:3.6.6-0 3 集群初始化（仅控制节点执行｜参数逐行详解） 💡 核心：仅 k8s-node1（192.48.75.10） 执行，工作节点禁止执行！本命令用于创建整个 K8s 集群核心架构。 这里推荐两种方式， 一种命令行， 一种配置文件， 命令行是 相对较老的版本， 建议用配置文件， 两种结果一样 配置文件 [root@k8s-master ~]# kubeadm config print init-defaults > kubeadm.yml 修改刚生成的配置文件 advertiseAddress：为控制平面地址（ Master 主机 IP ） criSocket：为 containerd 的 socket 文件地址 imageRepository：阿里云镜像代理地址，否则拉取镜像会失败 kubernetesVersion：为 k8s 版本 podSubnet: 10.244.0.0\u002F16 ： 同步网络插件flannal默认的pod网段地址 socket文件位置 [root@master ~]# find \u002F -name 'containerd.sock' \u002Frun\u002Fcontainerd\u002Fcontainerd.sock 配置文件 apiVersion: kubeadm.k8s.io\u002Fv1beta4 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.48.75.10 # 修改为自己master的ip bindPort: 6443 nodeRegistration: criSocket: unix:\u002F\u002F\u002Frun\u002Fcontainerd\u002Fcontainerd.sock # 修改为containerd的socket imagePullPolicy: IfNotPresent imagePullSerial: true name: k8s-master # 主节点名称 taints: null timeouts: controlPlaneComponentHealthCheck: 4m0s discovery: 5m0s etcdAPICall: 2m0s kubeletHealthCheck: 4m0s kubernetesAPICall: 1m0s tlsBootstrap: 5m0s upgradeManifests: 5m0s --- apiServer: {} apiVersion: kubeadm.k8s.io\u002Fv1beta4 caCertificateValidityPeriod: 87600h0m0s certificateValidityPeriod: 8760h0m0s certificatesDir: \u002Fetc\u002Fkubernetes\u002Fpki clusterName: kubernetes controllerManager: {} dns: {} encryptionAlgorithm: RSA-2048 etcd: local: dataDir: \u002Fvar\u002Flib\u002Fetcd imageRepository: registry.aliyuncs.com\u002Fgoogle_containers # 修改为阿里云镜像仓库 kind: ClusterConfiguration kubernetesVersion: 1.35.7 # 要安装的版本号 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0\u002F12 podSubnet: 10.244.0.0\u002F16 # 新添加的行，和即将要安装的网络插件有关 proxy: {} scheduler: {} --- # 此处所有内容为追加 apiVersion: kubelet.config.k8s.io\u002Fv1beta1 kind: KubeletConfiguration cgroupDriver: systemd 开始初始化 kubeadm init --config=kubeadm.yml 如果报错, 请先清理， 然后在初始化 kubeadm reset -f; rm -rf \u002Fetc\u002Fkubernetes\u002F*; rm -rf \u002Fvar\u002Flib\u002Fkubelet\u002F*; rm -rf \u002Fvar\u002Flib\u002Fetcd 结果如下 上面记录了完成的初始化输出的内容，根据输出可以看出手动初始化安装一个Kubernetes集群所需要的关键步骤。其中有以下关键内容： [kubelet] 生成kubelet的配置文件\"\u002Fvar\u002Flib\u002Fkubelet\u002Fconfig.yaml\" [certificates]生成相关的各种证书 [kubeconfig]生成相关的kubeconfig文件 [bootstraptoken]生成token记录下来，后边使用kubeadm join往集群中添加节点时会用到 按照初始化结果运行以下指令 export KUBECONFIG=\u002Fetc\u002Fkubernetes\u002Fadmin.conf # 创建用户kubeconfig配置目录 mkdir -p $HOME\u002F.kube # 将集群管理员配置文件复制到用户目录 sudo cp -i \u002Fetc\u002Fkubernetes\u002Fadmin.conf $HOME\u002F.kube\u002Fconfig # 修改文件归属为当前用户，授权操作权限 sudo chown $(id -u):$(id -g) $HOME\u002F.kube\u002Fconfig 检测 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 3m54s v1.35.7 因为网络插件没有配置 命令模式 无注释 kubeadm init \\ --apiserver-advertise-address=192.48.75.10 \\ --pod-network-cidr=10.244.0.0\u002F16 \\ --image-repository registry.aliyuncs.com\u002Fgoogle_containers \\ --cri-socket=unix:\u002F\u002F\u002Fvar\u002Frun\u002Fcontainerd\u002Fcontainerd.sock 这一步需要一定时间 注释详解 kubeadm init \\ # 指定主节点API服务监听IP（必须是本机固定IP） --apiserver-advertise-address=192.48.75.10 \\ # 指定集群Pod网段，flannel网络插件固定适配此网段 --pod-network-cidr=10.244.0.0\u002F16 \\ # 指定阿里云镜像仓库，替代国外谷歌仓库，解决镜像拉取失败 --image-repository registry.aliyuncs.com\u002Fgoogle_containers \\ # 指定容器运行时socket路径，告知K8s使用containerd而非docker --cri-socket=unix:\u002F\u002F\u002Fvar\u002Frun\u002Fcontainerd\u002Fcontainerd.sock 3.1 配置管理员集群权限（新手操作集群必备） 原理：初始化后集群证书默认在系统目录，普通用户无法操作，复制到用户目录并授权，实现普通用户使用 kubectl 命令 export KUBECONFIG=\u002Fetc\u002Fkubernetes\u002Fadmin.conf # 创建用户kubeconfig配置目录 mkdir -p $HOME\u002F.kube # 将集群管理员配置文件复制到用户目录 sudo cp -i \u002Fetc\u002Fkubernetes\u002Fadmin.conf $HOME\u002F.kube\u002Fconfig # 修改文件归属为当前用户，授权操作权限 sudo chown $(id -u):$(id -g) $HOME\u002F.kube\u002Fconfig 3.2 生成永久节点加入命令（解决token过期问题） 零基础知识点：默认集群加入令牌24小时过期，此命令生成永久有效的加入命令，方便后续节点加入集群 # 生成永久有效join命令，输出结果复制到两台工作节点执行 kubeadm token create --print-join-command --ttl=0 示例输出（新手直接复制自己机器输出的整条命令）： kubeadm join 192.48.75.10:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxxxx kubeadm join 192.48.75.10:6443 --token wfbics.7byjzuftbp70rvc0 --discovery-token-ca-cert-hash sha256:a71bc4fc467db17043269a08914f1e8ec08a4f81b526ae8d6d0c22749cd34c61 ✅ 操作：两台工作节点执行上述命令，即可加入集群 3.3、测试 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 8m50s v1.26.0 k8s-node1 NotReady \u003Cnone> 53s v1.26.0 k8s-node2 NotReady \u003Cnone> 50s v1.26.0 此时 master 节点状态是NotReady，这个是正常现象，还没装网络插件 4 部署 Flannel 网络插件（仅控制节点执行｜零基础网络原理） 新手必懂：集群初始化后，所有节点都是 NotReady（未就绪） 状态，因为缺少网络插件！Flannel 负责集群所有 Pod 跨节点通信，不部署集群无法使用。 注意:flannel和calico只能二选一 master节点下载yaml配置文件 版本会经常更新，flannel官方存储与github上，如果无法下载需要FQ直接github搜索flannel得到如下地址https:\u002F\u002Fraw.githubusercontent.com\u002Fflannel-io\u002Fflannel\u002Fmaster\u002FDocumentation\u002Fkube-flannel.yml，然后浏览器打开右键另存到本地。 因为版本更新比较快， 可以直接访问 https:\u002F\u002Fgithub.com\u002Fsearch?g=flannel 可以根据这个网址下载文件 下载镜像 用其他docker 主机下载了镜像 # 下载镜像 docker pull rancher\u002Fmirrored-flannelcni-flannel:v0.20.2 docker pull rancher\u002Fmirrored-flannelcni-flannel-cni-plugin:v1.1.2 # 打包镜像 docker save rancher\u002Fmirrored-flannelcni-flannel:v0.20.2 -o flannel-v0.20.2.tar docker save rancher\u002Fmirrored-flannelcni-flannel-cni-plugin:v1.1.2 -o flannel-cni-v1.1.2.tar # k8s‑master 节点导入镜像到 containerd ctr -n=k8s.io image import flannel-v0.20.2.tar ctr -n=k8s.io image import flannel-cni-v1.1.2.tar # 查看 [root@k8s-master ~]# ctr -n=k8s.io image list | grep flannel 修改镜像 apiVersion: v1 kind: Namespace metadata: labels: k8s-app: flannel pod-security.kubernetes.io\u002Fenforce: privileged name: kube-flannel --- apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: flannel name: flannel namespace: kube-flannel --- apiVersion: rbac.authorization.k8s.io\u002Fv1 kind: ClusterRole metadata: labels: k8s-app: flannel name: flannel rules: - apiGroups: - \"\" resources: - pods verbs: - get - apiGroups: - \"\" resources: - nodes verbs: - get - list - watch - apiGroups: - \"\" resources: - nodes\u002Fstatus verbs: - patch --- apiVersion: rbac.authorization.k8s.io\u002Fv1 kind: ClusterRoleBinding metadata: labels: k8s-app: flannel name: flannel roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: flannel subjects: - kind: ServiceAccount name: flannel namespace: kube-flannel --- apiVersion: v1 data: cni-conf.json: | { \"name\": \"cbr0\", \"cniVersion\": \"0.3.1\", \"plugins\": [ { \"type\": \"flannel\", \"delegate\": { \"hairpinMode\": true, \"isDefaultGateway\": true } }, { \"type\": \"portmap\", \"capabilities\": { \"portMappings\": true } } ] } net-conf.json: | { \"Network\": \"10.244.0.0\u002F16\", \"EnableNFTables\": false, \"Backend\": { \"Type\": \"vxlan\" } } kind: ConfigMap metadata: labels: app: flannel k8s-app: flannel tier: node name: kube-flannel-cfg namespace: kube-flannel --- apiVersion: apps\u002Fv1 kind: DaemonSet metadata: labels: app: flannel k8s-app: flannel tier: node name: kube-flannel-ds namespace: kube-flannel spec: selector: matchLabels: app: flannel k8s-app: flannel template: metadata: labels: app: flannel k8s-app: flannel tier: node spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io\u002Fos operator: In values: - linux containers: - args: - --ip-masq - --kube-subnet-mgr command: - \u002Fopt\u002Fbin\u002Fflanneld env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: EVENT_QUEUE_DEPTH value: \"5000\" - name: CONT_WHEN_CACHE_NOT_READY value: \"false\" image: ghcr.io\u002Fflannel-io\u002Fflannel:v0.28.9 name: kube-flannel resources: requests: cpu: 100m memory: 50Mi securityContext: capabilities: add: - NET_ADMIN - NET_RAW privileged: false volumeMounts: - mountPath: \u002Frun\u002Fflannel name: run - mountPath: \u002Fetc\u002Fkube-flannel\u002F name: flannel-cfg - mountPath: \u002Frun\u002Fxtables.lock name: xtables-lock hostNetwork: true initContainers: - args: - -f - \u002Fflannel - \u002Fopt\u002Fcni\u002Fbin\u002Fflannel command: - cp image: docker.io\u002Francher\u002Fmirrored-flannelcni-flannel-cni-plugin:v1.1.2 name: install-cni-plugin volumeMounts: - mountPath: \u002Fopt\u002Fcni\u002Fbin name: cni-plugin - args: - -f - \u002Fetc\u002Fkube-flannel\u002Fcni-conf.json - \u002Fetc\u002Fcni\u002Fnet.d\u002F10-flannel.conflist command: - cp image: docker.io\u002Francher\u002Fmirrored-flannelcni-flannel:v0.20.2 name: install-cni volumeMounts: - mountPath: \u002Fetc\u002Fcni\u002Fnet.d name: cni - mountPath: \u002Fetc\u002Fkube-flannel\u002F name: flannel-cfg priorityClassName: system-node-critical serviceAccountName: flannel tolerations: - effect: NoSchedule operator: Exists volumes: - hostPath: path: \u002Frun\u002Fflannel name: run - hostPath: path: \u002Fopt\u002Fcni\u002Fbin name: cni-plugin - hostPath: path: \u002Fetc\u002Fcni\u002Fnet.d name: cni - configMap: name: kube-flannel-cfg name: flannel-cfg - hostPath: path: \u002Frun\u002Fxtables.lock type: FileOrCreate name: xtables-lock 执行部署命令（零基础直接复制）： # 如果重新修改了配置文件， 需要先删除旧的 daemonset [root@k8s-master ~]# kubectl delete daemonset kube-flannel-ds -n kube-flannel # 应用yaml配置，部署flannel网络插件 [root@k8s-master ~]# kubectl apply -f kube-flannel.yml 5 集群状态验证（零基础结果解读教学） 部署完成后等待 1-3 分钟，等待所有网络 Pod 启动就绪，执行以下验证命令： # 查看所有集群节点状态 [root@k8s-master ~]# kubectl get pods -n kube-flannel -o wide # 正常结果：三个节点全部显示 Ready [root@k8s-master ~]# kubectl get nodes # 查看集群所有Pod运行状态 # 正常结果：所有Pod状态为Running，无报错、无重启 [root@k8s-master ~]# kubectl get pod -A ✅ 集群搭建成功标准：节点全部 Ready、系统 Pod 全部 Running，无异常状态。 6 kubectl命令补全设置 默认的 kubectl 是没有命令补全的， 需要我们自己设置 kubectl 自动补全 source \u003C(kubectl completion bash) echo \"source \u003C(kubectl completion bash)\" >> ~\u002F.bashrc 需要退出当前shell重新登录以使其生效 现在使用， 就可以直接 tab 了 7 k8s 接入Harbor 环境准备 # 创建仓库证书统一存放目录（新标准规范） mkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d 域名解析配置（所有节点） 所有K8s节点配置hosts解析，保证能正常解析Harbor地址： # 替换为你的Harbor服务器IP与域名 echo \"192.48.75.165 harbor.company.local\" >> \u002Fetc\u002Fhosts Harbor HTTPS 带证书仓库（生产环境） 生产环境强制使用HTTPS，导入Harbor CA证书，保证镜像拉取安全可信。 步骤 1：所有 K8s 节点配置 hosts 域名解析 集群每一台机器，master、每个 worker 都执行 #写入hosts echo \"192.48.75.165 harbor.company.local\" >> \u002Fetc\u002Fhosts #验证解析是否生效 ping harbor.company.local 步骤 2：操作系统全局信任 Harbor CA 根证书（所有节点） 让 curl、wget 等系统工具信任 harbor 的 https 证书 mkdir -p \u002Fetc\u002Fpki\u002Fca-trust\u002Fsource\u002Fanchors\u002F #把harbor服务器ca.crt拷贝到本机 scp root@192.48.75.165:\u002Fopt\u002Fharbor\u002Fcert\u002Fca.crt \u002Fetc\u002Fpki\u002Fca-trust\u002Fsource\u002Fanchors\u002F #更新系统证书库 update-ca-trust #验证系统https访问harbor是否正常 curl -I https:\u002F\u002Fharbor.company.local 步骤 3：containerd 镜像仓库证书目录配置（所有节点） containerd 拉镜像，会读取\u002Fetc\u002Fcontainerd\u002Fcerts.d目录下证书，这是 containerd 独立证书体系，不依赖系统 ca‑trust。 目录名必须完全等于 harbor 域名：harbor.company.local #创建根目录 mkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d #创建对应域名的证书目录 mkdir -p \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local #拷贝harbor ca.crt到此目录 scp root@192.48.75.165:\u002Fopt\u002Fharbor\u002Fcert\u002Fca.crt \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local\u002F chmod 644 \u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local\u002Fca.crt 步骤 4：修改 containerd 配置文件 \u002Fetc\u002Fcontainerd\u002Fconfig.toml ⚠️删掉文档里面的 [].auth 明文账号密码块！！不要写 username password！！ 只保留 registry 的 config_path，mirrors、tls 配置。 重点：mirrors、configs 的 key 域名必须是真实域名harbor.company.local，不要写 harbor.k8s.local！ 找到 [plugins.\"io.containerd.grpc.v1.cri\".registry]，修改 config_path： [plugins.\"io.containerd.grpc.v1.cri\".registry] config_path = \"\u002Fetc\u002Fcontainerd\u002Fcerts.d\" 文件末尾追加下面完整片段 #镜像仓库镜像配置，key写真实harbor域名 harbor.company.local [plugins.\"io.containerd.grpc.v1.cri\".registry.mirrors.\"harbor.company.local\"] endpoint = [\"https:\u002F\u002Fharbor.company.local\"] #TLS证书配置，关闭跳过证书校验 [plugins.\"io.containerd.grpc.v1.cri\".registry.configs.\"harbor.company.local\".tls] ca_file = \"\u002Fetc\u002Fcontainerd\u002Fcerts.d\u002Fharbor.company.local\u002Fca.crt\" insecure_skip_verify = false ###########【重要】这里不要加auth块！不要写admin密码！！生产禁止明文！！########### 所有节点重启 containerd 生效 systemctl daemon-reload;systemctl restart containerd systemctl status containerd 校验配置是否加载成功，检查没有报错即可。 测试 containerd 能否拉镜像（节点本地测试） --creds仅临时测试用，不会写入配置文件，测试完就完事 crictl pull --creds admin:Harbor123456 harbor.company.local\u002Fnginx\u002Fnginx:v1.19 成功：代表节点证书、网络全部正常。 失败：排查 hosts、ca.crt 文件路径、config.toml 语法、containerd 状态。 注意：crictl 测试成功 ≠ Pod 可以跑起来。Pod 不会使用--creds参数，Pod 依赖 k8s 的 secret。 步骤 5：K8s 集群创建 ImagePullSecret（只需要在 master 执行，集群资源，worker 不用执行） secret 是 k8s 集群资源，只需要执行一次，生效在当前命名空间 (default) --docker-server 只写域名，不带 https:\u002F\u002F kubectl create secret docker-registry harbor-secret \\ --docker-server=harbor.company.local \\ --docker-username=admin \\ --docker-password=Harbor123456 查看 secret 是否创建成功 kubectl get secrets 输出列表能看到harbor‑secret。 步骤 6【推荐】配置当前命名空间全局默认镜像秘钥 default 命名空间所有 Pod 自动带上拉取秘钥，yaml 不需要每次写imagePullSecrets 仅 master 执行 kubectl patch serviceaccount default -p '{\"imagePullSecrets\": [{\"name\": \"harbor-secret\"}]}' 校验 sa 配置是否写入成功： kubectl get sa default -o yaml 看到输出包含imagePullSecrets: - name: harbor-secret代表配置完成。 ⚠️注意：已经存在的旧 Pod 不会自动继承 sa 配置，旧 Pod 必须删除重建。 # 删除旧的 pod kubectl delete pod harbor-demo-pod 步骤 7：编写测试 Pod yaml harbor-demo-pod.yaml 因为已经配置全局 sa，yaml 中不需要写 imagePullSecrets apiVersion: v1 kind: Pod metadata: name: harbor-demo-pod spec: containers: - name: nginx image: harbor.company.local\u002Fnginx\u002Fnginx:v1.19 ports: - containerPort: 80 执行创建 pod # 构建pod [root@k8s-master ~]# kubectl apply -f harbor-demo-pod.yaml # 查看 [root@k8s-master ~]# kubectl get po NAME READY STATUS RESTARTS AGE harbor-demo-pod 1\u002F1 Running 0 13m 步骤 8：排错流程（出现 ImagePullBackOff 必做） #查看pod完整事件，看真实报错原因 kubectl describe pod harbor-demo-pod crictl 命令 注意：crictl 没有 push 推送镜像命令！推送镜像请用 docker 或者 nerdctl，crictl 只负责 CRI，也就是 K8s 节点拉镜像，不负责上传镜像到 Harbor。 命令 作用 常用示例 crictl images 列出本地所有镜像 crictl images crictl pull 拉取镜像 crictl pull --creds user:pass harbor.company.local\u002Fxxx:tag crictl rmi 删除本地镜像 crictl rmi harbor.company.local\u002Fnginx\u002Fnginx:v1.19 crictl inspecti 查看镜像详细元数据 crictl inspecti harbor.company.local\u002Fnginx\u002Fnginx:v1.19 crictl load 导入本地 tar 镜像包 crictl load -i xxx.tar crictl save 导出镜像到 tar 包 crictl save -o output.tar harbor.company.local\u002Fnginx\u002Fnginx:v1.19 8 新手高频报错解决方案 节点一直 NotReady 90% 原因：Flannel Pod 未启动成功，执行 kubectl get pod -n kube-flannel 查看异常日志 10% 原因：swap 未彻底关闭、内核参数未生效，重新执行环境配置命令 containerd 启动失败 核心原因：toml 配置文件空格、缩进错误（新手最容易出错） 解决方案：直接复制本教程完整配置覆盖，不要手动修改格式 初始化镜像拉取失败 检查机器外网是否通畅 确认初始化命令使用了阿里云镜像仓库参数 Swap 没关闭 主机名填写错误 工作节点加入集群失败 核对三台机器 hosts 解析是否一致 确认防火墙、SELinux、swap 全部关闭 确认所有节点时间同步一致",22241,{"id":6,"kind":7,"title":11,"summary":13,"image":14,"href":16,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":40},"2026 · 云原生与运维","#2563eb","16 \u002F 10",[19],{"targetType":8,"targetId":9,"likedByMe":42,"likeCount":43,"commentCount":43,"contentLikeCount":43,"contentCommentCount":43,"sourceLikeCount":43,"sourceCommentCount":43},false,0,[45,51,58,64,71,80,86,92],{"id":46,"kind":7,"title":47,"summary":48,"image":15,"href":49,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":50},"NEWS_ARTICLE:839","Nginx 1.30.4 编译安装与参数调优","Nginx 是一款轻量级、高性能、高并发的开源Web服务器、反向代理与负载均衡软件，凭借低资源占用、高稳定性的核心优势，成为当下互联网行业主流的服务部署组件，广泛应用于各类网站及业务系统的Web服务、反向代理、负载均衡场景。其基于宽松的类BSD开源协议发布，可免费商用。本文将完整展示 Nginx 1","\u002Fnews\u002F839",[19],{"id":52,"kind":7,"title":53,"summary":54,"image":55,"href":56,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":57},"NEWS_ARTICLE:885","【Azure Redis】中国区创建和连接 Azure Managed Redis 的两个注意事项","Azure Managed Redis 介绍 Azure Managed Redis 是微软新一代全托管 Redis 服务，基于 Redis Enterprise 构建，为现代云应用提供低延迟、高吞吐的数据访问能力。相比传统 Azure Cache for Redis，它采用更高效的多分片架构，并提","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F2127802\u002F202608\u002F2127802-20260831195905463-1387904592.png","\u002Fnews\u002F885",[19],{"id":59,"kind":7,"title":60,"summary":61,"image":15,"href":62,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":63},"NEWS_ARTICLE:891","K8S接入NFS存储","本文详细演示了在Kubernetes集群中接入NFS作为默认持久化存储的完整流程。针对容器数据易失问题，文章介绍了如何部署NFS Provisioner，并配置StorageClass将其设为集群默认（default）。通过此方案，实现了PVC的动态自动供给，开发者无需手动创建PV即可为Pod分配存","\u002Fnews\u002F891",[19],{"id":65,"kind":7,"title":66,"summary":67,"image":68,"href":69,"meta":37,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":70},"NEWS_ARTICLE:911","k8s安装metrics-server，以及相关报错排查","背景：有监控node节点pod的CPU等资源，实现自动扩缩容的需要下，需要安装metrics-server k8s版本：1.30.14（kubadm安装） 对应metrics-server版本：0.8x（本文使用0.8.1） 1、下载部署清单 wget https:\u002F\u002Fgithub.com\u002Fkube","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F1384371\u002F202608\u002F1384371-20260830185204348-546969162.png","\u002Fnews\u002F911",[19],{"id":72,"kind":7,"title":73,"summary":74,"image":75,"href":76,"meta":77,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":78},"NEWS_ARTICLE:927","HelloCrab - 短视频开源爬虫，仅供学习参考","HelloCrab 基于 Avalonia、Playwright、AI与 FFmpeg 的跨平台桌面采集器，支持9大平台，以及 Android、iOS、Browser 远程控制端。 Made By ChatGPT &amp; Vincent with ❤ 平台 是否接入 哔哩哔哩 ✅ 抖音 ✅ 快手","https:\u002F\u002Fwww.cnblogs.com\u002Fhupo376787\u002Fp\u002FScreenshot\u002FWindows.jpg","\u002Fnews\u002F927","2026 · 软件开发",[79],"软件开发",{"id":81,"kind":7,"title":82,"summary":83,"image":15,"href":84,"meta":77,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":85},"NEWS_ARTICLE:929",".NET 异常处理的\"暗门\"：代码里写满 catch，你依然能抓住它——从一个 AI Agent 运行时的源码说起","一个健壮的系统，必然到处都是有意的 catch；异常被消化不等于问题不存在。 观测与韧性，是一个硬币的两面——降级逻辑保证系统不崩，FirstChance 保证你能看见它为什么降级。","\u002Fnews\u002F929",[79],{"id":87,"kind":7,"title":88,"summary":89,"image":15,"href":90,"meta":18,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":91},"NEWS_ARTICLE:928","架构师化繁为简，执行者化简为繁","新手改三天，你改三行——反而是你显得更不重要。因为化繁为简做得越纯熟，产出看起来越小。这篇聊聊两种能力的辩证关系，以及为什么'看不见'的那部分工作，恰恰是最难的部分。","\u002Fnews\u002F928",[7,8],{"id":93,"kind":7,"title":94,"summary":95,"image":96,"href":97,"meta":98,"badge":10,"author":12,"stats":-1,"accent":38,"coverRatio":39,"tags":99},"NEWS_ARTICLE:930","基于 vLLM+Nginx 构建负载均衡推理集群","企业内部私有环境部署大模型推理集群时，很容易遇到流量调度混乱、节点负载失衡、会话上下文丢失、接口缺少鉴权防护等一系列问题，单 vLLM 推理节点难以支撑并发请求。本文基于 Ubuntu 22.04 系统环境，搭建 Nginx + vLLM-Semantic-Router + vLLM-Router","https:\u002F\u002Fimg2024.cnblogs.com\u002Fblog\u002F1379525\u002F202609\u002F1379525-20260910165534385-2022408098.png","\u002Fnews\u002F930","2026 · 人工智能",[100],"人工智能"]