<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>容器化 on Liangweidong's blog</title><link>https://liangweidonggood.github.io/tags/%E5%AE%B9%E5%99%A8%E5%8C%96/</link><description>Recent content in 容器化 on Liangweidong's blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://liangweidonggood.github.io/tags/%E5%AE%B9%E5%99%A8%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>K8s 容器编排：Java 微服务团队的踩坑实录与收益账</title><link>https://liangweidonggood.github.io/p/k8s-rong-qi-bian-pai/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>https://liangweidonggood.github.io/p/k8s-rong-qi-bian-pai/</guid><description>&lt;img src="https://liangweidonggood.github.io/p/k8s-rong-qi-bian-pai/image/cover.jpg" alt="Featured image of post K8s 容器编排：Java 微服务团队的踩坑实录与收益账" /&gt;&lt;h1 id="k8s-容器编排java-微服务团队的踩坑实录与收益账"&gt;K8s 容器编排：Java 微服务团队的踩坑实录与收益账
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Java Web 微服务系列 · 第 3 篇 · K8s 容器编排
阅读时长：约 35 分钟
本文写于 2026 年 6 月&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="引子凌晨-3-点的告警电话"&gt;引子：凌晨 3 点的告警电话
&lt;/h2&gt;&lt;p&gt;2021 年某日深夜，监控大屏突然飘红——某物流公司的订单服务挂了一台机器。值班同学爬起来 SSH 上去，看了一眼：进程没了。&lt;code&gt;systemctl restart order-service&lt;/code&gt; 一把梭，服务起来了。然后第二台挂了，第三台挂了。值班同学对着黑漆漆的屏幕，骂了一句脏话。&lt;/p&gt;
&lt;p&gt;第二天复盘，发现是部署脚本的 bug——新版本包没拷全，旧进程在内存里撑了 2 个小时才崩。&lt;strong&gt;2 个小时里这个服务有 6 个实例在跑，但其中 4 个已经&amp;quot;假死&amp;quot;——能 ping 通但 HTTP 503&lt;/strong&gt;。更要命的是，值班同学是按 IP 一台台 SSH 上去重启的，光是重启就花了一个半小时。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;这日子没法过了。&amp;rdquo;&lt;/p&gt;
&lt;p&gt;半年后，这家公司把所有 Java 微服务全部搬到了 K8s 集群。三年过去，再没人在凌晨 3 点因为&amp;quot;进程没了&amp;quot;被叫起来过。&lt;/p&gt;
&lt;p&gt;但 K8s 也不是银弹。&lt;strong&gt;上 K8s 本身就是一个大坑&lt;/strong&gt;——只是它把你从一个深渊里捞出来，又把你推进了另一个深渊。本文就按&amp;quot;为什么要上 / 解决什么痛点 / 收益是什么 / 有什么坑&amp;quot;四问，把这条路的全貌讲清楚。&lt;/p&gt;
&lt;h2 id="一为什么要上-k8s-集群业务驱动的演进"&gt;一、为什么要上 K8s 集群：业务驱动的演进
&lt;/h2&gt;&lt;h3 id="11-java-微服务部署的-4-大历史形态"&gt;1.1 Java 微服务部署的 4 大历史形态
&lt;/h3&gt;&lt;p&gt;从 2010 年到现在，Java 微服务的部署方式大概经历了 4 个阶段。&lt;strong&gt;每个阶段都不是&amp;quot;上一个错了&amp;quot;，而是&amp;quot;业务规模逼着你升级&amp;quot;&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;阶段&lt;/th&gt;
					&lt;th&gt;部署方式&lt;/th&gt;
					&lt;th&gt;代表工具&lt;/th&gt;
					&lt;th&gt;适用规模&lt;/th&gt;
					&lt;th&gt;典型痛点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;单机直跑&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;物理机 / 虚拟机 + Tomcat / jar&lt;/td&gt;
					&lt;td&gt;scp、shell 脚本&lt;/td&gt;
					&lt;td&gt;1-5 个服务、&amp;lt; 50 QPS&lt;/td&gt;
					&lt;td&gt;部署靠人、环境不一致、扩容靠买机器&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;脚本化&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自动化脚本 + 进程管理&lt;/td&gt;
					&lt;td&gt;Ansible、SaltStack、Supervisor&lt;/td&gt;
					&lt;td&gt;5-20 个服务、&amp;lt; 500 QPS&lt;/td&gt;
					&lt;td&gt;脚本维护成本高、回滚慢、灰度靠脚本拼&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;容器化（无编排）&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Docker + docker-compose&lt;/td&gt;
					&lt;td&gt;Docker、docker-compose&lt;/td&gt;
					&lt;td&gt;20-50 个服务、&amp;lt; 2000 QPS&lt;/td&gt;
					&lt;td&gt;跨主机调度、容器自愈、滚动升级都靠人&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;容器编排&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;K8s / Swarm / Mesos&lt;/td&gt;
					&lt;td&gt;K8s、Docker Swarm、Mesos、Nomad&lt;/td&gt;
					&lt;td&gt;50+ 服务、2000+ QPS&lt;/td&gt;
					&lt;td&gt;集群本身复杂度、运维门槛陡升&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：为什么&amp;quot;容器&amp;quot;不等于&amp;quot;K8s&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Docker 只解决了&amp;quot;打包一致&amp;quot;——开发机、测试机、生产机跑同一个 image。&lt;strong&gt;但 Docker 解决不了&amp;quot;50 个服务怎么调度到 30 台机器&amp;quot;&amp;ldquo;某台机器挂了容器怎么办&amp;quot;&amp;ldquo;滚动升级时如何不停机&amp;rdquo;&lt;/strong&gt;。这些是&amp;quot;容器编排&amp;quot;要解决的问题。K8s 是容器编排的事实标准，&lt;strong&gt;不是因为它最好，而是因为它最早做大、生态最全&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="12-业务量爆炸的拐点"&gt;1.2 业务量爆炸的拐点
