ubuntu虚拟机安装k3s集群

k3s 介绍

k3s 是经 CNCF 一致性认证的 Kubernetes 发行版,专为物联网及边缘计算设计。

K3s 官网:https://k3s.io/
中文网站:https://www.rancher.cn/k3s/

k3s 功能介绍:K3s - 轻量级 Kubernetes | Rancher文档

k3s 架构介绍:架构介绍 | Rancher文档

k3s 的版本号命名采用 +k3s 的格式,比如 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 命令的机器。

ubuntu虚拟机安装k3s集群_第1张图片

如上图,该集群有一个内嵌 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

    • 下载:https://www.vagrantup.com/downloads
  3. 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路径

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

  • 离线镜像: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 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

你可能感兴趣的:(容器,kubernetes,容器)