Chuyển đến nội dung chính

第 3 課:準備 LINUX 作業系統和系統調優

安裝 Ubuntu 24.04/RHEL 9,配置 K8s 的核心參數(net.bridge、ip_forward、inotify)、關閉 swap、配置 chrony/NTP、防火牆規則、SSH 強化並在安裝 K8s 之前準備所有節點。

🔒 DevSecOps — 第 3 課 第 3 課:準備 LINUX 作業系統與系統調整

使用 Kubernetes HA 在本地部署微服務

第 1 部分:平台和平臺本地基礎設施設計

xdev.asia

🎯 課程目標__HTMLTAG_66___

完成本課程後,您將:

  • ✅ 為所有節點安裝並更新 Ubuntu 24.04 LTS
  • ✅ 設定 Kubernetes 所需的核心參數
  • ✅ 永久關閉交換並了解原因
  • ✅ 為整個叢集設定 NTP 同步__HTMLTAG_77___
  • ✅ 強化 SSH 並設定防火牆規則
  • ✅ 標準化主機名稱、主機檔案與 DNS 解析

第 1 部分:安裝 UBUNTU 24.04 LTS

1.1。為什麼選擇 Ubuntu 24.04 LTS?

    ___HTMLTAG_89__HTMLTAG_90___LTS(長期支援): 12 年支援(Ubuntu Pro 至 2036 年) ___HTMLTAG_93__HTMLTAG_94___核心 6.8+: 對 eBPF (Cilium)、cgroup v2、io_uring 的良好支持 ___HTMLTAG_97__HTMLTAG_98___systemd 255+: 改進 cgroup v2 管理 ___HTMLTAG_101__HTMLTAG_102___廣泛採用: 使用 K8s、Ceph 和 CNCF 工具進行了全面測試

⚠️ 注意: RHEL 9 / Rocky Linux 9 對於企業來說也是一個不錯的選擇。本指南使用 Ubuntu,但會在不同時註明 RHEL 指令。

1.2。基本設定

___程式碼區塊_0___

第 2 部分:主機名稱與 DNS 解析__HTMLTAG_114___

2.1。在每個節點上設定主機名稱

___程式碼區塊_1___

2.2。在所有節點上設定 /etc/hosts

___程式碼區塊_2___

💡 提示: 在生產中,使用內部 DNS 伺服器(CoreDNS 或 BIND)而非 /etc/hosts。為簡單起見,本課程使用 /etc/hosts。


第 3 部分:KUBERNETES 的核心參數

3.1。為什麼需要客製化內核?

Kubernetes 需要啟用一些核心功能:

參數 值 原因
net.bridge.bridge-nf-call-iptables__HTMLTAG_145___ 1 透過 iptables 規則橋接流量(服務所需)
net.bridge.bridge-nf-call-ip6tables 1 透過 ip6tables 的 IPv6 橋接流量__HTMLTAG_157___
net.ipv4.ip_forward 1 在介面之間轉送封包(Pod 網路)
net.ipv6.conf.all.forwarding 1 IPv6 轉送(如果使用雙堆疊)
fs.inotify.max_user_instances 8192 對於許多容器需要inotify(檔案監視)
fs.inotify.max_user_watches 524288 Inotify 每個使用者觀看的次數

3.2。配置核心參數

___程式碼區塊_3___

程式碼區塊_4


第 4 部分:關閉交換

4.1。為什麼必須關閉 Swap?

Kubelet 需要停用交換__HTMLTAG_203___(儘管 K8s 1.28+ 有 beta 交換支援)。原因:

  • 交換會導致 容器延遲無法預測
  • K8s 調度程式依據 物理記憶體___HTMLTAG_212__HTMLTAG_213___ 計算資源
  • 交換隱藏的OOM問題,使調試變得困難
  • etcd 和資料庫在交換時表現非常差__HTMLTAG_219___

4.2。永久關閉交換

___程式碼區塊_5___

第 5 部分:NTP 時間同步

5.1。為什麼 NTP 極為重要?

    ___HTMLTAG_229__HTMLTAG_230___etcd: 使用時間戳進行領導者選舉,需要時脈偏差 < 500ms ___HTMLTAG_233__HTMLTAG_234___TLS 憑證: 根據時間驗證,時脈錯誤 → 憑證無效 ___HTMLTAG_237__HTMLTAG_238___日誌相關性: 節點之間的日誌時間戳記必須符合 ___HTMLTAG_241__HTMLTAG_242___Ceph: MON 仲裁請求時脈偏差 < 50ms

5.2。定時配置 (NTP)

___程式碼區塊_6___

第 6 部分:SSH 強化

6.1。安全 SSH 設定

___程式碼區塊_7___

6.2。設定 SSH 金鑰驗證

___程式碼區塊_8___

第 7 部分:防火牆設定

7.1。用於控制平面節點的 UFW

___程式碼區塊_9___

7.2。用於工作節點的 UFW

___程式碼區塊_10___

💡 替代方案: 許多生產環境直接使用 nftables 或 iptables 而不是 UFW。 Cilium 也可以用主機策略取代節點級防火牆。


第 8 部分:其他自訂

8.1。停用無人值守升級(生產)

___程式碼區塊_11___

8.2。配置 ulimit

___程式碼區塊_12___

8.3。禁用透明大頁

___程式碼區塊_13___

8.4。 cgroup v2 驗證

___程式碼區塊_14___

第 9 部分:自動化 — 準備所有節點的腳本

9.1。節點準備腳本(在所有K8s節點上執行)

___程式碼區塊_15___

9.2。在所有節點上執行腳本

___程式碼區塊_16___

第 10 部分:驗證清單

10.1。每個節點的清單

___程式碼區塊_17___

💡 重點

    ___HTMLTAG_293__HTMLTAG_294___核心模組 K8s Pod 網路需要 Overlay 與 br_netfilter ___HTMLTAG_297__HTMLTAG_298___ip_forward = 1 允許 Pod 到 Pod 的流量通過節點 ___HTMLTAG_301__HTMLTAG_302___交換必須永久關閉 — 如果開啟交換,kubelet 將拒絕啟動 ___HTMLTAG_305__HTMLTAG_306___NTP 同步 對於 etcd、TLS 憑證和 Ceph 至關重要 ___HTMLTAG_309__HTMLTAG_310___SSH 強化: 僅基於金鑰的驗證,停用密碼登入 ___HTMLTAG_313__HTMLTAG_314___自動化腳本幫助一致地準備所有節點

🎯 練習

練習 1:準備所有節點

  • 在所有 7 個虛擬機器(或伺服器)上執行prepare-k8s-node.sh
  • 在每個節點上執行 verify-node.sh,確保所有檢查通過
  • 1個master和1個worker的verify-node.sh結果截圖

練習 2:基準 NTP

  • 檢查所有節點之間的時脈偏移: chronyc 來源 -v___HTMLTAG_336__HTMLTAG_337___
  • 確保偏移 < 1ms giữa tất cả nodes
  • 嘗試中斷 NTP,更改時間,看看 chrony 需要多長時間才能重新同步

練習 3:RHEL 9 變體__HTMLTAG_344___
  • 為 RHEL 9 / Rocky Linux 9 重寫prepare-k8s-node.sh
  • 取代 apt → dnf、ufw → 防火牆
  • 在 1 個虛擬機器上進行測試以驗證

📚 下一篇文章

在第4課:Kubernetes API伺服器的負載平衡器中,我們將安裝keepalived + HAProxy來為K8s API伺服器建立虛擬IP,確保控制平面存取的HA。