以獨立模式執行 Kubelet

本教程向你展示如何執行一個獨立的 kubelet 例項。

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

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

你也可以以獨立模式執行 kubelet,以適應生產用例,例如為高可用、彈性部署的叢集執行控制平面。本教程不涵蓋執行彈性控制平面所需的詳細資訊。

目標

  • 在 Linux 系統上安裝 `cri-o` 和 `kubelet`,並將它們作為 `systemd` 服務執行。
  • 啟動一個執行 `nginx` 的 Pod,該 Pod 監聽 Pod IP 地址上的 TCP 埠 80 請求。
  • 瞭解解決方案的不同元件之間如何互動。

準備工作

  • 管理 Linux 系統(使用 `systemd` 和 `iptables`(或使用 `iptables` 模擬的 nftables))的 `root` 許可權。
  • 訪問網際網路以下載本教程所需的元件,例如:

準備系統

Swap 配置

預設情況下,如果節點上檢測到交換記憶體,kubelet 將無法啟動。這意味著應該停用交換或由 kubelet 容忍。

如果啟用了交換記憶體,請停用它或將 `failSwapOn: false` 新增到 kubelet 配置檔案中。

檢查是否啟用了交換

sudo swapon --show

如果該命令沒有輸出,則交換記憶體已被停用。

臨時停用交換

sudo swapoff -a

使此更改在重啟後仍然有效

確保在 `/etc/fstab` 或 `systemd.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 容器執行時(外部連結)。

CRI-O 容器執行時有多種安裝方式,具體取決於你使用的 Linux 發行版。雖然 CRI-O 建議使用 `deb` 或 `rpm` 軟體包,但本教程使用 CRI-O Packaging project 的*靜態二進位制包*指令碼,以簡化整個過程並保持與發行版無關。

該指令碼安裝並配置其他所需的軟體,例如用於容器網路的 `cni-plugins`,以及用於執行容器的 `crun``runc`

該指令碼將自動檢測你的系統處理器架構(`amd64` 或 `arm64`)並選擇安裝最新版本的軟體包。

設定 CRI-O

訪問 releases 頁面(外部連結)。

下載靜態二進位制包指令碼

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 https://:10255/healthz?verbose

輸出類似於:

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

查詢 kubelet 的 API `/pods` 端點

curl https://:10255/pods | jq '.'

輸出類似於:

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

在 kubelet 中執行 Pod

在獨立模式下,你可以使用 Pod manifest 執行 Pod。這些 manifest 可以位於本地檔案系統上,也可以透過 HTTP 從配置源獲取。

建立 Pod 的 manifest

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 網路外掛會建立一個網路橋接 (`cni0`) 和一對 `veth` 介面(其中一個在新建的 Pod 內部,另一個在主機層面)。

查詢 kubelet 的 API 端點 `https://:10255/pods`

curl https://:10255/pods | jq '.'

獲取 `static-web` Pod 的 IP 地址

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

輸出類似於:

"10.85.0.4"

連線到 `nginx` 伺服器 Pod(地址為 `http://:`,埠 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 中的容器。

下一步

  • 按照Hello, minikube瞭解如何執行帶有控制平面的 Kubernetes。minikube 工具可幫助你在自己的計算機上設定一個實踐叢集。
  • 瞭解更多關於網路外掛的資訊
  • 瞭解更多關於容器執行時的資訊
  • 瞭解更多關於kubelet的資訊
  • 瞭解更多關於靜態 Pod 的資訊

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

在提議新增額外第三方連結的更改之前,你應該閱讀內容指南

上次修改時間:2024 年 11 月 06 日太平洋標準時間下午 5:33: 修復 kubelet-standalone.md 中的專案符號縮排和拼寫錯誤 (a7c9e0bbc9)