&lt;/h3&gt;&lt;p&gt;什么时候&amp;quot;必须上 K8s&amp;rdquo;？&lt;strong&gt;没有标准答案，但有几个硬指标&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务数 &amp;gt; 30&lt;/strong&gt;：人工维护部署脚本开始失控——一个新人改一行配置要培训 1 周&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实例数 &amp;gt; 100&lt;/strong&gt;：单 IP 重启模式失效——光 SSH 串行重启就要 1 小时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QPS &amp;gt; 1000 + 长尾延迟敏感&lt;/strong&gt;：必须做弹性扩缩容——大促前临时扩容 50%，大促后缩回去&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;机房数 &amp;gt; 1&lt;/strong&gt;：跨机房调度、流量切换需要平台化——脚本扛不住&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;上述任一指标突破，都应该认真评估 K8s&lt;/strong&gt;。不要&amp;quot;为了上 K8s 而上 K8s&amp;quot;——K8s 本身的运维成本比裸 Docker 高 5-10 倍。&lt;/p&gt;
&lt;h3 id="13-选型对比k8s-vs-swarm-vs-mesos-vs-nomad"&gt;1.3 选型对比：K8s vs Swarm vs Mesos vs Nomad
&lt;/h3&gt;&lt;p&gt;&amp;ldquo;K8s 是唯一的答案吗？&amp;rdquo;&lt;strong&gt;不是，但事实上是&lt;/strong&gt;。看个对比表：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;K8s&lt;/th&gt;
					&lt;th&gt;Docker Swarm&lt;/th&gt;
					&lt;th&gt;Mesos&lt;/th&gt;
					&lt;th&gt;Nomad&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;生态&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐⭐⭐ CNCF 一哥&lt;/td&gt;
					&lt;td&gt;⭐⭐ Docker 官方但已停摆&lt;/td&gt;
					&lt;td&gt;⭐⭐⭐ 老牌但社区萎缩&lt;/td&gt;
					&lt;td&gt;⭐⭐ HashiCorp 出品，小而美&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;学习曲线&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;陡（概念多）&lt;/td&gt;
					&lt;td&gt;平（Docker 用户秒上手）&lt;/td&gt;
					&lt;td&gt;极陡（论文级）&lt;/td&gt;
					&lt;td&gt;中（HashiCorp 一贯简洁）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;适用规模&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;数千节点、数万 Pod&lt;/td&gt;
					&lt;td&gt;数百节点、几千容器&lt;/td&gt;
					&lt;td&gt;数万节点&lt;/td&gt;
					&lt;td&gt;数千节点&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;自愈能力&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强（多种控制器）&lt;/td&gt;
					&lt;td&gt;弱（基本靠 restart）&lt;/td&gt;
					&lt;td&gt;中（依赖 Marathon）&lt;/td&gt;
					&lt;td&gt;中（基础功能）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;服务网格&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Istio / Linkerd 成熟&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;Consul Connect&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;存储编排&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强（CSI 标准）&lt;/td&gt;
					&lt;td&gt;弱&lt;/td&gt;
					&lt;td&gt;强（Mesos + 各种 framework）&lt;/td&gt;
					&lt;td&gt;中（CSI 支持中）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;运维成本&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;高（要专职团队）&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
					&lt;td&gt;极高&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;招聘难度&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;容易（人才多）&lt;/td&gt;
					&lt;td&gt;容易&lt;/td&gt;
					&lt;td&gt;难&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：为什么 99% 的团队最终选 K8s&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;生态绑死&lt;/strong&gt;：所有云厂商默认托管 K8s（EKS / AKS / GKE / 阿里 ACK），自建也有 kubeadm / kOps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;招聘市场最大&lt;/strong&gt;：K8s 工程师池子 10 倍于 Mesos/Nomad&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习成本虽然高但只付一次&lt;/strong&gt;：学会 K8s 概念后，5 年内不会被淘汰&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二次开发友好&lt;/strong&gt;：CRD + Operator 让任何复杂业务都能抽象&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;选 K8s 不是&amp;quot;技术最优&amp;quot;，是&amp;quot;综合 ROI 最高&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="二解决了什么痛点5-大类问题"&gt;二、解决了什么痛点：5 大类问题
&lt;/h2&gt;&lt;p&gt;K8s 解决的不是&amp;quot;一两个痛点&amp;quot;，而是&lt;strong&gt;Java 微服务规模化后的一整片痛&lt;/strong&gt;。下面按&amp;quot;团队最痛的&amp;quot;到&amp;quot;运营层面的&amp;quot;排序。&lt;/p&gt;
&lt;h3 id="21-部署自动化告别凌晨-3-点的发布"&gt;2.1 部署自动化：告别凌晨 3 点的发布
&lt;/h3&gt;&lt;p&gt;传统部署的核心问题是&amp;quot;&lt;strong&gt;人工介入太多&lt;/strong&gt;&amp;quot;——&lt;code&gt;scp&lt;/code&gt; 包、&lt;code&gt;kill&lt;/code&gt; 进程、&lt;code&gt;start&lt;/code&gt; 进程，串行、慢、易错。K8s 把这一切抽象成一份 YAML：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apps/v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Deployment&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;RollingUpdate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rollingUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxSurge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxUnavailable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;registry.example.com/order-service:v1.2.3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;一次 &lt;code&gt;kubectl apply&lt;/code&gt; 完成的事&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;拉镜像（v1.2.3）&lt;/li&gt;
&lt;li&gt;按 maxSurge/maxUnavailable 策略滚动升级（每次只停 1 个，起来 1 个）&lt;/li&gt;
&lt;li&gt;等 readinessProbe 通过才继续下一个&lt;/li&gt;
&lt;li&gt;任意一步失败自动回滚&lt;/li&gt;
&lt;li&gt;全程无需 SSH 任何机器&lt;/li&gt;
&lt;/ol&gt;

 &lt;/blockquote&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;传统方式&lt;/th&gt;
					&lt;th&gt;K8s 方式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;滚动升级&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;写脚本、串行执行、人工盯日志&lt;/td&gt;
					&lt;td&gt;改 YAML、&lt;code&gt;kubectl apply&lt;/code&gt;、自动滚&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;灰度发布&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;维护两个集群、路由脚本切流量&lt;/td&gt;
					&lt;td&gt;改 replicas 比例、调整 Service selector&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;回滚&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;找回老包、停止服务、重新部署&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl rollout undo&lt;/code&gt;（秒级）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;扩缩容&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;买机器 → 装机 → 部署服务&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kubectl scale&lt;/code&gt; / HPA 自动（分钟级）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="22-自愈能力进程挂了不用爬起来重启"&gt;2.2 自愈能力：进程挂了不用爬起来重启
