以獨立模式執行 Kubelet

本教學課程示範如何執行獨立的 kubelet 實例。

您可能有不同的動機來執行獨立的 kubelet。本教學課程旨在向您介紹 Kubernetes,即使您沒有太多使用經驗。您可以按照本教學課程學習節點設定、基本 (靜態) Pod,以及 Kubernetes 如何管理容器。

完成本教學課程後,您可以嘗試使用具有控制平面的叢集來管理 Pod 和節點,以及其他類型的物件。例如,Hello, minikube

您也可以在獨立模式下執行 kubelet 以適應生產使用案例,例如執行高可用性、彈性部署叢集的控制平面。本教學課程未涵蓋執行彈性控制平面所需的詳細資訊。

目標

  • 在 Linux 系統上安裝 cri-okubelet,並將它們作為 systemd 服務執行。
  • 啟動一個執行 nginx 的 Pod,該 Pod 監聽 Pod IP 位址上 TCP 埠 80 的請求。
  • 了解解決方案的不同組件如何相互交互。

開始之前

  • 管理員 (root) 存取使用 systemdiptables (或具有 iptables 模擬的 nftables) 的 Linux 系統。
  • 存取網際網路以下載本教學課程所需的組件,例如

準備系統

Swap 組態

預設情況下,如果在節點上偵測到 swap 記憶體,kubelet 將無法啟動。這表示應停用 swap 或由 kubelet 容許 swap。

如果您已啟用 swap 記憶體,請停用它或將 failSwapOn: false 新增至 kubelet 組態檔。

檢查是否已啟用 swap

sudo swapon --show

如果命令沒有輸出,則表示 swap 記憶體已停用。

暫時停用 swap

sudo swapoff -a

為了使此變更在重新啟動後仍然存在

請確保在 /etc/fstabsystemd.swap 中停用 swap,具體取決於系統上的組態方式。

啟用 IPv4 封包轉發

檢查是否已啟用 IPv4 封包轉發

cat /proc/sys/net/ipv4/ip_forward

如果輸出為 1,則表示已啟用。如果輸出為 0,請按照後續步驟操作。

若要啟用 IPv4 封包轉發,請建立一個組態檔,將 net.ipv4.ip_forward 參數設定為 1

sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
EOF

將變更套用至系統

sudo sysctl --system

輸出類似於

...
* Applying /etc/sysctl.d/k8s.conf ...
net.ipv4.ip_forward = 1
* Applying /etc/sysctl.conf ...

下載、安裝和組態組件

安裝容器執行階段

下載所需套件的最新可用版本 (建議)。

本教學課程建議安裝 CRI-O 容器執行階段 (外部連結)。

根據您的特定 Linux 發行版,有幾種安裝方式來安裝 CRI-O 容器執行階段。雖然 CRI-O 建議使用 debrpm 套件,但本教學課程使用 CRI-O Packaging 專案靜態二進制捆綁腳本,既可以簡化整個過程,又能保持與發行版無關。

此腳本會安裝和設定額外的必要軟體,例如 cni-plugins(用於容器網路),以及 crunrunc(用於執行容器)。

此腳本將自動偵測您系統的處理器架構(amd64arm64),並選擇及安裝最新版本的軟體套件。

設定 CRI-O

前往 發行版本 頁面(外部連結)。

下載靜態二進位捆綁腳本

curl https://raw.githubusercontent.com/cri-o/packaging/main/get > crio-install

執行安裝程式腳本

sudo bash crio-install

啟用並啟動 crio 服務

sudo systemctl daemon-reload
sudo systemctl enable --now crio.service

快速測試

sudo systemctl is-active crio.service

輸出類似於

active

詳細服務檢查

sudo journalctl -f -u crio.service

安裝網路外掛程式

cri-o 安裝程式會安裝和設定 cni-plugins 套件。您可以執行以下命令來驗證安裝

/opt/cni/bin/bridge --version

輸出類似於

CNI bridge plugin v1.5.1
CNI protocol versions supported: 0.1.0, 0.2.0, 0.3.0, 0.3.1, 0.4.0, 1.0.0

檢查預設設定

cat /etc/cni/net.d/11-crio-ipv4-bridge.conflist

輸出類似於

{
  "cniVersion": "1.0.0",
  "name": "crio",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni0",
      "isGateway": true,
      "ipMasq": true,
      "hairpinMode": true,
      "ipam": {
        "type": "host-local",
        "routes": [
            { "dst": "0.0.0.0/0" }
        ],
        "ranges": [
            [{ "subnet": "10.85.0.0/16" }]
        ]
      }
    }
  ]
}

下載並設定 kubelet

下載 最新穩定版本 的 kubelet。


curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubelet"


curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubelet"

設定

