[Tutorials] 【进阶教程】使用统信服务器操作系统 V20 搭建双节点 K3s 集群
Tofloor
poster avatar
donaldsebleung
deepin
2023-06-05 20:11
Author

本教程将简单介绍 统信服务器操作系统 V20K3s 并演示如何透过两者轻松搭建生产规格的 Kubernetes(俗称 K8s)集群

教程对象

动手意愿强,熟悉 Linux 、容器技术原理与应用,对云技术有兴趣的坛友们

容器技术介绍可参考我前期的文章:Podman 及容器技术介绍

此后假设您对 K8s 已有基本的认知,K8s 初学者可参考以下资源自行学习:

硬件与系统需求

您的电脑必须有 256G 以上的存储空间、8G 或以上内存、建议 16G 或以上内存

操作系统不限;本教程所有操作在 统信 UOS 家庭版 22.0 上通过验证(未启用开发者模式),但在 deepin 20 、deepin 23 甚至在 Windows 上也应该能如常操作

产品介绍

统信服务器操作系统 V20

统信服务器操作系统 V20 是 deepin 团队母公司 统信软件 针对 B 端市场发布的基于 Linux 内核开发的自主可控服务器操作系统,其特点包括:

  • 默认采用 DDE 桌面环境,外观上与 deepin、UOS 桌面版(即家庭版+专业版)相似;
  • 是基于华为 openEuler 开发的下游 Linux 发行版,同属红帽系;与 deepin、UOS 桌面版不同,采用 RPM 包而非 deb 包、dnf 包管理器而非 apt 包管理器;
  • 统信软件对外永久开放免费使用授权,需要售后服务的客户可自行购买许可证激活系统

K3s

K3s 是德国 SUSE 公司于 2020 年捐赠给 云原生计算基金会 (CNCF) 的轻量 K8s 发行版,其特点包括:

  • K3s 与上游 K8s 完全兼容
  • 其名称 K3s 源自于 Kubernetes 常见的缩写 K8s,K+3+s 刚好 5 个字母,是 K8s 长度的一半,凸显其轻量性;K3s 并没有官方的全写名称;
  • K3s 自带一般 K8s 集群所需的组件如 CRI、CNI、Ingress,省去用户逐一选择配置相关组件的烦恼;
  • K3s 把所有核心 K8s 组件结合成单一程序,大大简化运行、升级、维护 K8s 集群的过程,用户只需运行一个命令即可;
  • K8s 的 master 节点在 K3s 上亦名 server,worker 节点亦名 agent;
  • K3s 默认配置允许 server 运行控制平面以外的 APP Pod,适合创建单节点集群;
  • K3s 资源消耗非常低,每个节点一般 1、2G 内存(甚至更少)就能运行,故 K3s 适用于 IoT 、个人技术爱好者的应用场景;
  • 相比仅适合教学用途的 Minikubekind K8s 发行版,K3s 可直接部署于生产环境

实战环节

我们在实战环节中将在 VirtualBox 中创建一个双节点 K3s 集群,一共 1 个 server 、1 个 agent ,也会另外再创建一台服务器作为 kubectl 客户端供连接、操作集群使用,一共 3 台虚拟机,详情如下:

虚拟机名称 主机名称 用途 NAT 网络 IP 地址
cube-control cube-control.cluster.local kubectl 客户端 10.0.2.12
server0 server0.cluster.local K3s server 10.0.2.13
agent0 agent0.cluster.local K3s agent 10.0.2.14

您的虚拟机 NAT 网络 IP 地址或许不同,请根据实际情况调整 IP 操作,不要盲目复制黏贴教程里所示的命令

三台虚拟机同在一个虚拟网络,采用 VirtualBox 的 NAT Network 模式,稍后会有仔细的操作说明

