ubuntu虚拟机安装k3s集群

本文详述了在Ubuntu虚拟机中安装k3s集群的步骤,包括环境准备、离线安装K3s、单节点及多节点安装、集群访问以及卸载流程。适用于内存至少1GB的环境,使用Virtual Box和Vagrant进行虚拟机管理和部署。

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 资源。

安装虚拟机环境

  1. 安装虚拟机软件 Virtual Box

    • 下载:https://www.virtualbox.org/wiki/Downloads
    • 修改虚拟机路径 [可选]:启动 VirtualBox 程序,管理 → 全局设定(Ctrl+G) → 常规 → 默认虚拟电脑位置(M),改为自定义路径。
  2. 安装虚拟机管理工具 Vagrant

  3. Vagrant 添加操作系统 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 可以登出虚拟机,回到宿主机。

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 版本下载地址:

在宿主机操作:

# 将下载的文件上传到每个节点的 ./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 644K3S_KUBECONFIG_MODE="644":修改配置文件权限为非所有者也可读,使 kubectl 命令无需 rootsudo
  • --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

myservermynodetoken,需替换为 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值