sudo mkdir -p /etc/kubernetes/manifests
sudo tee /etc/kubernetes/kubelet.yaml <<EOF
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authentication:
  webhook:
    enabled: false # Do NOT use in production clusters!
authorization:
  mode: AlwaysAllow # Do NOT use in production clusters!
enableServer: false
logging:
  format: text
address: 127.0.0.1 # Restrict access to localhost
readOnlyPort: 10255 # Do NOT use in production clusters!
staticPodPath: /etc/kubernetes/manifests
containerRuntimeEndpoint: unix:///var/run/crio/crio.sock
EOF

安裝

chmod +x kubelet
sudo cp kubelet /usr/bin/

建立 systemd 服務單元檔案

sudo tee /etc/systemd/system/kubelet.service <<EOF
[Unit]
Description=Kubelet

[Service]
ExecStart=/usr/bin/kubelet \
 --config=/etc/kubernetes/kubelet.yaml
Restart=always

[Install]
WantedBy=multi-user.target
EOF

在服務設定檔中,命令列引數 --kubeconfig 已被刻意省略。此引數設定 kubeconfig 檔案的路徑,該檔案指定如何連線到 API 伺服器,從而啟用 API 伺服器模式。省略此引數會啟用獨立模式。

啟用並啟動 kubelet 服務

sudo systemctl daemon-reload
sudo systemctl enable --now kubelet.service

快速測試

sudo systemctl is-active kubelet.service

輸出類似於

active

詳細服務檢查

sudo journalctl -u kubelet.service

檢查 kubelet 的 API /healthz 端點

curl http://localhost:10255/healthz?verbose

輸出類似於

[+]ping ok
[+]log ok
[+]syncloop ok
healthz check passed

查詢 kubelet 的 API /pods 端點

curl http://localhost:10255/pods | jq '.'

輸出類似於

{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {},
  "items": null
}

在 kubelet 中執行 Pod

在獨立模式下,您可以使用 Pod 清單檔來執行 Pod。清單檔可以位於本機檔案系統上,也可以透過 HTTP 從組態來源擷取。

為 Pod 建立清單檔

cat <<EOF > static-web.yaml
apiVersion: v1
kind: Pod
metadata:
  name: static-web
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
EOF

static-web.yaml 清單檔複製到 /etc/kubernetes/manifests 目錄。

sudo cp static-web.yaml /etc/kubernetes/manifests/

找出關於 kubelet 和 Pod 的資訊

Pod 網路外掛程式會為每個 Pod 建立網路橋接器 (cni0) 和一對 veth 介面(其中一對在新建的 Pod 內部,另一對則在主機層級)。

http://localhost:10255/pods 查詢 kubelet 的 API 端點

curl http://localhost:10255/pods | jq '.'

取得 static-web Pod 的 IP 位址

curl http://localhost:10255/pods | jq '.items[].status.podIP'

輸出類似於

"10.85.0.4"

連線到 nginx 伺服器 Pod,網址為 http://<IP>:<Port>(連接埠 80 為預設值),在此範例中

curl http://10.85.0.4

輸出類似於

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

在哪裡尋找更多詳細資訊

如果您需要診斷讓本教學正常運作的問題,可以在以下目錄中尋找監控和疑難排解資訊

/var/lib/cni
/var/lib/containers
/var/lib/kubelet

/var/log/containers
/var/log/pods

清除

kubelet

sudo systemctl disable --now kubelet.service
sudo systemctl daemon-reload
sudo rm /etc/systemd/system/kubelet.service
sudo rm /usr/bin/kubelet
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/log/containers
sudo rm -rf /var/log/pods

容器執行期

sudo systemctl disable --now crio.service
sudo systemctl daemon-reload
sudo rm -rf /usr/local/bin
sudo rm -rf /usr/local/lib
sudo rm -rf /usr/local/share
sudo rm -rf /usr/libexec/crio
sudo rm -rf /etc/crio
sudo rm -rf /etc/containers

網路外掛程式

sudo rm -rf /opt/cni
sudo rm -rf /etc/cni
sudo rm -rf /var/lib/cni

結論

本頁涵蓋了以獨立模式部署 kubelet 的基本面向。您現在已準備好部署 Pod 並測試其他功能。

請注意,在獨立模式下,kubelet支援從控制平面擷取 Pod 組態(因為沒有控制平面連線)。

您也無法使用 ConfigMapSecret 來設定靜態 Pod 中的容器。

下一步

本頁的項目參考了第三方產品或專案,這些產品或專案提供了 Kubernetes 所需的功能。Kubernetes 專案作者不對這些第三方產品或專案負責。如需更多詳細資訊,請參閱 CNCF 網站指南

在提出變更以新增額外的第三方連結之前,您應閱讀內容指南

上次修改時間:2024 年 11 月 06 日下午 5:33 PST:Fix bullet indentations and typos in kubelet-standalone.md (a7c9e0bbc9)