至于为何创建 cube-control 虚拟机安装 kubectl 客户端操作集群而不直接在宿主上操作,主要有两个原因:

  • VirtualBox 的 NAT Network 模式下宿主无法直接访问虚拟网络,透过 cube-control 虚拟机访问集群两个节点可减省配置 NAT 端口转发的需求;
  • 透过 cube-control 虚拟机安装运行 kubectl 客户端可绕过统信 UOS 家庭版 22.0 未启用开发者模式下禁止运行第三方程序的问题

VirtualBox NAT 网络配置

创建虚拟机前首先创建 NAT 网络,具体操作如下:

首先点选 "工具 > 网络",如下图:

截图_VirtualBox Manager_20230604193905.png

选择 "NAT Networks > 创建":

截图_VirtualBox Manager_20230604194102.png

创建后如下图:

截图_VirtualBox Manager_20230604194325.png

创建虚拟机

创建 cube-control、server0、agent0 三台虚拟机过程一致,只需要适当修改 VirtualBox 虚拟机名称、安装操作系统时修改主机名称以及安装后把每台虚拟机的 IP 地址作记录即可;这里就以 cube-control 虚拟机为例吧

相信大家都熟悉 VirtualBox 虚拟机安装过程,这里就只列出注意事项了

首先,新建虚拟机的首页记住勾选 "Skip unattended installation":

截图_VirtualBox_20230604204725.png

然后配置选择 1 vCPU、2G (= 2048 MB) 内存,如果宿主有 16G 以上内存则可选择把 server0、agent0 两个节点升级为 4G(= 4096 MB)以上内存

接着虚拟机存储 server0、agent0 两个节点建议分配 32G 以上,cube-control 客户端则 16G 应该足够

创建虚拟机后到虚拟机的 "设置 > 网络 > 网卡 1" 点选 "NAT 网络" 连接方式及刚才创建的 NAT 网络,再点 "OK" 保存:

截图_VirtualBox Manager_20230604205410.png

截图_VirtualBox_20230604205427.png

接着启动虚拟机安装操作系统,需要注意的事项如下:

首先在 "系统" 栏下点选 "安装目的地 (D)",接受默认值并按 "完成" 即可:

截图_VirtualBox Machine_20230604210357.png

截图_VirtualBox Machine_20230604210410.png

接着点选 "网络和主机名 (N)",分别为 cube-control、server0、agent0 虚拟机设置相应的主机名称,点选 "应用" 后再点选 "完成":

截图_VirtualBox Machine_20230604210913.png

截图_VirtualBox Machine_20230604210932.png

然后点选 "软件选择 (S)" 进行配置,选择 "最小安装" 后点 "完成":

截图_VirtualBox Machine_20230604211528.png

截图_VirtualBox Machine_20230604211539.png

之后鼠标往下滚动,选择 "创建用户 (U)",创建一个名为 uos 的管理员账户,设置好密码后点 "完成":

截图_VirtualBox Machine_20230604211919.png

截图_VirtualBox Machine_20230604211958.png

现在所有安装配置弄好了,可以点 "开始安装 (B)":

截图_VirtualBox Machine_20230604212014.png

稍等片刻,看到 "完成!" 后点 "重启系统 (R)":

截图_VirtualBox Machine_20230604212640.png

重启系统后稍等片刻,然后输入以下字符同意许可协议并退出初始化配置,输入每行字符后回车一下:

2
2
q
yes

示图如下:

截图_VirtualBox Machine_20230604213103.png

之后会显示命令行登录界面,这里输入 uos 用户名及密码后输入 ip addr show 命令查询虚拟机的 IP 地址作记录,然后输入 exit 命令退出:

截图_VirtualBox Machine_20230604213347.png

最后建议关掉虚拟机后以 "无界面启动" 形式再次启动,该启动模式不会弹出虚拟机视窗,能节省宿主资源,让宿主运行更流畅:

截图_VirtualBox Manager_20230604213921.png

现在就 server0、agent0 两个节点把虚拟机安装步骤再重复两遍,这里就不重复展示了

