k3s 是经 CNCF 一致性认证的 Kubernetes 发行版,专为物联网及边缘计算设计。
K3s 官网:https://k3s.io/
中文网站:https://www.rancher.cn/k3s/
k3s 功能介绍:K3s - 轻量级 Kubernetes | Rancher文档
k3s 架构介绍:架构介绍 | Rancher文档
k3s 的版本号命名采用
的格式,比如 v1.22.7+k3s1 对应的 Kubernetes 1.22.7 版本。
本文操作环境:
server 是运行 k3s server
命令的机器(裸机或虚拟机),而 worker 节点是运行 k3s agent
命令的机器。
如上图,该集群有一个内嵌 SQLite 数据库的单节点 K3s server。
每个 agent 节点都注册到同一个 server 节点。K3s 用户可以通过调用 server 节点上的 K3s API 来操作 Kubernetes 资源。
安装虚拟机软件 Virtual Box
安装虚拟机管理工具 Vagrant
Vagrant 添加操作系统 box 镜像
setx VAGRANT_HOME "/your/path"
vagrant box add generic/ubuntu2004 下载的box路径
vagrant 详细使用说明可参考:vagrant 搭建 CentOS 7 虚拟机开发环境-CSDN博客
新建项目目录,如 k3s_study:
$ mkidr k3s_study
$ cd k3s_study
# 创建 Vagrantfile 文件
$ touch Vagrantfile
编辑 Vagrantfile:
# 要使用的 box
IMAGE_NAME = "generic/ubuntu2004"
# server 节点
HOST_NAME = "k3s-s01"
# worker 节点数
N = 2
Vagrant.configure("2") do |config|
# up 时不检查box的更新
config.vm.box_check_update = false
# 配置 server 节点
config.vm.define HOST_NAME do |master|
master.vm.box = IMAGE_NAME
# 网络: 私有网络,配置IP地址
master.vm.network "private_network", ip: "192.168.3.30"
# 主机名
master.vm.hostname = HOST_NAME
# 配置 2核CPU 1.5G内存
master.vm.provider "virtualbox" do |v|
v.name = HOST_NAME
v.memory = 1536
v.cpus = 2
end
end
# 配置 worker 节点
(1..N).each do |i|
config.vm.define "k3s-node-#{i}" do |node|
node.vm.box = IMAGE_NAME
# 网络: 私有网络,IP地址需要与server节点同一个网段
node.vm.network "private_network", ip: "192.168.3.#{i + 30}"
node.vm.hostname = "k3s-node-#{i}"
node.vm.provider "virtualbox" do |v|
v.name = "k3s-node-#{i}"
v.memory = 1536
v.cpus = 2
end
end
end
end
启动虚拟机:
$ vagrant up
等待 3 台虚拟机启动成功后,查看状态:
$ vagrant status
Current machine states:
k3s-s01 running (virtualbox) # 192.168.3.30
k3s-node-1 running (virtualbox) # 192.168.3.31
k3s-node-2 running (virtualbox) # 192.168.3.32
开3个终端,分别用 ssh 登录每个节点:
# 在项目根目录 k3s_study 下使用 vagrant ssh
$ vagrant ssh k3s-s01
$ vagrant ssh k3s-node-1
$ vagrant ssh k3s-node-2
CTRL
+D
可以登出虚拟机,回到宿主机。
# 查看内核版本
$ uname -rs
Linux 5.4.0-90-generic
# 查看系统版本
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
关闭 swap 交换分区
# 临时关闭,重启后会恢复
$ swapoff -a
# 永久关闭,注释掉swap行
$ sed -ri 's/.*swap.*/#&/' /etc/fstab
原因:当内存不足时,linux 会自动使用 swap,将部分内存数据存放到磁盘中,这样会使性能下降,为了性能考虑推荐关掉。
(可选)设置系统时区:
$ sudo timedatectl set-timezone Asia/Shanghai
# 查看时区
$ timedatectl status
# Time zone: Asia/Shanghai (CST, +0800)
启用时间同步:
# 激活 timesyncd
$ sudo timedatectl set-ntp on
# 查看同步状态
$ systemctl status systemd-timesyncd
# ● systemd-timesyncd.service - Network Time Synchronization
# Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)
# Active: active (running)
# 按 q 退出查看
参考:离线安装 | Rancher文档
下载地址:https://github.com/k3s-io/k3s/releases
页面右上角搜索需要的版本,下载以下文件:
如果下载速度较慢,推荐使用迅雷等工具下载。
本文使用的 v1.22.7+k3s1 版本下载地址:
在宿主机操作:
# 将下载的文件上传到每个节点的 ./k3s/
# 下面的路径需换为你下载的文件路径
vagrant upload d:/temp/k3s-airgap-images-amd64.tar.gz ./k3s/ k3s-s01
vagrant upload d:/temp/k3s-airgap-images-amd64.tar.gz ./k3s/ k3s-node-1
vagrant upload d:/temp/k3s-airgap-images-amd64.tar.gz ./k3s/ k3s-node-2
vagrant upload d:/temp/k3s ./k3s/ k3s-s01
vagrant upload d:/temp/k3s ./k3s/ k3s-node-1
vagrant upload d:/temp/k3s ./k3s/ k3s-node-2
在每个节点操作:
cd k3s
# 解压文件
gzip -d k3s-airgap-images-amd64.tar.gz
# 将 tar 文件放到 images 目录下
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp ./k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
# 将二进制文件放在每个节点的 /usr/local/bin 中
sudo cp k3s /usr/local/bin
# 授予可执行权限
sudo chmod +x /usr/local/bin/k3s
# 下载 K3s 安装脚本,并命名为 install_k3s.sh
wget -c -O install_k3s.sh https://get.k3s.io
# 授予可执行权限
chmod +x ./install_k3s.sh
在启动 K3s 时,会检查 images 是否存在可用的镜像压缩包,如果存在,就将该镜像导入到containerd 镜像列表中。
注:此步骤非必须项。
在宿主机创建虚拟机快照,方便后面安装失败时还原:
# 同时备份3台虚拟机,快照命名为 before_install_k3s
$ vagrant snapshot save before_install_k3s
# 也可在save后指定需要备份的主机
# vagrant snapshot save k3s-s01 before_install_k3s
# 查看快照列表
$ vagrant snapshot list
==> k3s-s01:
before_install_k3s
==> k3s-node-1:
before_install_k3s
==> k3s-node-2:
before_install_k3s
如需恢复到快照状态,使用:
# 指定恢复k3s-s01节点到快照before_install_k3s状态
$ vagrant snapshot restore k3s-s01 before_install_k3s
要在单个服务器上安装 K3s,只需在 server 节点上执行以下操作:
# 在k3s-s01执行
# --advertise-address 需替换为server节点配置的IP
$ INSTALL_K3S_SKIP_DOWNLOAD=true K3S_KUBECONFIG_MODE="644" INSTALL_K3S_EXEC="--advertise-address 192.168.3.30" ./install_k3s.sh
# [INFO] Skipping k3s download and verify
# [INFO] Skipping installation of SELinux RPM
# [INFO] Creating /usr/local/bin/kubectl symlink to k3s
# [INFO] Creating /usr/local/bin/crictl symlink to k3s
# [INFO] Creating /usr/local/bin/ctr symlink to k3s
# [INFO] Creating killall script /usr/local/bin/k3s-killall.sh
# [INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
# [INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
# [INFO] systemd: Creating service file /etc/systemd/system/k3s.service
# [INFO] systemd: Enabling k3s unit
# Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → # /etc/systemd/system/k3s.service.
# [INFO] systemd: Starting k3s
启动参数:
INSTALL_K3S_SKIP_DOWNLOAD=true
:跳过下载可执行文件。--write-kubeconfig-mode 644
,K3S_KUBECONFIG_MODE="644"
:修改配置文件权限为非所有者也可读,使 kubectl
命令无需 root
或 sudo
。--advertise-address IP
:apiserver 用来向集群成员发布的 IP 地址,多网卡环境需指定通信网卡 IP。INSTALL_K3S_EXEC="..."
:启动服务时使用的额外参数。如:"–advertise-address 192.168.3.30"--docker
,使用 docker 而不是默认的 containerd。本文使用默认的 containerd。更多参数,见 K3s Server 配置参考 | Rancher文档
查看集群状态:
$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:6443
CoreDNS is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://127.0.0.1:6443/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
当集群状态全部 running
后,查看节点状态:
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3s-s01 Ready control-plane,master 37s v1.22.7+k3s1 10.0.2.15 <none> Ubuntu 20.04.3 LTS 5.4.0-90-generic containerd://1.5.9-k3s1
查看添加 worker 节点使用的 token:
$ sudo cat /var/lib/rancher/k3s/server/node-token
# K10e903b153e357f6de73205841342678d142f2df0c2f46d7a3205350a214329d1d::server:078...950
默认情况下,k3s 启动的 server 节点也同时具有 worker 角色,是可调度的,因此可以在它们上启动工作。
在每个 worker 节点上执行:
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken INSTALL_K3S_EXEC="--node-ip IP" ./install_k3s.sh
myserver
,mynodetoken
,需替换为 server 节点的值。IP
需替换为当前 worker 节点的 IP。
# 在 k3s-node-1 执行:
$ INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://192.168.3.30:6443 K3S_TOKEN=K10...d1d::server:078...950 INSTALL_K3S_EXEC="--node-ip 192.168.3.31" ./install_k3s.sh
# 在 k3s-node-2 执行:
$ INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://192.168.3.30:6443 K3S_TOKEN=K10...d1d::server:078...950 INSTALL_K3S_EXEC="--node-ip 192.168.3.32" ./install_k3s.sh
# [INFO] Skipping k3s download and verify
# [INFO] Skipping installation of SELinux RPM
# [INFO] Creating /usr/local/bin/kubectl symlink to k3s
# [INFO] Creating /usr/local/bin/crictl symlink to k3s
# [INFO] Creating /usr/local/bin/ctr symlink to k3s
# [INFO] Creating killall script /usr/local/bin/k3s-killall.sh
# [INFO] Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
# [INFO] env: Creating environment file /etc/systemd/system/k3s-agent.service.env
# [INFO] systemd: Creating service file /etc/systemd/system/k3s-agent.service
# [INFO] systemd: Enabling k3s-agent unit
# Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
# [INFO] systemd: Starting k3s-agent
myserver
:server 的 IP 或有效的 DNS;mynodetoken
:server 节点的 token,通常在 /var/lib/rancher/k3s/server/node-token
。--node-ip
:worker 节点发布的 IP;多网卡环境需指定。查看节点状态,看是否有报错:
$ sudo systemctl status k3s-agent
存储在 /etc/rancher/k3s/k3s.yaml
的 kubeconfig 文件用于对 Kubernetes 集群的访问。
设置 kubectl 使用的上下文环境变量:
$ export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
查看节点状态:
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3s-node-1 Ready <none> 8m58s v1.22.7+k3s1 192.168.3.31 <none> Ubuntu 20.04.3 LTS 5.4.0-90-generic containerd://1.5.9-k3s1
k3s-node-2 Ready <none> 3m33s v1.22.7+k3s1 192.168.3.32 <none> Ubuntu 20.04.3 LTS 5.4.0-90-generic containerd://1.5.9-k3s1
k3s-s01 Ready control-plane,master 16m v1.22.7+k3s1 10.0.2.15 <none> Ubuntu 20.04.3 LTS 5.4.0-90-generic containerd://1.5.9-k3s1
可以看到 k3s-node-1 和 k3s-node-2 节点为 Ready
状态。
查看所有对象:
$ kubectl get all -A
# ----------------------
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/coredns-96cc4f57d-zldh9 1/1 Running 0 14m
kube-system pod/local-path-provisioner-84bb864455-88sdj 1/1 Running 0 14m
kube-system pod/metrics-server-ff9dbcb6c-2h92d 1/1 Running 0 14m
kube-system pod/helm-install-traefik-crd--1-bxblt 0/1 Completed 0 14m
kube-system pod/helm-install-traefik--1-5d25g 0/1 Completed 2 14m
kube-system pod/svclb-traefik-7z5nf 2/2 Running 0 13m
kube-system pod/traefik-56c4b88c4b-58kmv 1/1 Running 0 13m
kube-system pod/svclb-traefik-j5b8f 2/2 Running 0 7m1s
kube-system pod/svclb-traefik-8s68h 2/2 Running 0 97s
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 14m
kube-system service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 14m
kube-system service/metrics-server ClusterIP 10.43.95.28 <none> 443/TCP 14m
kube-system service/traefik LoadBalancer 10.43.32.206 10.0.2.15,192.168.3.31,192.168.3.32 80:31801/TCP,443:31782/TCP 13m
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/svclb-traefik 3 3 3 3 3 <none> 13m
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system deployment.apps/local-path-provisioner 1/1 1 1 14m
kube-system deployment.apps/coredns 1/1 1 1 14m
kube-system deployment.apps/metrics-server 1/1 1 1 14m
kube-system deployment.apps/traefik 1/1 1 1 13m
NAMESPACE NAME DESIRED CURRENT READY AGE
kube-system replicaset.apps/coredns-96cc4f57d 1 1 1 14m
kube-system replicaset.apps/local-path-provisioner-84bb864455 1 1 1 14m
kube-system replicaset.apps/metrics-server-ff9dbcb6c 1 1 1 14m
kube-system replicaset.apps/traefik-56c4b88c4b 1 1 1 13m
NAMESPACE NAME COMPLETIONS DURATION AGE
kube-system job.batch/helm-install-traefik-crd 1/1 44s 14m
kube-system job.batch/helm-install-traefik 1/1 65s 14m
详见:k8s-安装仪表盘Dashboard笔记-CSDN博客
将 /etc/rancher/k3s/k3s.yaml
复制到集群外部的计算机上的 ~/.kube/config
。然后用你的 K3s 服务器的 IP 或名称替换 “localhost”。
就可以用外部安装的 kubectl
管理 K3s 集群。
重启 k3s 服务
# 手动重启 k3s server
$ sudo systemctl restart k3s
# 手动重启 k3s agent
$ sudo systemctl restart k3s-agent
server 节点
sudo /usr/local/bin/k3s-uninstall.sh
worker 节点
sudo /usr/local/bin/k3s-agent-uninstall.sh