以独立模式运行 Kubelet
本教程将向您展示如何运行独立的 kubelet 实例。
您可能有不同的动机来运行独立的 kubelet。本教程旨在向您介绍 Kubernetes,即使您没有太多经验。您可以按照本教程学习节点设置、基本(静态)Pod 以及 Kubernetes 如何管理容器。
完成本教程后,您可以尝试使用具有控制平面的集群来管理 Pod、节点和其他类型的对象。例如,Hello, minikube。
您还可以以独立模式运行 kubelet 以适应生产用例,例如为高可用性、弹性部署的集群运行控制平面。本教程未涵盖运行弹性控制平面所需的详细信息。
目标
- 在 Linux 系统上安装
cri-o
和kubelet
,并将它们作为systemd
服务运行。 - 启动一个运行
nginx
的 Pod,该 Pod 侦听 Pod IP 地址上 TCP 端口 80 上的请求。 - 了解解决方案的不同组件如何相互交互。
注意
本教程中使用的 kubelet 配置设计上是不安全的,不应在生产环境中使用。准备工作
- 对使用
systemd
和iptables
(或带有iptables
仿真功能的 nftables)的 Linux 系统的管理员(root
)访问权限。 - 访问互联网以下载教程所需的组件,例如
- 一个实现 Kubernetes (CRI) 的容器运行时。
- 网络插件(这些通常称为容器网络接口 (CNI))
- 所需的 CLI 工具:
curl
、tar
、jq
。
准备系统
交换配置
默认情况下,如果在节点上检测到交换内存,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 容器运行时(外部链接)。
根据您的特定 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
。此参数设置了指定如何连接到 API 服务器的kubeconfig文件的路径,从而启用 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://127.0.0.1:10255/healthz?verbose
输出类似于
[+]ping ok
[+]log ok
[+]syncloop ok
healthz check passed
查询 kubelet 的 API /pods
端点
curl https://127.0.0.1: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 端点:https://127.0.0.1:10255/pods
curl https://127.0.0.1:10255/pods | jq '.'
获取 static-web
Pod 的 IP 地址
curl https://127.0.0.1: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 网站指南。
在提议添加额外第三方链接的更改之前,您应该阅读 内容指南。