cube-control 初始化配置

宿主上 导出 K3S_CLIENT 变量,请把以下命令的 x.x.x.x 以 cube-control 虚拟机的 IP 地址取代:

# 请把 x.x.x.x 以 cube-control 虚拟机的 IP 地址取代
export K3S_CLIENT="x.x.x.x"

现在 NAT 网络里需要添加端口转发策略供我们 SSH 登录 cube-control 虚拟机,主机端口可选 1122/tcp、虚拟机地址为 cube-control IP 地址,虚拟机端口 22/tcp:

截图_VirtualBox Manager_20230604221806.png

回到 宿主上 的命令行填写 SSH 配置文档,配置如下:

  • 定义一个 cube-control 主机
  • cube-control 主机使用 uos 用户登录
  • cube-control 主机实质为 localhost1122/tcp 端口
mkdir -p "$HOME/.ssh/"
cat >> "$HOME/.ssh/config" << EOF
Host cube-control
        User uos
        HostName localhost
        Port 1122
EOF

倘若您之前没配置过 SSH 密钥,可使用 ssh-keygen 命令生成密钥,重复按回车接受默认选项即可

然后把 SSH 公钥拷到 cube-control 虚拟机上,实现 SSH 免密登录,事后需要重启终端生效:

ssh-copy-id cube-control

重启终端后,输入 ssh 命令登录 cube-control 虚拟机:

ssh cube-control

接着的命令在 cube-control 虚拟机内 执行

安装 Vim 文本编辑器、Bash 自动填写功能:

sudo dnf install --refresh -y vim bash-completion

cube-control 虚拟机内 生成 SSH 密钥,接受默认值即可:

ssh-keygen

接着到 K8s 官网下载安装 1.26.5 版本 kubectl 客户端:

curl -LO https://dl.k8s.io/release/v1.26.5/bin/linux/amd64/kubectl
chmod +x kubectl
mkdir -p "$HOME/.local/bin/"
mv kubectl "$HOME/.local/bin/"

然后到 k3sup GitHub 仓库 下载安装 k3sup 命令行工具,该工具能使我们快速部署 K8s 集群:

wget https://github.com/alexellis/k3sup/releases/download/0.12.12/k3sup
chmod +x k3sup
mv k3sup "$HOME/.local/bin/"

最后创建 $HOME/.kube/ 目录,避免之后可能出现的问题:

mkdir -p "$HOME/.kube/"

cube-control 免密登录 server0 、agent0

使用 k3sup 部署集群前,必须确保所有节点能免密 SSH 登录,而且 SSH 登录的用户必须能免密 sudo 提权

首先在 cube-control 虚拟机上 导出环境变量 K3S_SERVER0K3S_AGENT0 并写到 $HOME/.bashrc 文档里,分别为 server0 、agent0 虚拟机的 IP 地址:

# 把 x.x.x.x 、y.y.y.y 分别取代为 server0 、agent0 IP 地址
echo "export K3S_SERVER0=\"x.x.x.x\"" >> "$HOME/.bashrc"
echo "export K3S_AGENT0=\"y.y.y.y\"" >> "$HOME/.bashrc"
source "$HOME/.bashrc"

然后填写 SSH 配置文档并设置好文档权限:

mkdir -p "$HOME/.ssh/"
cat >> "$HOME/.ssh/config" << EOF
Host server0
        User uos
        HostName ${K3S_SERVER0}
Host agent0
        User uos
        HostName ${K3S_AGENT0}
EOF
chmod 600 "$HOME/.ssh/config"

再分别把 cube-control 的 SSH 公钥拷到 server0 、agent0 上:

ssh-copy-id server0
ssh-copy-id agent0

退出 cube-control 再登录后生效

server0 、agent0 初始化配置

