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)。这种方法“笨”在每一步都需要手动操作,但能让你对集群的组成有最清晰的理解。

核心思路很简单:在有网的地方准备好所有“零件”,然后搬到没网的服务器上“组装”起来。整个过程可以分为三步:

📦 第一步:在有网的环境下准备“零件”

你需要在一台能访问互联网的机器上,准备好所有安装文件。

  1. 获取核心文件:从 K3s 的 GitHub Release 页面(https://github.com/k3s-io/k3s/releases)下载与你想安装版本对应的两个文件 :
    • K3s 二进制文件 (k3s):这是 K3s 本身的可执行程序。
    • 离线镜像压缩包 (k3s-airgap-images-amd64.tar.gz):这个文件包含了运行 K3s 所需的所有容器镜像。注意根据你服务器的 CPU 架构(如 amd64, arm64)选择正确的版本 。
  2. 获取安装脚本:下载官方的安装脚本 install.sh。你可以通过以下命令在本地保存一份 :
    curl -sfL https://get.k3s.io -o install.sh
    
    如果你在中国大陆,可以使用国内镜像源以获得更快的下载速度 :
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh -o install.sh
    
  3. 打包传输:将下载好的 k3s 二进制文件、k3s-airgap-images-amd64.tar.gzinstall.sh 脚本通过 U 盘、SCP 命令或其他任何方式,一并复制到你的离线目标服务器上。

🚀 第二步:在离线服务器上“组装”安装

登录到你的离线服务器,开始进行手动配置。

  1. 安置二进制文件
    • k3s 二进制文件移动到系统的程序目录,并赋予执行权限 :
      sudo cp k3s /usr/local/bin/
      sudo chmod +x /usr/local/bin/k3s
      
  2. 导入容器镜像
    • 创建 K3s 专用的镜像目录,然后将下载好的离线镜像包放进去 :
      sudo mkdir -p /var/lib/rancher/k3s/agent/images/
      sudo cp ./k3s-airgap-images-*.tar /var/lib/rancher/k3s/agent/images/
      
  3. 运行安装脚本
    • 执行安装脚本,但需要使用 INSTALL_K3S_SKIP_DOWNLOAD=true 这个关键参数,告诉脚本“不要从网上下载任何东西,就用当前目录下我准备好的文件” 。
    • 安装 Server 节点(控制平面)
      sudo INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
      
      安装成功后,你可以看到节点的状态信息。节点的 Token 位于 /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 服务 。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