k3s 介绍
k3s 是经 CNCF 一致性认证 Kubernetes 发行版,专为物联网及边缘计算设计。
K3s 官网:https://k3s.io/ 中文网站:https://www.rancher.cn/k3s/
k3s 功能介绍:K3s - 轻量级 Kubernetes | Rancher文档
k3s 结构介绍:结构介绍 | Rancher文档
k3s 版本号命名采用 <K8s version> k3s<number>
例如,格式 v1.22.7 k3s1 对应的 Kubernetes 1.22.7 版本。
环境准备
操作环境:
- 操作系统:Windows 10
- 虚拟机:Virtual Box 6.1.30 r148432
- Linux 发行版:Ubuntu Focal 20.04 (LTS)
- Linux 内核:5.4.0-90-generic
- 虚拟机工具:Vagrant 2.2.19
- 可用内存: 最低 512MB(建议至少 1GB)
k3s 集群方案
- 单节点架构:server × 1 worker × 2
- K3s 版本:v1.22.7 k3s1
server 是运行 k3s server
命令机(裸机或虚拟机), worker 节点是运行 k3s agent
命令机。
如上图所示,该集群有一个嵌入式集群 SQLite 单节点数据库 K3s server。
每个 agent 在同一个节点注册 server 节点。K3s 用户可以调用 server 节点上的 K3s API 来操作 Kubernetes 资源。
安装虚拟机环境
-
安装虚拟机软件 Virtual Box
-
安装虚拟机管理工具 Vagrant
- 下载:https://www.vagrantup.com/downloads
-
Vagrant 添加操作系统 box 镜像
- box 下载:https://app.vagrantup.com/generic/boxes/ubuntu2004
- currently released version:v3.5.4
- 修改镜像默认安装路径 [可选]:
setx VAGRANT_HOME "/your/path"
- 添加到 box 列表:
vagrant box add generic/ubuntu2004 下载的box路径
- box 下载:https://app.vagrantup.com/generic/boxes/ubuntu2004
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内存 maser.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
可以登出虚拟机,回到宿主机。
Ubuntu 配置
# 查看内核版本
$ 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 退出查看
离线安装 K3s
参考:离线安装 | Rancher文档
下载安装文件
下载地址:https://github.com/k3s-io/k3s/releases
页面右上角搜索需要的版本,下载以下文件:
- 离线镜像:k3s-airgap-images-amd64.tar.gz
- 二进制文件:k3s
如果下载速度较慢,推荐使用迅雷等工具下载。
本文使用的 v1.22.7+k3s1 版本下载地址:
- 离线镜像:https://github.com/k3s-io/k3s/releases/download/v1.22.7%2Bk3s1/k3s-airgap-images-amd64.tar.gz
- 二进制文件:https://github.com/k3s-io/k3s/releases/download/v1.22.7%2Bk3s1/k3s
在宿主机操作:
# 将下载的文件上传到每个节点的 ./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
单节点安装
安装 server 节点
要在单个服务器上安装 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 节点
在每个 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
安装仪表盘 Dashboard
详见: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
卸载 K3s
server 节点
sudo /usr/local/bin/k3s-uninstall.sh
worker 节点
sudo /usr/local/bin/k3s-agent-uninstall.sh