部署 K3s 前需要对每个节点分别进行以下配置:

  • 启用免密 sudo 提权;
  • 禁用 firewalld.service systemd 服务;
  • 导出 INSTALL_K3S_SKIP_SELINUX_RPM=true 环境变量,让 K3s 跳过 SELinux 配置;统信服务器操作系统 V20 上默认禁用 SELinux,而 K3s 若尝试配置 SELinux 只会遇到问题,不会有任何好处

以下将以 server0 作为例子,配置好 server0 后请自行配置 agent0 ;两个节点配置步骤完全一致,故不重复展示

首先在 cube-control 上 SSH 登录 server0

ssh server0

然后透过 visudo 修改 /etc/sudoers 文档:

sudo visudo

寻找以下几行配置:

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

把以上的第二行注释掉,第五行去掉注释,修改后如下:

## Allows people in group wheel to run all commands
# %wheel  ALL=(ALL)       ALL

## Same thing without a password
%wheel        ALL=(ALL)       NOPASSWD: ALL

输入 :wq 回车退出 Vim

退出节点再登录,免密 sudo 提权即时生效

禁用防火墙:

sudo systemctl disable --now firewalld.service

导出 INSTALL_K3S_SKIP_SELINUX_RPM=true 环境变量到 $HOME/.bashrc 中并即时生效:

echo "export INSTALL_K3S_SKIP_SELINUX_RPM=true" >> "$HOME/.bashrc"
source "$HOME/.bashrc"

节点配置完毕,退出节点回到 cube-control 即可:

exit

现在以上操作在 agent0 虚拟机上重复一遍,这里就不重复展示了

调用 k3sup 部署 K3s server 、agent

现在终于可以调用 k3sup 部署我们的 K3s server 、agent 两个节点了

以下操作全部在 cube-control 虚拟机上 执行

首先看看部署 K3s server 的命令:

k3sup install \
    --context hello-k3s \
    --ip "${K3S_SERVER0}" \
    --local-path "$HOME/.kube/config" \
    --merge \
    --user uos

简单解释一下:

  • --context hello-k3s 选项大概可理解成把集群名称设置为 hello-k3s
  • --ip "${K3S_SERVER0}" 选项告诉 k3sup 我们 server0 节点的 IP 地址,k3sup 将自动 SSH 登录 server0 节点进行配置
  • --local-path "$HOME/.kube/config" 选项使 k3supkubectl 客户端用的 KUBECONFIG 配置文档写到 $HOME/.kube/config 路径下
  • --merge 选项让 k3sup 保存原有 KUBECONFIG 配置(如有),并把 hello-k3s 的配置与之合并
  • --user uos 选项让 k3supuos 用户 SSH 登录节点进行相关配置

然后启用 kubectl 的 Bash 自动填充功能,这能大幅提升以后透过 kubectl 操作集群的效率:

echo "source <(kubectl completion bash)" >> "$HOME/.bashrc"
source "$HOME/.bashrc"

现在用 kubectl 命令查看 server 节点状态,应该为 Ready :

kubectl get nodes

输出:

NAME                    STATUS   ROLES                  AGE     VERSION
server0.cluster.local   Ready    control-plane,master   4m14s   v1.26.5+k3s1

再看看部署 K3s agent 的命令:

k3sup join \
    --ip "${K3S_AGENT0}" \
    --server-ip "${K3S_SERVER0}" \
    --user uos

这里选项比部署 server 要简单一点,只需提供节点 IP、server IP 及 SSH 登录用户即可

再用 kubectl 查看节点状态,现在应该有两个节点,状态均为 Ready :

kubectl get nodes

输出:

NAME                    STATUS   ROLES                  AGE     VERSION
server0.cluster.local   Ready    control-plane,master   8m56s   v1.26.5+k3s1
agent0.cluster.local    Ready                     50s     v1.26.5+k3s1

在集群上部署 NGINX APP

创建一个 nginx Deployment ,使用 2 个 Pod 实例实现高可用,并透过 Service 把 nginx Deployment 暴露到 8080/tcp 端口:

kubectl create deployment nginx --image=nginx --replicas=2 --port=80
kubectl expose deployment nginx --type=LoadBalancer --port=8080 --target-port=80

查看我们的 Deployment ,应该有 2/2 个实例状态均为 Ready :

kubectl get deployments

输出:

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   2/2     2            2           7m18s

倘若这时出现问题,例如 1/2 实例为 Ready 状态,可以尝试重启每个节点等会儿再试

查看我们的 Service ,看看 nginx Service 的负载均衡 EXTERNAL-IP IP 地址,应该为两个节点的 IP 地址:

kubectl get services

输出:

NAME         TYPE           CLUSTER-IP   EXTERNAL-IP           PORT(S)          AGE
kubernetes   ClusterIP      10.43.0.1                    443/TCP          22m
nginx        LoadBalancer   10.43.67.4   10.0.2.13,10.0.2.14   8080:30914/TCP   9m28s

现在回到 VirtualBox 的 NAT 网络配置,添加一个端口转发策略:

  • 策略名称 NGINX
  • 协议 TCP
  • 主机端口 8080
  • 虚拟机 IP 填写 server0 或者 agent0 的 IP 地址,任何一个都行
  • 虚拟机端口 8080

详情如下图所示:

截图_VirtualBox Manager_20230605115430.png

接着到宿主浏览器上输入 http://localhost:8080/ 地址回车,若成功则能看到 NGINX 网页:

截图_org.deepin.browser_20230605115455.png

结语

统信服务器操作系统 V20 是一个高性能、安全、可靠、自主可控的红帽系 Linux 发行版,适用于本地或云端生产环境上的部署,而且统信软件为了帮助业界顺利完成从 CentOS 的迁移,对外承诺永久开放免费使用授权,用户只需要接受 EULA 即可,需要售后服务的用户则可以选择购买许可证激活系统

而 K3s 作为一个与上游 K8s 完全兼容的轻量 K8s 发行版,能使用户简单快速本地或云上部署生产规格的 K8s 集群,大大降低部署、升级、维护 K8s 集群的人力与成本;而且 K3s 由于资源消耗非常低,每个节点只需要 1、2G 或更少内存,因此也适用于 IoT 及个人技术爱好者的应用场景

最后希望您喜欢这篇文章,您的支持是我创作最大的动力kissing_heart

Reply Favorite View the author
All Replies
阿尼樱奈奈
deepin
2023-06-05 21:47
#1

不错。我记得你昨天发过这个文章,但是删了。

Reply View the author
donaldsebleung
deepin
2023-06-05 21:50
#2
阿尼樱奈奈

不错。我记得你昨天发过这个文章,但是删了。

感谢支持blush

昨天的情况是因为当时其实还没写好,晚上有点累了就一时点错了【发布文章】,所以立即回收掉了继续编辑;今天中午终于写好了就正式发布了joy

Reply View the author
乾豫恒益
deepin
2023-06-05 22:20
#3

kissing_heartkissing_heartkissing_heartkissing_heartkissing_heartkissing_heart

Reply View the author
donaldsebleung
deepin
2023-06-05 22:59
#4
乾豫恒益

kissing_heartkissing_heartkissing_heartkissing_heartkissing_heartkissing_heart

感谢支持blush

Reply View the author
138******91
deepin
2023-06-06 03:24
#5

楼主写的很好,支持

Reply View the author
donaldsebleung
deepin
2023-06-06 17:38
#6
138******91

楼主写的很好,支持

感谢支持blush

Reply View the author
jjcui8595
deepin
2023-06-07 23:27
#7

大赞!学习了

like

Reply View the author
donaldsebleung
deepin
2023-06-08 01:27
#8
jjcui8595

大赞!学习了

like

感谢支持blush

Reply View the author
开玩笑
deepin
2023-11-17 23:17
#9

这是k8s安装吗?

Reply View the author