&lt;/h3&gt;&lt;p&gt;K8s 的核心思想是&amp;quot;&lt;strong&gt;声明式期望状态&lt;/strong&gt;&amp;quot;——你告诉它&amp;quot;我想要 3 个 order-service 实例在跑&amp;quot;，它&lt;strong&gt;永远&lt;/strong&gt;会努力维持这个状态。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pod 挂了&lt;/strong&gt; → kubelet 立刻重启（同节点）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;节点挂了&lt;/strong&gt; → controller-manager 30s 内发现，在其他节点重新拉起&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;健康检查失败&lt;/strong&gt; → readinessProbe 不通过 → 流量切走 → livenessProbe 失败 → 重启&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：K8s 自愈的三个层次&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pod 级别&lt;/strong&gt;：kubelet 监控容器，挂了就在同节点重启&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;节点级别&lt;/strong&gt;：kube-controller-manager 的 NodeController 30s 心跳，丢失后重新调度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集群级别&lt;/strong&gt;：kube-scheduler 在 Pod 不可调度时（如资源不够）找其他节点&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;传统方式下&amp;quot;凌晨 3 点 SSH 上去重启&amp;quot;的事，K8s 在 30 秒内自动完成。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="23-服务发现与负载均衡告别-ip-漂移"&gt;2.3 服务发现与负载均衡：告别 IP 漂移
&lt;/h3&gt;&lt;p&gt;Java 微服务最头疼的事之一：&lt;strong&gt;A 服务调用 B 服务，B 的 IP 变了，调用失败&lt;/strong&gt;。K8s 用 Service + DNS 解决：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;targetPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;部署后，集群 DNS（CoreDNS）会自动注册 &lt;code&gt;order-service.default.svc.cluster.local&lt;/code&gt; → 后端 Pod 的虚拟 IP。&lt;strong&gt;Java 代码用 &lt;code&gt;order-service:80&lt;/code&gt; 调用就行，IP 漂移全自动屏蔽&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;维度&lt;/th&gt;
					&lt;th&gt;传统方式（Eureka / Nacos）&lt;/th&gt;
					&lt;th&gt;K8s 方式&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;注册中心&lt;/td&gt;
					&lt;td&gt;独立部署 Eureka / Nacos 集群&lt;/td&gt;
					&lt;td&gt;内置（Service + kube-proxy）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;客户端依赖&lt;/td&gt;
					&lt;td&gt;Spring Cloud 组件 + SDK&lt;/td&gt;
					&lt;td&gt;无（DNS 解析即可）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;健康检查&lt;/td&gt;
					&lt;td&gt;Spring Boot Actuator 主动上报&lt;/td&gt;
					&lt;td&gt;kubelet 探针（被动）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;跨语言支持&lt;/td&gt;
					&lt;td&gt;Java 友好，其他语言要写 SDK&lt;/td&gt;
					&lt;td&gt;任何语言都行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;配置复杂度&lt;/td&gt;
					&lt;td&gt;中（要维护注册中心集群）&lt;/td&gt;
					&lt;td&gt;低（YAML 写一遍就行）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：K8s DNS 与 Nacos 的取舍&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;简单服务&lt;strong&gt;用 K8s 内置 DNS 足够&lt;/strong&gt;。但有状态服务（配置中心、服务治理、可观测）&lt;strong&gt;Nacos 仍是首选&lt;/strong&gt;——它能管理服务元数据、配置、流量规则，K8s DNS 只能做&amp;quot;名字→IP&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="24-配置与密钥管理告别-properties-走天下"&gt;2.4 配置与密钥管理：告别 .properties 走天下
&lt;/h3&gt;&lt;p&gt;传统 Java 应用的配置问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;改一个数据库地址 → 改 30 台机器的 &lt;code&gt;application.properties&lt;/code&gt; → 重启服务&lt;/li&gt;
&lt;li&gt;密码明文写在配置文件里 → 提交到 Git → 安全事故&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;K8s 用 &lt;strong&gt;ConfigMap + Secret&lt;/strong&gt; 抽象：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ConfigMap&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service-config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;application.properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; server.port=8080
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; spring.datasource.url=jdbc:mysql://mysql:3306/order&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Secret&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;order-service-secret&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Opaque&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stringData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;db-password&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;热更新&lt;/strong&gt;：用 Reloader 之类的 Operator，配置变更自动触发滚动重启。&lt;strong&gt;密钥管理&lt;/strong&gt;：Secret 配合 etcd 加密 + RBAC 权限控制。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：Secret 默认是 base64 编码，不是加密！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;任何能 &lt;code&gt;kubectl get secret&lt;/code&gt; 的人都能解出明文。&lt;strong&gt;生产环境必须&lt;/strong&gt;：① 启用 etcd 加密；② 用外部密钥管理（Vault / 阿里云 KMS）；③ RBAC 收紧到&amp;quot;运维 + 必要开发&amp;quot;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="25-资源隔离与调度告别那个服务又把内存吃光了"&gt;2.5 资源隔离与调度：告别&amp;quot;那个服务又把内存吃光了&amp;quot;
&lt;/h3&gt;&lt;p&gt;传统物理机/虚拟机的痛：&lt;strong&gt;A 服务 OOM 杀掉了同机器的 B 服务&lt;/strong&gt;。K8s 用 cgroup + namespace 做硬隔离：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;500m&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 0.5 核（保证）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;512Mi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 512MB（保证）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;limits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 最多 2 核（超了就节流）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 最多 1GB（超了就 OOM Kill）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;QoS 等级&lt;/th&gt;
					&lt;th&gt;设置条件&lt;/th&gt;
					&lt;th&gt;行为&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Guaranteed&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;requests == limits&lt;/td&gt;
					&lt;td&gt;最高优先级，最后被驱逐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Burstable&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;requests &amp;lt; limits（有 request）&lt;/td&gt;
					&lt;td&gt;中等优先级，资源紧张时被驱逐&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;BestEffort&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;没设 requests/limits&lt;/td&gt;
					&lt;td&gt;最低优先级，资源紧张时&lt;strong&gt;最先被杀&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示：limits 设太低 = 性能不稳&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JVM 堆内存默认会&amp;quot;贪&amp;quot;到 limit 才 GC。&lt;code&gt;memory.limits=512Mi&lt;/code&gt; 但 JVM &lt;code&gt;-Xmx&lt;/code&gt; 没设 → JVM 启动后申请 1GB 内存 → OOM Kill。&lt;strong&gt;Java 容器必须显式设 &lt;code&gt;-XX:MaxRAMPercentage=70.0&lt;/code&gt; 或 &lt;code&gt;-Xmx&lt;/code&gt;&lt;/strong&gt;（详见第四章 4.7）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="三收益是什么可量化的账"&gt;三、收益是什么：可量化的账
