以独立模式运行 Kubelet
本教程展示了如何运行一个独立的 kubelet 实例。
运行独立 kubelet 的动机可能各不相同。本教程旨在向你介绍 Kubernetes,即使你经验不多。你可以按照本教程学习节点的设置、基本的(静态)Pod,以及 Kubernetes 如何管理容器。
按照本教程操作后,你可以尝试使用带有控制平面的集群来管理 Pod 和节点,以及其他类型的对象。例如,Hello, minikube。
你也可以在独立模式下运行 kubelet 以满足生产用例,例如运行一个高可用、弹性部署集群的控制平面。本教程不涵盖运行弹性控制平面所需的详细信息。
目标
- 在 Linux 系统上安装
cri-o
和kubelet
,并将它们作为systemd
服务运行。 - 启动一个运行
nginx
的 Pod,监听 Pod IP 地址上的 TCP 80 端口的请求。 - 了解解决方案中不同组件如何相互作用。
注意
本教程使用的 kubelet 配置在设计上是不安全的,不应用于生产环境。准备工作
- 对使用
systemd
和iptables
(或带有iptables
仿真的 nftables) 的 Linux 系统具有管理员 (root
) 访问权限。 - 能够访问互联网,以下载教程所需的组件,例如:
- 实现 Kubernetes (CRI) 的容器运行时。
- 网络插件(通常被称为 容器网络接口 (CNI))
- 所需的 CLI 工具:
curl
、tar
、jq
。
准备系统
Swap 配置
默认情况下,如果在节点上检测到 Swap 内存,kubelet 将无法启动。这意味着 Swap 应该被禁用或者被 kubelet 容忍。
注意
如果你配置 kubelet 容忍 Swap,kubelet 仍然会配置 Pod(以及这些 Pod 中的容器)不使用 Swap 空间。要了解 Pod 如何实际使用可用的 Swap,你可以阅读更多关于 Linux 节点上Swap 内存管理的信息。如果你的 Swap 内存已启用,请将其禁用或向 kubelet 配置文件中添加 failSwapOn: false
。
检查 Swap 是否已启用
sudo swapon --show
如果命令没有输出,则 Swap 内存已禁用。
临时禁用 Swap
sudo swapoff -a
使更改在重启后仍然有效
请确保 Swap 在 /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
访问发布页面(外部链接)。
下载静态二进制包脚本
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 内部,另一个在宿主主机级别)。
查询 kubelet API 端点 http://localhost:10255/pods
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 网站指南。
在提议添加额外第三方链接的更改之前,应阅读内容指南。