k3s试用
1、k3s有离线安装和在线安装
2、我是在qenu虚拟机(无kvm)的archlinux操作系统中安装k3s的。用的是在线安装。
2.1 首先确保https://rancher-mirror.rancher.cn/k3s/k3s-install.sh这个网址可以访问,否则要先解决网络问题。
2.2 其次确认防火墙和swap是否已经关闭了。
关闭swap sudo swapoff -a
检查swap是否开启, 可以用free 命令看 swap大小,也可以cat /etc/fstab 查看是否挂载swap分区。
k8s要求关闭swap,主要是怕swap导致k8s无法准确看到每个node的真实剩余内存,导致把pod调度到无剩余内存的node上。
关闭防火墙:生产环境建议保留防火墙,按需放行 6443、10250、8472 等端口。
sudo systemctl stop firewalld
sudo systemctl disable firewalld
2.3 安装依赖包
sudo pacman -S socat conntrack-tools iptables
2.4 确保主机名是合法的 DNS 格式(不能是 localhost 或含下划线),可以用cat /etc/hostname查看,或用 hostnamectl 命令查看
2.5 在线安装
首先配置镜像源
sudo mkdir -p /etc/rancher/k3s
sudo tee /etc/rancher/k3s/registries.yaml << ‘EOF’
mirrors:
docker.io:
endpoint:
- “https://dockerpull.org”
- “https://docker.1panel.live”
- “https://dockerproxy.com”
- “https://docker.unsee.tech”
EOF
然后安装k3s
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh |
INSTALL_K3S_MIRROR=cn
INSTALL_K3S_EXEC=“–write-kubeconfig-mode 644”
sh -
网速很慢,耐心等待,安装好之后是这样的
$ k3s -v
k3s version v1.36.4+k3s1 (4dedb15b)
go version go1.26.7
$ kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-54996dc9b4-5vd8f 1/1 Running 4 (20m ago) 8h
kube-system helm-install-traefik-crd-nxfxp 0/1 Completed 0 35m
kube-system helm-install-traefik-h4dk4 0/1 Completed 7 (32m ago) 8h
kube-system local-path-provisioner-77b9867795-nsczj 1/1 Running 0 8h
kube-system metrics-server-6dc596dfb8-pcsrw 1/1 Running 8 (20m ago) 8h
kube-system svclb-traefik-95fc0daf-lrxqd 2/2 Running 0 26m
kube-system traefik-59b7647586-62lcb 1/1 Running 0 26m
这些组件的功能是:
coredns 集群内部 DNS 服务,让 Pod 之间可以通过服务名互相访问
helm-install-traefik-crd Helm Job,负责安装 Traefik 所需的 CRD(自定义资源定义)
helm-install-traefik Helm Job,负责通过 Helm 部署 Traefik Ingress Controller
local-path-provisioner 本地存储控制器,当你创建 PVC 时自动在节点本地分配存储卷
metrics-server 集群资源指标采集器,kubectl top 命令的数据来源
traefik Ingress Controller,HTTP/HTTPS 反向代理,负责将外部流量路由到集群内的服务
svclb-traefik K3s 内置的 Service Load Balancer(Klipper-lb),为 Traefik 提供 LoadBalancer 类型的 Service
2.6 可以禁用一些不重要的组件
编辑 K3s 配置,禁用 traefik 和 metrics-server
sudo tee /etc/rancher/k3s/config.yaml << 'EOF'
disable:
- traefik
- metrics-server
EOF
sudo systemctl restart k3s
$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-54996dc9b4-5vd8f 1/1 Running 8 (10h ago) 19h
local-path-provisioner-77b9867795-nsczj 1/1 Running 1 (10h ago) 19h
2.7 k3s 、containerd装在哪里
$ ls -lh /usr/local/bin
total 76M
lrwxrwxrwx 1 root root 3 Sep 6 23:58 crictl -> k3s
lrwxrwxrwx 1 root root 3 Sep 6 23:58 ctr -> k3s
-rwxr-xr-x 1 root root 76M Sep 6 23:58 k3s
-rwxr-xr-x 1 root root 2.3K Sep 6 23:58 k3s-killall.sh
-rwxr-xr-x 1 root root 2.0K Sep 6 23:58 k3s-uninstall.sh
lrwxrwxrwx 1 root root 3 Sep 6 23:58 kubectl -> k3s
可以看到这些软件都安装到/usr/local/bin目录了
$ ls -l /var/lib/rancher/k3s/data/current/bin/containerd
lrwxrwxrwx 1 root root 3 Sep 6 23:59 /var/lib/rancher/k3s/data/current/bin/containerd -> k3s
可以看到containerd被编译到k3s中了,就像busybox一样,一个软件包含了很多个软件的功能
另外,k3s进程中还把Flannel (CNI)编译进去了,用以支持Pod 网络,给每个 Pod 分配 IP,实现 Pod 间通信
** 最后,看一下k3s这个文件,可以看到k3s是一个静态编译的可执行文件,不依赖其它so文件 **
$ ldd /usr/local/bin/k3s
not a dynamic executable
$ file /usr/local/bin/k3s
/usr/local/bin/k3s: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=6aycnyA_71ISj3_HJg7o/GpHAbw4ulNCCLvqe0SzK/2d5drffqdmr2MyNyq333/9XA--GyeOCo6NXKtBBnD, BuildID[sha1]=4182bc65bce33c39f1b377bf54d95fc2fcda29ee, stripped
2.8 启动一个pod,并验证dns功能
kubectl run dns-test --image=busybox:1.36 --restart=Never – sleep 3600
kubectl exec -it dns-test – sh
/bin # nslookup www.zzz.com.cn
Server: 10.43.0.10
Address: 10.43.0.10:53
www.zzz.com.cn canonical name = www.dtc.zzz.com.cn
www.zzz.com.cn canonical name = www.dtc.zzz.com.cn
Name: www.dtc.zzz.com.cn
Address: 10.40.13.26
/bin # nslookup kubernetes
Server: 10.43.0.10
Address: 10.43.0.10:53
** server can’t find kubernetes.svc.cluster.local: NXDOMAIN
Name: kubernetes.default.svc.cluster.local
Address: 10.43.0.1
** server can’t find kubernetes.cluster.local: NXDOMAIN
** server can’t find kubernetes.svc.cluster.local: NXDOMAIN
** server can’t find kubernetes.cluster.local: NXDOMAIN
2.9 kubectl命令很慢,因为qenu是纯指令模拟,tls握手很慢
$ time kubectl get pod
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 0 42s
real 0m2.433s
user 0m2.265s
sys 0m0.879s
# 使用kube proxy 跳过tls的测试
$ kubectl proxy &
$ time curl -s http://localhost:8001/api/v1/pods | head -n 20
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"resourceVersion": "29486"
},
"items": [
{
"metadata": {
"name": "dns-test",
"namespace": "default",
"uid": "135ef2b7-590d-4db8-a98b-4bb3b058732c",
"resourceVersion": "29366",
"generation": 1,
"creationTimestamp": "2026-09-07T10:46:24Z",
"labels": {
"run": "dns-test"
},
"managedFields": [
{
real 0m0.662s
user 0m0.307s
sys 0m0.172s
另外,查看镜像
$ time sudo crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/library/busybox 1.36 b116e15507444 2.22MB
docker.io/rancher/klipper-helm v0.13.3-build20260727 8e0d8d2218ec8 74.2MB
docker.io/rancher/klipper-lb v0.4.17 eaa1212a2b456 5.28MB
docker.io/rancher/local-path-provisioner v0.0.37 683316f41426e 15.1MB
docker.io/rancher/mirrored-coredns-coredns 1.14.6 520212b8b0fcd 23.8MB
docker.io/rancher/mirrored-library-traefik 3.7.8 7a652b1846f78 54.5MB
docker.io/rancher/mirrored-metrics-server v0.9.0 d7b01abacd67f 23.3MB
docker.io/rancher/mirrored-pause 3.10.2 4a83b15d3ecfe 321kB
real 0m3.558s
user 0m0.439s
sys 0m0.268s
3、离线安装k3s
“笨办法”部署 K3s,通常指的就是在目标节点没有网络连接,或你希望完全掌控部署过程的离线部署(Airgap Installation)。这种方法“笨”在每一步都需要手动操作,但能让你对集群的组成有最清晰的理解。
核心思路很简单:在有网的地方准备好所有“零件”,然后搬到没网的服务器上“组装”起来。整个过程可以分为三步:
📦 第一步:在有网的环境下准备“零件”
你需要在一台能访问互联网的机器上,准备好所有安装文件。
- 获取核心文件:从 K3s 的 GitHub Release 页面(https://github.com/k3s-io/k3s/releases)下载与你想安装版本对应的两个文件 :
- K3s 二进制文件 (
k3s):这是 K3s 本身的可执行程序。 - 离线镜像压缩包 (
k3s-airgap-images-amd64.tar.gz):这个文件包含了运行 K3s 所需的所有容器镜像。注意根据你服务器的 CPU 架构(如amd64,arm64)选择正确的版本 。
- K3s 二进制文件 (
- 获取安装脚本:下载官方的安装脚本
install.sh。你可以通过以下命令在本地保存一份 :
如果你在中国大陆,可以使用国内镜像源以获得更快的下载速度 :curl -sfL https://get.k3s.io -o install.shcurl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh -o install.sh - 打包传输:将下载好的
k3s二进制文件、k3s-airgap-images-amd64.tar.gz和install.sh脚本通过 U 盘、SCP 命令或其他任何方式,一并复制到你的离线目标服务器上。
🚀 第二步:在离线服务器上“组装”安装
登录到你的离线服务器,开始进行手动配置。
- 安置二进制文件:
- 将
k3s二进制文件移动到系统的程序目录,并赋予执行权限 :sudo cp k3s /usr/local/bin/ sudo chmod +x /usr/local/bin/k3s
- 将
- 导入容器镜像:
- 创建 K3s 专用的镜像目录,然后将下载好的离线镜像包放进去 :
sudo mkdir -p /var/lib/rancher/k3s/agent/images/ sudo cp ./k3s-airgap-images-*.tar /var/lib/rancher/k3s/agent/images/
- 创建 K3s 专用的镜像目录,然后将下载好的离线镜像包放进去 :
- 运行安装脚本:
- 执行安装脚本,但需要使用
INSTALL_K3S_SKIP_DOWNLOAD=true这个关键参数,告诉脚本“不要从网上下载任何东西,就用当前目录下我准备好的文件” 。 - 安装 Server 节点(控制平面):
安装成功后,你可以看到节点的状态信息。节点的 Token 位于sudo INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh/var/lib/rancher/k3s/server/node-token,这个稍后添加 Agent 节点时会用到 。 - 安装 Agent 节点(工作节点):
在其他的工作节点上,同样执行前两步(放置二进制和镜像),然后使用 Server 节点的地址和 Token 进行注册 :# 将 <SERVER_IP> 替换为你的Server节点IP,<YOUR_TOKEN> 替换为实际的Token值 sudo INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://<SERVER_IP>:6443 K3S_TOKEN=<YOUR_TOKEN> ./install.sh
- 执行安装脚本,但需要使用
✅ 第三步:验证安装结果
在所有节点上安装完成后,回到你的 Server 节点,执行以下命令来查看集群状态 :
kubectl get nodes
如果一切顺利,你会看到所有节点都处于 Ready 状态,一个属于你的离线 K3s 集群就部署成功了。
💡 一些补充的“笨”办法
- 使用配置文件:如果想指定更多参数(如 Pod 网段、禁用默认的 Traefik 等),可以提前在
/etc/rancher/k3s/config.yaml创建配置文件,然后再运行安装脚本 。 - 使用私有镜像仓库:如果节点很多,手动在每个节点导入镜像会比较繁琐。更高效的方法是搭建一个私有的镜像仓库,将镜像推送到仓库中,然后配置 K3s 从该私有仓库拉取镜像 。
- 升级也是“笨”办法:日后需要升级时,重复一遍上面的步骤即可:下载新版本的二进制和镜像包,替换旧文件,重新运行安装脚本,最后重启 K3s 服务 。
。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)