&lt;/h2&gt;&lt;p&gt;老板最关心&amp;quot;花了多少钱，赚回多少&amp;quot;。&lt;strong&gt;这一节给能写进年度预算答辩的数字&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="31-资源利用率从-20-到-60"&gt;3.1 资源利用率：从 20% 到 60%
&lt;/h3&gt;&lt;p&gt;传统物理机部署：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;平均 CPU 利用率 &lt;strong&gt;15-25%&lt;/strong&gt;（高峰要预留 3 倍容量）&lt;/li&gt;
&lt;li&gt;平均内存利用率 &lt;strong&gt;40%&lt;/strong&gt;（JVM 堆固定分配）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;K8s 部署：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;平均 CPU 利用率 &lt;strong&gt;50-65%&lt;/strong&gt;（requests/limits + 混部 + HPA）&lt;/li&gt;
&lt;li&gt;平均内存利用率 &lt;strong&gt;55-70%&lt;/strong&gt;（动态堆 + 超卖）&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;实践：10 台物理机 vs 30 台物理机的故事&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;某电商公司搬 K8s 前用 30 台物理机跑 200 个微服务实例（平均 6.7 实例/机）。搬 K8s 后用 10 台物理机（多核高配）+ 充分利用 requests/limits + HPA，&lt;strong&gt;实例数提升到 350 个&lt;/strong&gt;（平均 35 实例/机）。&lt;strong&gt;节省 20 台物理机 × 5 万/年 = 100 万/年&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="32-发布效率从-30-分钟到-3-分钟"&gt;3.2 发布效率：从 30 分钟到 3 分钟
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;步骤&lt;/th&gt;
					&lt;th&gt;传统&lt;/th&gt;
					&lt;th&gt;K8s&lt;/th&gt;
					&lt;th&gt;收益&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;打镜像 + 推仓库&lt;/td&gt;
					&lt;td&gt;5 分钟&lt;/td&gt;
					&lt;td&gt;1 分钟（Maven + Jib/Dockerfile）&lt;/td&gt;
					&lt;td&gt;4 分钟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;传包到 10 台机器&lt;/td&gt;
					&lt;td&gt;10 分钟&lt;/td&gt;
					&lt;td&gt;0（Pod 拉镜像）&lt;/td&gt;
					&lt;td&gt;10 分钟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;重启服务（滚动）&lt;/td&gt;
					&lt;td&gt;10 分钟&lt;/td&gt;
					&lt;td&gt;1 分钟（K8s 自动）&lt;/td&gt;
					&lt;td&gt;9 分钟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;验证 + 监控&lt;/td&gt;
					&lt;td&gt;5 分钟&lt;/td&gt;
					&lt;td&gt;1 分钟&lt;/td&gt;
					&lt;td&gt;4 分钟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;合计&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;30 分钟&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;3 分钟&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;节省 27 分钟&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;按每天发布 10 次算 = 节省 4.5 小时/天&lt;/strong&gt;。开发体验直接拉满。&lt;/p&gt;
&lt;h3 id="33-故障恢复时间mttr-从小时级到秒级"&gt;3.3 故障恢复时间：MTTR 从小时级到秒级
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;故障场景&lt;/th&gt;
					&lt;th&gt;传统 MTTR&lt;/th&gt;
					&lt;th&gt;K8s MTTR&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;进程崩溃&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5-30 分钟（人工发现 + 重启）&lt;/td&gt;
					&lt;td&gt;&amp;lt; 30 秒（自动重启）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;节点宕机&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;10-60 分钟（人工迁移）&lt;/td&gt;
					&lt;td&gt;&amp;lt; 2 分钟（自动迁移）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;机房故障&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;30-120 分钟（脚本切流量）&lt;/td&gt;
					&lt;td&gt;&amp;lt; 5 分钟（DNS/Ingress 切）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;配置错误&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;5-15 分钟（人工改文件 + 重启）&lt;/td&gt;
					&lt;td&gt;&amp;lt; 1 分钟（ConfigMap + Reloader）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;版本回滚&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;10-30 分钟（找回老包 + 部署）&lt;/td&gt;
					&lt;td&gt;&amp;lt; 10 秒（&lt;code&gt;kubectl rollout undo&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：MTTR &amp;lt; 30s 不是无脑的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;K8s 自动重启 / 调度是默认的，但&lt;strong&gt;自动迁移不等于自动恢复&lt;/strong&gt;。&lt;strong&gt;&amp;ldquo;Pod 在新节点起来了&amp;rdquo; ≠ &amp;ldquo;流量切过来了&amp;rdquo;&lt;/strong&gt;——Service selector 要对、readinessProbe 要过、DNS 缓存要刷新。生产环境要配 PodDisruptionBudget + 反亲和 + 健康检查三件套，&lt;strong&gt;K8s 的&amp;quot;自愈&amp;quot;才能真正救你&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="34-团队协作从运维是瓶颈到开发自服务"&gt;3.4 团队协作：从&amp;quot;运维是瓶颈&amp;quot;到&amp;quot;开发自服务&amp;quot;
&lt;/h3&gt;&lt;p&gt;传统流程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;开发提工单 → 运维评审（3 天）→ 运维操作（2 小时）→ 通知开发
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;K8s 流程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;开发写 YAML → kubectl apply（5 分钟）→ 跑起来
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;开发自服务&lt;/strong&gt;带来的收益无法直接量化，但&lt;strong&gt;让运维从&amp;quot;操作工&amp;quot;变成&amp;quot;平台工程师&amp;quot;&lt;/strong&gt;，团队效率指数级提升。&lt;/p&gt;
&lt;h3 id="35-业务连续性机房级故障-rto--30s"&gt;3.5 业务连续性：机房级故障 RTO &amp;lt; 30s
&lt;/h3&gt;&lt;p&gt;承接系列第 1 篇「异地多活」的话题：&lt;strong&gt;K8s 是异地多活的基础设施底座&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多集群联邦（Karmada / Kubefed）→ 跨机房调度&lt;/li&gt;
&lt;li&gt;Ingress + Global DNS → 跨机房流量切&lt;/li&gt;
&lt;li&gt;ArgoCD / GitOps → 配置漂移检测与自动修复&lt;/li&gt;
&lt;li&gt;Velero → 集群级备份与恢复&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;原理：K8s 是&amp;quot;数据中心即一台机器&amp;quot;的抽象&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;上一篇文章讲异地多活是&amp;quot;把系统分散到多机房&amp;quot;。&lt;strong&gt;K8s 把这件事的成本降到 1/10&lt;/strong&gt;——你不再需要写机房切换脚本，&lt;strong&gt;集群联邦 + DNS 切流 + 健康检查&lt;/strong&gt;就能在 30 秒内完成 RTO &amp;lt; 30s 的机房级故障切换。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="四有什么坑真实踩雷清单"&gt;四、有什么坑：真实踩雷清单
&lt;/h2&gt;&lt;p&gt;这一节是全文&lt;strong&gt;最长的部分&lt;/strong&gt;——因为&amp;quot;坑&amp;quot;是 K8s 学习曲线最陡的部分。&lt;strong&gt;不讲坑，上 K8s = 找死&lt;/strong&gt;。下面 8 节按&amp;quot;踩坑顺序&amp;quot;展开。&lt;/p&gt;
&lt;h3 id="41-二进制部署的复杂度6-大子系统"&gt;4.1 二进制部署的复杂度：6 大子系统
&lt;/h3&gt;&lt;p&gt;K8s 集群不是&amp;quot;装一个软件&amp;quot;——&lt;strong&gt;它有 6 大核心组件要装、要配、要互相通信&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;组件&lt;/th&gt;
					&lt;th&gt;角色&lt;/th&gt;
					&lt;th&gt;装在哪&lt;/th&gt;
					&lt;th&gt;启动参数数量&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;etcd&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;分布式 KV 存储（集群大脑）&lt;/td&gt;
					&lt;td&gt;3 个 master&lt;/td&gt;
					&lt;td&gt;3-5 个&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;kube-apiserver&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;API 网关（唯一对外入口）&lt;/td&gt;
					&lt;td&gt;3 个 master&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;28+ 个&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;kube-controller-manager&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;控制器集合（保 reconcile 循环）&lt;/td&gt;
					&lt;td&gt;3 个 master&lt;/td&gt;
					&lt;td&gt;18+ 个&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;kube-scheduler&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;调度器（决定 Pod 放哪）&lt;/td&gt;
					&lt;td&gt;3 个 master&lt;/td&gt;
					&lt;td&gt;8+ 个&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;kubelet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;节点 agent（管容器）&lt;/td&gt;
					&lt;td&gt;所有节点&lt;/td&gt;
					&lt;td&gt;30+ 个&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;kube-proxy&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;网络代理（管 Service）&lt;/td&gt;
					&lt;td&gt;所有节点&lt;/td&gt;
					&lt;td&gt;15+ 个&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;装完这 6 大件只是开始&lt;/strong&gt;——还要装 CNI 网络插件（Calico/Flannel）、CoreDNS、Ingress Controller、Metrics Server、Helm、Dashboard……&lt;strong&gt;一套完整生产集群有 20+ 组件&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;误区警示：kubeadm 不是&amp;quot;一键安装&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多人以为 &lt;code&gt;kubeadm init&lt;/code&gt; 就是装好 K8s 了。&lt;strong&gt;真相是&lt;/strong&gt;：kubeadm 只装 4 大件（apiserver / controller-manager / scheduler / kubelet），etcd 还得自己装，CNI 还得自己装，Ingress 还得自己装，&lt;strong&gt;所有生产级配置都得自己加&lt;/strong&gt;。kubeadm 是&amp;quot;半成品&amp;quot;——它给你&amp;quot;会跑&amp;quot;的环境，不给你&amp;quot;能生产&amp;quot;的环境。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="42-节点规划的血泪"&gt;4.2 节点规划的血泪
