以獨立模式執行 Kubelet
本教程向你展示如何執行一個獨立的 kubelet 例項。
執行獨立 kubelet 的動機可能有很多。本教程旨在向你介紹 Kubernetes,即使你對此沒有太多經驗。你可以按照本教程學習節點設定、基本(靜態)Pod 以及 Kubernetes 如何管理容器。
完成本教程後,你可以嘗試使用一個具有控制平面的叢集來管理 Pod 和節點,以及其他型別的物件。例如,Hello, minikube。
你也可以以獨立模式執行 kubelet,以適應生產用例,例如為高可用、彈性部署的叢集執行控制平面。本教程不涵蓋執行彈性控制平面所需的詳細資訊。
目標
- 在 Linux 系統上安裝 `cri-o` 和 `kubelet`,並將它們作為 `systemd` 服務執行。
- 啟動一個執行 `nginx` 的 Pod,該 Pod 監聽 Pod IP 地址上的 TCP 埠 80 請求。
- 瞭解解決方案的不同元件之間如何互動。
注意
本教程使用的 kubelet 配置在設計上是不安全的,**不應**用於生產環境。準備工作
- 管理 Linux 系統(使用 `systemd` 和 `iptables`(或使用 `iptables` 模擬的 nftables))的 `root` 許可權。
- 訪問網際網路以下載本教程所需的元件,例如:
- 實現了 Kubernetes (CRI) 的容器執行時。
- 網路外掛(這些通常被稱為 容器網路介面 (CNI))
- 所需的 CLI 工具: `curl`、`tar`、`jq`。
準備系統
Swap 配置
預設情況下,如果節點上檢測到交換記憶體,kubelet 將無法啟動。這意味著應該停用交換或由 kubelet 容忍。
注意
如果你將 kubelet 配置為容忍交換,kubelet 仍然會配置 Pod(以及這些 Pod 中的容器)不使用交換空間。要了解 Pod 如何實際使用可用的交換,你可以閱讀更多關於 Linux 節點上的交換記憶體管理。如果啟用了交換記憶體,請停用它或將 `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" }]
]
}
}
]
}
注意
確保預設的 `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
注意
由於你沒有設定生產叢集,因此你將使用純 HTTP (`readOnlyPort: 10255`) 對 kubelet 的 API 進行未經身份驗證的查詢。
本教程的目的是停用**認證 webhook** 並將**授權模式**設定為 `AlwaysAllow`。你可以瞭解更多關於授權模式和webhook 認證,以便在你的環境中以獨立模式正確配置 kubelet。
請參閱埠和協議以瞭解 Kubernetes 元件使用的埠。
安裝
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://
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 配置(因為沒有控制平面連線)。
你也不能使用 ConfigMap 或 Secret 來配置靜態 Pod 中的容器。
下一步
- 按照Hello, minikube瞭解如何執行帶有控制平面的 Kubernetes。minikube 工具可幫助你在自己的計算機上設定一個實踐叢集。
- 瞭解更多關於網路外掛的資訊
- 瞭解更多關於容器執行時的資訊
- 瞭解更多關於kubelet的資訊
- 瞭解更多關於靜態 Pod 的資訊
本頁上的專案指的是提供 Kubernetes 所需功能的第三方產品或專案。Kubernetes 專案作者不對這些第三方產品或專案負責。有關更多詳細資訊,請參閱 CNCF 網站指南。
在提議新增額外第三方連結的更改之前,你應該閱讀內容指南。