這是互聯(lián)網(wǎng)大廠 / 金融 / 云原生生產(chǎn)環(huán)境通用的 Java + K8s 落地強(qiáng)制規(guī)范,覆蓋鏡像、資源、穩(wěn)定性、監(jiān)控、安全、發(fā)布、運(yùn)維全維度,直接可作為上線驗(yàn)收清單。
一、鏡像與容器基礎(chǔ)(3 條)
1. 使用輕量化 JRE 基礎(chǔ)鏡像
禁止用openjdk:latest/ 完整 JDK 鏡像,必須用:
eclipse-temurin:17-jre-alpine(推薦)
distroless/java17-debian12(安全極簡)
要求:鏡像體積 < 300MB,無多余依賴、編譯工具、shell。
2. 構(gòu)建標(biāo)準(zhǔn)化瘦身鏡像
采用分層構(gòu)建(多階段構(gòu)建):編譯→打包→運(yùn)行分離
只交付jar/war,不交付源碼、maven、git 等文件
鏡像不可變:運(yùn)行時禁止寫入 / 修改容器內(nèi)文件
3. 容器非 root 運(yùn)行
禁止使用 root 用戶啟動 Java 進(jìn)程
專屬 UID/GID,最小權(quán)限原則
滿足 K8ssecurityContext安全策略
二、JVM + K8s 資源配置(4 條)
4. JVM 內(nèi)存自動感知容器資源
必須開啟容器感知,禁止寫死 -Xmx/-Xms:
yaml
# JVM 參數(shù)(Java 11+ 原生支持)-name:JAVA_TOOL_OPTIONSvalue:"-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"
JVM 最大內(nèi)存 = 容器內(nèi)存限制 × 75%,避免 OOM Kill。
5. 嚴(yán)格配置 Requests / Limits
生產(chǎn)強(qiáng)制雙限制,缺一不可:
yaml
resources:requests:cpu:1000mmemory:2Gilimits:cpu:2000mmemory:2Gi
CPU:無超配;內(nèi)存:requests = limits(避免調(diào)度抖動)
Java 應(yīng)用禁止不配置 Limits
6. 合理 CPU 核數(shù)配置
單 Pod CPU 推薦1~2 核(微服務(wù)最佳實(shí)踐)
避免單核 GC 卡頓、避免多核浪費(fèi)
禁止超過 4 核(除非批處理 / 計(jì)算型應(yīng)用)
7. 禁用 JVM Swap
開啟-XX:+AlwaysPreTouch+ K8s 禁止 swap,保證內(nèi)存性能穩(wěn)定。
三、健康檢查與高可用(3 條)
8. 配置精準(zhǔn)存活探針(livenessProbe)
基于HTTP 端口 / 健康端點(diǎn),不使用進(jìn)程判斷:
yaml
livenessProbe:httpGet:path:/actuator/health/livenessport:httpinitialDelaySeconds:60periodSeconds:10
作用:卡死 / 死鎖時自動重啟,防止weibo.com/ttarticle/p/show?id=2309405281549024624840假活。
9. 配置精準(zhǔn)就緒探針(readinessProbe)
yaml
readinessProbe:httpGet:path:/actuator/health/readinessport:httpinitialDelaySeconds:20periodSeconds:5
作用:啟動完成前不接入流量,發(fā)布無報(bào)錯。
10. 優(yōu)雅啟動 / 終止(必選)
配置terminationGracePeriodSeconds: 30-60
Spring Boot 開啟:server.shutdown=graceful
確保:停止前先摘流量 → 處理完請求 → 關(guān)閉 JVM
杜絕流量丟失、連接報(bào)錯、事務(wù)中斷。
四、發(fā)布與彈性(3 條)
11. 滾動發(fā)布策略
yaml
strategy:rollingUpdate:maxUnavailable:0maxSurge:1
保證:發(fā)布過程無損、無斷服。
12. 禁止使用 latest 鏡像標(biāo)簽
必須用固定版本號:v1.2.3、git-commit-id
禁止:latest、dev等浮動標(biāo)簽,防止意外更新。
13. 生產(chǎn)啟用 HPA 彈性伸縮
基于 CPU / 自定義指標(biāo)自動擴(kuò)縮容:
最小副本 ≥ 2(高可用)
擴(kuò)容閾值:CPU 使用率 70%
支持秒級擴(kuò)容,應(yīng)對流量突刺
五、配置與外部依賴(2 條)
14. 配置外部化(不硬編碼)
配置放ConfigMap
密鑰放Secret(數(shù)據(jù)庫密碼、token 等)
環(huán)境變量注入,禁止打包在 jar 內(nèi)
15. 合理連接池 + 超時控制
DB/Redis/MQ 連接池跟隨容器生命周期
全部設(shè)置連接超時、讀取超時
支持 K8s 網(wǎng)絡(luò)波動自動重連
六、可觀測性(3 條)
16. 暴露標(biāo)準(zhǔn)監(jiān)控端點(diǎn)
集成Spring Boot Actuator,提供:
/actuator/prometheus指標(biāo)
JVM 內(nèi)存、GC、線程、類加載
接口 QPS、RT、錯誤率
17. 標(biāo)準(zhǔn)日志輸出(stdout/stderr)
日志直接打印控制臺,禁止寫本地文件
統(tǒng)一 JSON 格式,方便日志平臺采集
包含:traceId、時間、級別、異常棧
18. 接入分布式追蹤
集成 SkyWalking/Pinpoint/OpenTelemetry
全鏈路追蹤
調(diào)用拓?fù)?/p>
慢請求定位
七、安全與運(yùn)維規(guī)范(2 條)
19. 網(wǎng)絡(luò)策略與權(quán)限管控
生產(chǎn)環(huán)境配置NetworkPolicy,限制 Pod 訪問范圍
密鑰加密、Secret 權(quán)限隔離
禁止容器特權(quán)模式privileged: false
20. 固定 Pod 調(diào)度規(guī)則
反親和性:同服務(wù)副本分散在不同節(jié)點(diǎn)
避免單點(diǎn)故障
支持污點(diǎn) / 容忍,適配混合部署
最簡可直接復(fù)制的生產(chǎn)級 YAML 片段(Java 通用)
yaml
apiVersion:apps/v1kind:Deploymentmetadata:name:java-appspec:replicas:2strategy:rollingUpdate:maxUnavailable:0maxSurge:1selector:matchLabels:app:java-apptemplate:metadata:labels:app:java-appspec:securityContext:runAsNonRoot:truerunAsUser:1000containers:-name:appimage:your-registry/java-app:v1.0.0ports:-name:httpcontainerPort:8080env:-name:JAVA_TOOL_OPTIONSvalue:"-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XX:+AlwaysPreTouch"resources:requests:cpu:1000mmemory:2Gilimits:cpu:2000mmemory:2GilivenessProbe:httpGet:path:/actuator/health/livenessport:httpinitialDelaySeconds:60periodSeconds:10readinessProbe:httpGet:path:/actuator/health/readinessport:httpinitialDelaySeconds:20periodSeconds:5lifecycle:preStop:exec:command:["sleep","15"]terminationGracePeriodSeconds:60
總結(jié)
這 20 條是Java 上 K8s 生產(chǎn)可用的最低標(biāo)準(zhǔn),滿足后可保證穩(wěn)定、安全、無損發(fā)布
核心紅線:資源限制、健康檢查、優(yōu)雅啟停、非 root、鏡像不可變、配置外部化
可直接作為上線 checklist、架構(gòu)評審標(biāo)準(zhǔn)、DevOps 規(guī)范使用