&lt;/h3&gt;&lt;p&gt;K8s 集群&amp;quot;装在哪&amp;quot;是个大问题。生产集群一般分 3 种：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;节点组成&lt;/th&gt;
					&lt;th&gt;适用规模&lt;/th&gt;
					&lt;th&gt;复杂度&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;all-in-one&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;1 master + N worker（小集群）&lt;/td&gt;
					&lt;td&gt;&amp;lt; 50 Pod&lt;/td&gt;
					&lt;td&gt;低&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;3 master + N worker&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;3 master（HA）+ N worker&lt;/td&gt;
					&lt;td&gt;50-500 Pod&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;多 master 多机房&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;9+ master 跨机房&lt;/td&gt;
					&lt;td&gt;500+ Pod&lt;/td&gt;
					&lt;td&gt;极高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;坑：异构硬件混部是大忌&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;见过某公司用 5 台 IBM 老服务器（E5-2660 v2，20 核，64GB）+ 5 台消费级 i7/i9（64GB）+ 1 台 Xeon Gold 80 核 64GB。混部后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;资源利用率算不清&lt;/strong&gt;：i9 内存 64G 是 2 根 32G，老服务器是 8 根 8G，节点间 OOM 行为不一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调度不公平&lt;/strong&gt;：80 核机器被大 Pod 吃掉，20 核机器闲着&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;故障域混乱&lt;/strong&gt;：i7/i9 单点故障率高于服务器级 CPU&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;生产集群&lt;/strong&gt;应该&lt;strong&gt;同构硬件&lt;/strong&gt;（同型号、同 CPU 架构、同内存配置），最多分 2 档（master vs worker）。&lt;strong&gt;别想着&amp;quot;反正都是 x86，能跑就行&amp;quot;&lt;/strong&gt;——K8s scheduler 会按资源调度，异构会让它的判断出 bug。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;端口范围&lt;/strong&gt;也是坑：默认 K8s Service NodePort 范围是 30000-32767，&lt;strong&gt;很多公司的安全策略会拦这个段&lt;/strong&gt;。要么改范围（&lt;code&gt;--service-node-port-range=8000-9000&lt;/code&gt;），要么提前和安全团队对齐。&lt;/p&gt;
