以獨立模式執行 Kubelet
本教學課程示範如何執行獨立的 kubelet 實例。
您可能有不同的動機來執行獨立的 kubelet。本教學課程旨在向您介紹 Kubernetes,即使您沒有太多使用經驗。您可以按照本教學課程學習節點設定、基本 (靜態) Pod,以及 Kubernetes 如何管理容器。
完成本教學課程後,您可以嘗試使用具有控制平面的叢集來管理 Pod 和節點,以及其他類型的物件。例如,Hello, minikube。
您也可以在獨立模式下執行 kubelet 以適應生產使用案例,例如執行高可用性、彈性部署叢集的控制平面。本教學課程未涵蓋執行彈性控制平面所需的詳細資訊。
目標
- 在 Linux 系統上安裝
cri-o
和kubelet
,並將它們作為systemd
服務執行。 - 啟動一個執行
nginx
的 Pod,該 Pod 監聽 Pod IP 位址上 TCP 埠 80 的請求。 - 了解解決方案的不同組件如何相互交互。
注意
本教學課程中使用的 kubelet 組態在設計上是不安全的,不應在生產環境中使用。開始之前
- 管理員 (
root
) 存取使用systemd
和iptables
(或具有iptables
模擬的 nftables) 的 Linux 系統。 - 存取網際網路以下載本教學課程所需的組件,例如
- 容器執行階段,實作 Kubernetes (CRI)。
- 網路外掛程式 (這些通常稱為 容器網路介面 (CNI))
- 必要的 CLI 工具:
curl
、tar
、jq
。
準備系統
Swap 組態
預設情況下,如果在節點上偵測到 swap 記憶體,kubelet 將無法啟動。這表示應停用 swap 或由 kubelet 容許 swap。
注意
如果您將 kubelet 設定為容許 swap,kubelet 仍會將 Pod (以及這些 Pod 中的容器) 設定為不使用 swap 空間。若要了解 Pod 如何實際使用可用的 swap,您可以閱讀有關 Linux 節點上的swap 記憶體管理的更多資訊。如果您已啟用 swap 記憶體,請停用它或將 failSwapOn: false
新增至 kubelet 組態檔。
檢查是否已啟用 swap
sudo swapon --show
如果命令沒有輸出,則表示 swap 記憶體已停用。
暫時停用 swap
sudo swapoff -a
為了使此變更在重新啟動後仍然存在
請確保在 /etc/fstab
或 systemd.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 建議使用 deb
或 rpm
套件,但本教學課程使用 CRI-O Packaging 專案的靜態二進制捆綁腳本,既可以簡化整個過程,又能保持與發行版無關。
此腳本會安裝和設定額外的必要軟體,例如 cni-plugins
(用於容器網路),以及 crun
和 runc
(用於執行容器)。
此腳本將自動偵測您系統的處理器架構(amd64
或 arm64
),並選擇及安裝最新版本的軟體套件。
設定 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" }]
]
}
}
]
}
注意
請確認預設的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 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 組態(因為沒有控制平面連線)。
您也無法使用 ConfigMap 或 Secret 來設定靜態 Pod 中的容器。
下一步
- 請依照Hello, minikube 學習如何透過控制平面執行 Kubernetes。minikube 工具可協助您在自己的電腦上設定練習叢集。
- 進一步了解網路外掛程式
- 進一步了解容器執行期
- 進一步了解kubelet
- 進一步了解靜態 Pod
本頁的項目參考了第三方產品或專案,這些產品或專案提供了 Kubernetes 所需的功能。Kubernetes 專案作者不對這些第三方產品或專案負責。如需更多詳細資訊,請參閱 CNCF 網站指南。
在提出變更以新增額外的第三方連結之前,您應閱讀內容指南。