&lt;h3 id="43-系统优化的-20-个坑"&gt;4.3 系统优化的 20 个坑
&lt;/h3&gt;&lt;p&gt;K8s 对底层 Linux 有 20+ 项硬性要求。&lt;strong&gt;每一项不满足都可能让集群&amp;quot;跑不起来&amp;quot;或&amp;quot;跑着跑着崩&amp;quot;&lt;/strong&gt;：&lt;/p&gt;
&lt;h4 id="431-swap-必须关"&gt;4.3.1 swap 必须关
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;swapoff -a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -ri &lt;span class="s1"&gt;&amp;#39;s/.*swap.*/#&amp;amp;/&amp;#39;&lt;/span&gt; /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;不关会怎样&lt;/strong&gt;：kubelet 默认要求关闭 swap（&lt;code&gt;--fail-swap-on=true&lt;/code&gt;），开了 swap 容器会性能骤降（swap 拖慢 GC），且 kubelet 启动失败。&lt;/p&gt;
&lt;h4 id="432-防火墙必须关"&gt;4.3.2 防火墙必须关
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop ufw
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable ufw
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;不关会怎样&lt;/strong&gt;：iptables 规则混乱，Pod 之间通信失败。&lt;/p&gt;
&lt;h4 id="433-systemd-resolved-必须删"&gt;4.3.3 systemd-resolved 必须删
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl stop systemd-resolved
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl disable systemd-resolved
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -rf /etc/resolv.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo touch /etc/resolv.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：systemd-resolved 是 Ubuntu 上 K8s 的大坑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ubuntu 22.04 默认启用 systemd-resolved，它会&lt;strong&gt;拦截 53 端口&lt;/strong&gt;。CoreDNS 装上后&lt;strong&gt;起不来&lt;/strong&gt;（端口冲突），表现为 coredns Pod 一直 CrashLoopBackOff，但 &lt;code&gt;kubectl logs&lt;/code&gt; 看不到明显错误——因为 coredns 进程根本启动失败。&lt;strong&gt;99% 的&amp;quot;CoreDNS 装不上&amp;quot;都是这个原因&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="434-ulimit-必须调大"&gt;4.3.4 ulimit 必须调大
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt;&amp;gt; /etc/security/limits.conf &amp;lt;&amp;lt; &lt;span class="s2"&gt;&amp;#34;EOF&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* soft nofile &lt;span class="m"&gt;655360&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* hard nofile &lt;span class="m"&gt;131072&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* soft nproc &lt;span class="m"&gt;655350&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* hard nproc &lt;span class="m"&gt;655350&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;不调会怎样&lt;/strong&gt;：高并发下 Java 进程的&amp;quot;too many open files&amp;quot;错误。&lt;/p&gt;
&lt;h4 id="435-ipvs-模块必须加载"&gt;4.3.5 ipvs 模块必须加载
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt;&amp;gt; /etc/modules-load.d/ipvs.conf &amp;lt;&amp;lt; &lt;span class="s2"&gt;&amp;#34;EOF&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip_vs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip_vs_rr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip_vs_wrr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ip_vs_sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nf_conntrack
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;不加载会怎样&lt;/strong&gt;：kube-proxy 退化为 iptables 模式，&lt;strong&gt;1000 个 Service 就会让 iptables 规则爆炸&lt;/strong&gt;（性能 O(n²)）。&lt;/p&gt;
&lt;h4 id="436-内核参数-20-项"&gt;4.3.6 内核参数 20+ 项
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/k8s.conf &amp;lt;&amp;lt; &lt;span class="s2"&gt;&amp;#34;EOF&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.ip_forward &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.bridge.bridge-nf-call-iptables &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.core.somaxconn &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.tcp_max_syn_backlog &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;16384&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vm.overcommit_memory&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fs.file-max&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;52706963&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... 还有 15+ 项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl --system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;这些参数&lt;strong&gt;少一个都可能在高并发下出怪事&lt;/strong&gt;——比如&amp;quot;Syn_sent 状态堆积&amp;quot;、&amp;ldquo;nf_conntrack table full&amp;rdquo;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;生产建议&lt;/strong&gt;：&lt;strong&gt;用 ansible 一键配置 20+ 项 sysctl + 加载 9 个内核模块&lt;/strong&gt;，不要手敲。我在这上面栽过 3 次——每次都是少一个参数导致&amp;quot;线上跑得好好的，新机器扩上去就抖&amp;quot;。&lt;/p&gt;
&lt;h3 id="44-证书管理的麻烦"&gt;4.4 证书管理的麻烦
&lt;/h3&gt;&lt;p&gt;K8s 集群里&lt;strong&gt;有 3 套独立的 CA（证书颁发机构）&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;CA 用途&lt;/th&gt;
					&lt;th&gt;证书&lt;/th&gt;
					&lt;th&gt;数量&lt;/th&gt;
					&lt;th&gt;过期&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;etcd-ca&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;etcd 集群内部通信&lt;/td&gt;
					&lt;td&gt;1 CA + 3 server cert&lt;/td&gt;
					&lt;td&gt;默认 1 年&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;kubernetes-ca&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;apiserver / kubelet / controller-manager / scheduler&lt;/td&gt;
					&lt;td&gt;1 CA + 10+ cert&lt;/td&gt;
					&lt;td&gt;默认 1 年&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;front-proxy-ca&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;apiserver 聚合层（metrics-server 等用）&lt;/td&gt;
					&lt;td&gt;1 CA + 1 cert&lt;/td&gt;
					&lt;td&gt;默认 1 年&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;生成工具&lt;/strong&gt;：cfssl 三件套（&lt;code&gt;cfssl&lt;/code&gt; + &lt;code&gt;cfssljson&lt;/code&gt; + &lt;code&gt;cfssl-certinfo&lt;/code&gt;）。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;坑：证书 hostname 漏一个 = 集群起不来&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;生成 apiserver 证书时，&lt;strong&gt;hostname 列表必须包含&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有 master 的 hostname（master1, master2, master3）&lt;/li&gt;
&lt;li&gt;所有 master 的 IP（10.0.0.x 格式）&lt;/li&gt;
&lt;li&gt;VIP（虚拟 IP，对外服务的）&lt;/li&gt;
&lt;li&gt;集群内部地址（kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local）&lt;/li&gt;
&lt;li&gt;127.0.0.1、localhost&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;漏任何一个，etcd 报 &amp;ldquo;x509: certificate is valid for &amp;hellip;, not &amp;hellip;&amp;rdquo;&lt;/strong&gt;，表现是 apiserver 反复重启但 kubectl 连不上。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;证书自动续期&lt;/strong&gt;（1 年期限）：生产集群必须用 &lt;a class="link" href="https://cert-manager.io/" target="_blank" rel="noopener"
 &gt;cert-manager&lt;/a&gt; 之类的工具自动化，&lt;strong&gt;手动续期等于给自己挖坑&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLS Bootstrapping&lt;/strong&gt;：新 worker 节点加入集群时，&lt;strong&gt;自动签发 kubelet 客户端证书&lt;/strong&gt;（避免把 CA 私钥分发到所有节点）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# bootstrap.secret.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;stringData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;token-id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;token-id&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;token-secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;token-secret&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# ...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;坑：token-id 和 token-secret 暴露 = 任意节点能加入集群&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个 token 实际是&amp;quot;加入集群的入场券&amp;quot;。&lt;strong&gt;生产环境必须&lt;/strong&gt;：① 缩短 token 有效期（默认 24h）；② 审计 token 使用记录；③ 上线后立即吊销。&lt;strong&gt;不要把 token 提交到 Git 仓库&lt;/strong&gt;（记忆库里有真实事故：某 bootstrap token 在私人笔记里登记，已泄露到 git 历史——前车之鉴）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="45-组件配置的-28-个参数"&gt;4.5 组件配置的 28+ 个参数
&lt;/h3&gt;&lt;p&gt;光 &lt;code&gt;kube-apiserver&lt;/code&gt; 一个组件，启动参数就有 28+ 个：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类别&lt;/th&gt;
					&lt;th&gt;参数示例&lt;/th&gt;
					&lt;th&gt;作用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;网络&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--bind-address&lt;/code&gt;、&lt;code&gt;--secure-port&lt;/code&gt;、&lt;code&gt;--advertise-address&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;监听地址&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;etcd&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--etcd-servers&lt;/code&gt;、&lt;code&gt;--etcd-cafile&lt;/code&gt;、&lt;code&gt;--etcd-certfile&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;后端存储&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;认证&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--client-ca-file&lt;/code&gt;、&lt;code&gt;--tls-cert-file&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;TLS 双向认证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;授权&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--authorization-mode=Node,RBAC&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;RBAC 权限控制&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;admission&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--enable-admission-plugins=...&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;准入控制（12+ 种）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;聚合&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;--requestheader-*&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;聚合层（apiserver 内部 API 转发）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;3 个 master 几乎一样的配置&lt;/strong&gt;，只有 &lt;code&gt;--advertise-address&lt;/code&gt; 不同。&lt;strong&gt;手动复制 = 易漏&lt;/strong&gt;：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：3 master 配置文件必须用 sed 自动化生成&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;见过有人手抄 3 份，结果 master2 漏了 &lt;code&gt;--feature-gates=RemoveSelfLink=false&lt;/code&gt;，导致 1.28 之后&lt;strong&gt;整个集群升级不上去&lt;/strong&gt;（RemoveSelfLink 已经在 1.16 弃用、1.18 删除）。&lt;strong&gt;正确做法&lt;/strong&gt;：用脚本生成，参数化只有 IP 不同的部分。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;controller-manager / scheduler / kubelet / kube-proxy&lt;/strong&gt; 也有大量参数。&lt;strong&gt;生产集群必须有 1 份&amp;quot;配置审计&amp;quot;清单&lt;/strong&gt;——记录每个参数的原因、默认值、生产值。&lt;strong&gt;别&amp;quot;反正跑起来了&amp;quot;&lt;/strong&gt;——下次升级、扩容、排查时你会感谢现在的自己。&lt;/p&gt;
&lt;h3 id="46-跑起来之后的坑"&gt;4.6 跑起来之后的坑
&lt;/h3&gt;&lt;p&gt;集群装好、组件跑起来、Pod 能起——&lt;strong&gt;但生产环境会冒出新的问题&lt;/strong&gt;：&lt;/p&gt;
&lt;h4 id="461-kubelet-启动失败"&gt;4.6.1 kubelet 启动失败
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;failed to run Kubelet: validate service connection: validate CRI v1 runtime API
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：服务器重启后服务启动顺序乱了——kubelet 比 containerd 启动早，连不上 CRI socket。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：加 systemd After 依赖：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;containerd.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或 cri-dockerd.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="462-代理后访问不到-ingress"&gt;4.6.2 代理后访问不到 Ingress
&lt;/h4&gt;&lt;p&gt;开发同学用 Charles / Fiddler 抓包时，发现 &lt;code&gt;https://&amp;lt;your-domain&amp;gt;&lt;/code&gt; 进不来——Ingress 域名被代理拦截。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：代理软件里 bypass 集群内网域名（如 &lt;code&gt;*.cluster.local&lt;/code&gt;、&lt;code&gt;10.0.0.0/8&lt;/code&gt;）。&lt;/p&gt;
&lt;h4 id="463-hostnetwork--hostaliases-解决内网域名"&gt;4.6.3 hostNetwork + hostAliases 解决内网域名
&lt;/h4&gt;&lt;p&gt;有些服务要访问&lt;strong&gt;内网老系统的固定 IP&lt;/strong&gt;（不是 DNS），Pod 默认隔离网络访问不到。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostNetwork&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostAliases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;internal-ip&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostnames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;legacy-service.internal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;坑：hostNetwork = 失去 Pod 网络隔离&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;开了 hostNetwork，Pod 直接用宿主机网络，&lt;strong&gt;Service / DNS / 端口分配全失效&lt;/strong&gt;。&lt;strong&gt;能不用就不用&lt;/strong&gt;——只在调试老系统迁移时用，&lt;strong&gt;生产环境应该用 Service + Endpoint 解决&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="464-metrics-server-起不来--hpa-失效"&gt;4.6.4 metrics-server 起不来 = HPA 失效
&lt;/h4&gt;&lt;p&gt;HPA（Horizontal Pod Autoscaler）依赖 metrics-server 提供 Pod 资源数据。&lt;strong&gt;metrics-server 装好但&lt;/strong&gt;&lt;code&gt;kubectl top node&lt;/code&gt; &lt;strong&gt;报 &amp;ldquo;Metrics API not available&amp;rdquo;&lt;/strong&gt;——99% 是证书问题：metrics-server 的 &lt;code&gt;--kubelet-certificate-authority&lt;/code&gt; 没指对。&lt;/p&gt;
&lt;h3 id="47-java-应用特定的坑"&gt;4.7 Java 应用特定的坑
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Java 跑在 K8s 里有几个&amp;quot;老问题&amp;quot;必须重新理解&lt;/strong&gt;——不是 K8s 的锅，是 Java 自己的坑：&lt;/p&gt;
&lt;h4 id="471-时区问题"&gt;4.7.1 时区问题
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Pod 默认 UTC 时区&lt;/strong&gt;。&lt;code&gt;new Date()&lt;/code&gt; 拿到的时间比东八区少 8 小时——日志时间、数据库时间、订单时间全错位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决（三选一）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 方案 1：环境变量&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TZ&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Asia/Shanghai&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 方案 2：挂载时区文件&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumeMounts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tz-config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mountPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/etc/localtime&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;tz-config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hostPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/usr/share/zoneinfo/Asia/Shanghai&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 方案 3：JVM 参数（兼容老应用）&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Duser.timezone=Asia/Shanghai&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="472-jvm-内存感知"&gt;4.7.2 JVM 内存感知
&lt;/h4&gt;&lt;p&gt;JVM 早期版本&lt;strong&gt;不识别容器 cgroup 内存限制&lt;/strong&gt;——&lt;code&gt;Runtime.getRuntime().maxMemory()&lt;/code&gt; 返回宿主机内存，JVM 启动时按 1/4 算堆，结果&lt;strong&gt;容器 OOM Kill&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决&lt;/strong&gt;：JDK 8u191+ 加上 JDK 10+ 已支持 cgroup v1；JDK 11+ 支持 cgroup v2。&lt;strong&gt;但仍需显式声明&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 推荐：用百分比，让 JVM 自己感知容器内存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-XX:MaxRAMPercentage=70.0 -XX:InitialRAMPercentage=50.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 不推荐：写死堆大小（容器内存改了 JMX 还按老值）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Xmx1g&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;code&gt;MaxRAMPercentage&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;自动适配容器内存&lt;/td&gt;
					&lt;td&gt;调优时不可预测峰值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;&lt;code&gt;-Xmx&lt;/code&gt; 写死&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;行为可预测&lt;/td&gt;
					&lt;td&gt;换机器要重算&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;OpenJ9 &lt;code&gt;memoryLimit&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;准生产级，&lt;strong&gt;OpenJ9 内部感知 cgroup&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;团队要学 OpenJ9&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🎯 &lt;strong&gt;避坑点：JVM 调优必须和 Pod limits 配合&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;memory.limits=1Gi&lt;/code&gt; + &lt;code&gt;JAVA_OPTS=-Xmx2g&lt;/code&gt; → &lt;strong&gt;JVM 启动时被 K8s OOM Kill&lt;/strong&gt;。&lt;code&gt;memory.limits=1Gi&lt;/code&gt; + &lt;code&gt;JAVA_OPTS=-XX:MaxRAMPercentage=70.0&lt;/code&gt; → JVM 自动算 700MB 堆，&lt;strong&gt;正合适&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="473-探针配置"&gt;4.7.3 探针配置
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;readinessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/actuator/health/readiness&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;180&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 给 Spring Boot 启动时间&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 容忍 90s 启动期&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;livenessProbe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/actuator/health/liveness&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;initialDelaySeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;180&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;periodSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failureThreshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 死 60s 才杀&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;探针&lt;/th&gt;
					&lt;th&gt;失败后果&lt;/th&gt;
					&lt;th&gt;失败阈值&lt;/th&gt;
					&lt;th&gt;配多少合适&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;readinessProbe&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;流量切走（不杀进程）&lt;/td&gt;
					&lt;td&gt;9 × 10s = 90s&lt;/td&gt;
					&lt;td&gt;给应用启动时间&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;livenessProbe&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;重启 Pod&lt;/td&gt;
					&lt;td&gt;6 × 10s = 60s&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;比 readinessProbe 更严格&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;坑：livenessProbe 太严 = 雪崩&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;配 &lt;code&gt;livenessProbe.failureThreshold=1&lt;/code&gt; → 应用 GC 抖一下就重启。&lt;strong&gt;正确做法&lt;/strong&gt;：livenessProbe 阈值 ≥ 2 次失败（至少 20s），&lt;strong&gt;给 GC / 业务高峰一点缓冲&lt;/strong&gt;。见过某公司 livenessProbe 阈值 1，结果大促时 Java Full GC 1 秒卡顿 → livenessProbe 失败 → Pod 重启 → Full GC 又卡 → &lt;strong&gt;雪崩式重启&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="48-三种工作负载选错--数据丢失"&gt;4.8 三种工作负载选错 = 数据丢失
&lt;/h3&gt;&lt;p&gt;K8s 有 3 种核心工作负载控制器，&lt;strong&gt;选错 = 业务崩&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;控制器&lt;/th&gt;
					&lt;th&gt;适用场景&lt;/th&gt;
					&lt;th&gt;关键特性&lt;/th&gt;
					&lt;th&gt;典型应用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;无状态服务&lt;/td&gt;
					&lt;td&gt;副本数随机命名、Pod IP 不固定、可任意扩缩&lt;/td&gt;
					&lt;td&gt;Web 服务、API 服务、网关&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;StatefulSet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;有状态服务&lt;/td&gt;
					&lt;td&gt;副本名固定（pod-0/pod-1/&amp;hellip;）、稳定的持久卷和 DNS&lt;/td&gt;
					&lt;td&gt;数据库、消息队列、ZooKeeper&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;DaemonSet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;节点级守护&lt;/td&gt;
					&lt;td&gt;每个节点跑 1 个 Pod，新节点自动拉起&lt;/td&gt;
					&lt;td&gt;日志收集、监控 agent、存储插件&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;选错结果&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;MySQL 用 Deployment&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;三个 Pod 各自写不同 PVC → 数据 3 份不一致 → 业务崩&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Redis 哨兵用 Deployment&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Pod 名字带随机后缀 → Sentinel 配置里写的 &lt;code&gt;redis-0&lt;/code&gt; 找不到 → 集群不可用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Fluentd 日志收集用 Deployment&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;副本数少于节点数 → 部分节点日志丢失&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Fluentd 日志收集用 StatefulSet&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;副本数固定，新节点加入后不自动拉起 → &lt;strong&gt;新节点没日志&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;🛑 &lt;strong&gt;避坑点：状态用 Deployment = 数据全丢&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;某团队图省事，MySQL 主从用 Deployment 部署。某天 K8s 升级，Deployment 滚动升级 → 旧 Pod 被 kill → &lt;strong&gt;从库没来得及同步&lt;/strong&gt; → 数据丢失。&lt;strong&gt;正确做法&lt;/strong&gt;：数据库&lt;strong&gt;永远&lt;/strong&gt;用 StatefulSet + 稳定的 PVC + PodDisruptionBudget 严格控制。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="五给想上-k8s-的-java-团队忠告"&gt;五、给想上 K8s 的 Java 团队忠告
&lt;/h2&gt;&lt;p&gt;5 条&lt;strong&gt;经过血泪教训&lt;/strong&gt;的务实建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要为了上 K8s 而上 K8s&lt;/strong&gt;——服务数 &amp;lt; 30、QPS &amp;lt; 1000 的团队，docker-compose + 1 个老运维就够了，&lt;strong&gt;别给团队加复杂度&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从托管 K8s 开始&lt;/strong&gt;（EKS/AKS/ACK/GKE），&lt;strong&gt;别自建&lt;/strong&gt;——自建 K8s 需要 1 个全职 SRE 团队维护，省下的人工费比托管费多。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Java 应用先做容器化适配&lt;/strong&gt;再上 K8s——时区、JVM 内存、启动时间、配置外置、探针，&lt;strong&gt;每一项都要测&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灰度上 K8s&lt;/strong&gt;——&lt;strong&gt;新业务先上、存量业务后上&lt;/strong&gt;。一个 200 服务的团队，半年内推 10% 业务到 K8s 已经很快了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;必须配专职或半专职 SRE&lt;/strong&gt;——K8s 学习曲线 6-12 个月，&lt;strong&gt;让一个开发兼运维的团队&lt;/strong&gt;会让所有人都痛苦。&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;最后一条建议：把 K8s 当作&amp;quot;工具&amp;quot;而不是&amp;quot;银弹&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;K8s 解决的是&amp;quot;规模化后的部署和运维效率&amp;quot;问题，&lt;strong&gt;它不解决业务本身的问题&lt;/strong&gt;。业务架构差、代码质量差、监控缺失，&lt;strong&gt;上 K8s 不会让这些问题消失，只会让它们更复杂&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="六下一篇预告"&gt;六、下一篇预告
&lt;/h2&gt;&lt;p&gt;系列第 4 篇（计划）会讲 &lt;strong&gt;Spring Cloud Gateway 在 K8s 上的部署与流量治理&lt;/strong&gt;——Ingress 怎么配置、Service Mesh 要不要上、灰度发布怎么做。敬请期待。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;附录：本文资源&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/docs/home/" target="_blank" rel="noopener"
 &gt;Kubernetes 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/kubernetes" target="_blank" rel="noopener"
 &gt;K8s GitHub 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cert-manager.io/" target="_blank" rel="noopener"
 &gt;cert-manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/stakater/Reloader" target="_blank" rel="noopener"
 &gt;Reloader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.redhat.com/articles/jdk-mission-control-and-jvm-container-awareness" target="_blank" rel="noopener"
 &gt;JVM Container Awareness（OpenJDK 文档）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;📌 &lt;strong&gt;延伸阅读&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系列第 1 篇：&lt;a class="link" href="https://liangweidonggood.github.io/p/yi-di-duo-huo/" &gt;异地多活：Java Web 微服务的高可用终极形态&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;关联：系统架构 / K8s 分类下还有 5 篇前置文章（containerd / master 组件 / 高可用 / 单机环境 / 集群插件），建议按顺序读。&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>