抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

刚刚入手一台天翼云的服务器,配置8H16G,要不折腾点啥过不去,之前一直想整k8s,但是k8s比较复杂,而且需要的服务器配置比较高,我那么多1H2G的机器整不起来,然后公网IP通信也是个让人头疼的问题。

幸好看到了多云搭建 K3S 集群 这篇文章,然后就有了些许思路(给作者点赞),可以整一个k3s集群来承载我现在分布在各个服务器上的服务。

原来的六台服务器上,每个服务器都有不同的服务,每次都是ssh上去,然后docker-compose,除了大部分是自动调度的,手动维护还是挺费劲的,所以考虑着将部分服务搬到k3s集群上管理,然后通过api接口调度,是不是能节省了时间还学习到k8s的一些基础知识。

在做准备工作前先说几句废话:

  • k3s集群搭建本身很简单,稍稍有些麻烦的是环境准备还有内网互联问题
  • 作为新手,k3s仍属于k8s,了解各种概念非常繁琐,不如使用现成的可视化工具:kubesphere 来进行操作,能迅速的帮助理解概念,从各种陌生的词汇中暂时挣脱出来
  • 集群不是搭好初始版本就能用的,需要你不断的看官方文档,不断的对集群进行改进,甚至包括重新安装
  • 我是在重新安装k3s集群4-5遍之后才来写这篇文章,希望看到这篇文章的人和自己都少踩一些坑
  • 遇到很难解决的问题,如果不是特别重要,先放在一边,暂时不要在这个上面浪费你的时间

环境介绍

  • 腾讯云机器-227 公网IP: 123.123.123.227 配置: 1H2G 系统:centos7.9 内核版本:3.10.0-1160.76.1.el7.x86_64

  • 天翼云机器-152 公网IP: 123.123.123.152 配置:8H16G 系统:centos7.9 内核版本:3.10.0-1160.76.1.el7.x86_64

准备工作

注意:准备工作需要在所有的云服务器都要进行操作

准备工作的目的:

  • 云服务器 要对各机器配通安全组,我是把所有的端口都固定对单个公网IP开放(不要对外网开放全部端口,非常危险),这步可以先去各个云平台配置好
  • 配置机器的iptables来放行内网规则
  • 修改一下机器的hostname,便于区分
  • 为安装WireGuard 做准备

我构建的k3s集群和版本:

1
2
3
4
5
[root@tianyi-152 ~]# kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.25.3+k3s1
Kustomize Version: v4.5.7
Server Version: v1.25.3+k3s1

使用MySQL作为存储,k3s支持PostgreSQL、MySQL 或 etcd作为外部存储,主要是支持k3s高可用。

使用WireGuard来构建虚拟内网,让各云的机器使用自建的内网IP能互相访问,用SSL通信。

升级所有服务器的内核

因为我们构建虚拟内网需要使用软件WireGuard,但是该软件需要内核5以上的版本,所以先升级系统内核。

linux内核列表 找到合适的内核及版本。

下载内核及安装

1
2
3
4
5
#下载内核 
wget https://ftp.sjtu.edu.cn/sites/elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-6.0.7-1.el7.elrepo.x86_64.rpm

#安装内核
rpm -ivh kernel-ml-6.0.7-1.el7.elrepo.x86_64.rpm

修改默认内核版本

1
2
3
4
5
6
7
8
9
10
# 查看当前实际启动顺序
grub2-editenv list
# 查看当前实际启动顺序
grub2-editenv list
# 查看内核插入顺序
grep "^menuentry" /boot/grub2/grub.cfg | cut -d "'" -f2
# 设置默认启动
grub2-set-default 'CentOS Linux (6.0.7-1.el7.elrepo.x86_64) 7 (Core)'
# 重新创建内核配置
grub2-mkconfig -o /boot/grub2/grub.cfg

在所有节点开启 IP 地址转发

1
2
3
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

所有节点开启修改主机名称

1
2
3
4
# 腾讯云机器-227
hostnamectl set-hostname tencent-227
# 天翼云机器-152
hostnamectl set-hostname tianyiyun-152

添加 iptables 规则,允许本机的 NAT 转换

1
2
3
4
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o wg0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.1/24 -o eth0 -j MASQUERADE

注意:

  • wg0:为你定义的虚拟网卡
  • 192.168.1.1: 为你的虚拟IP地址段 可以修改为自己想定义的IP
  • eth0:为你的物理网卡

重启服务器

1
2
3
4
5
6
# 重启服务器
reboot
# 验证当前内核版本
uname -r
# 内核升级后,有些依赖包需要升级,可以自己决定是否要升级
yum update -y

安装WireGuard ,并且配置内网互联

安装WireGuard

1
2
3
4
#安装rpm依赖包
yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
#安装wireguard-tools 包含wireguard
yum install yum-plugin-elrepo kmod-wireguard wireguard-tools -y

配置WireGuard

1
2
3
4
5
6
7
8
#在各个云服务器上生成通信的秘钥,包括公钥和私钥
wg genkey | tee privatekey | wg pubkey > publickey

# 私钥配置在本机配置
cat privatekey

# 公钥配置在其他服务器
cat publickey

在腾讯云227的主机创建/etc/wireguard/wg0.conf 文件,输入以下内容

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = 腾讯云227 #刚刚生成的privatekey
Address = 192.168.1.1 #内网地址和iptables规则一样就可以了
ListenPort = 5418

[Peer]
PublicKey = 天翼云152 刚刚生成的publickey
EndPoint = 123.123.123.152:5418 #天翼云152的公网地址
AllowedIPs = 192.168.1.2/32 #自己定义的内网通信ip

在天翼云152的主机创建/etc/wireguard/wg0.conf 文件,输入以下内容

1
2
3
4
5
6
7
8
9
[Interface]
PrivateKey = 天翼云152 #刚刚生成的privatekey
Address = 192.168.1.2 #分配到152的ip
ListenPort = 5418

[Peer]
PublicKey = 腾讯云227 刚刚生成的publickey
EndPoint = 123.123.123.227:5418 #腾讯云227的公网地址
AllowedIPs = 192.168.1.1/32 #ip不能冲突,一个节点不同ip,而且需要和Interfaceip保持一致

启动WireGuard

使用wg-quick工具来创建虚拟网卡

1
2
#创建虚拟网卡,与配置文件名字对应,与iptables规则对应
wg-quick up wg0

观察内网互联情况,在两台主机同时执行

1
2
3
4
5
6
7
8
9
10
11
[root@tianyi-152 ~]# wg
interface: wg0
public key: xxxxxxxxx
private key: (hidden)
listening port: 5418

peer: xxxxxx
endpoint: 123.123.123.227:5418
allowed ips: 192.168.1.1/32
latest handshake: 8 seconds ago
transfer: 59.95 MiB received, 23.76 MiB sent

注意查看是否有transfer,如果有,那说明已经正常通信了,或者互相用内网地址ping也可测通

1
2
3
4
[root@tianyi-152 ~]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=20.5 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=20.6 ms

配置WireGuard 开机自启

1
2
3
4
5
#开启wg-quick@wg0 服务
systemctl enable wg-quick@wg0

#查看状态
systemctl status wg-quick@wg0

如果后期需要增加节点,那么会修改配置文件,此时不能重新创建wgo,只需要修改配置热刷新即可。

1
2
#用strip指令刷新
wg syncconf wg0 <(wg-quick strip wg0)

内网互联工作已经完成,剩下的就是折腾k3s集群了,值得注意的是,内网互联只需要配置一次就可以了,主要是保障主机能通过公网来构建内网虚拟网络。

安装k3s集群

安装K3s集群其实很简单,但是要先看文档:官方文档

有几个需要注意的点:

  • 容器运行时的选择,如果不指定docker,那使用原生的也没问题,如果指定docker,那么所有安装的节点都安装上docker,版本一致,避免各种不知名错误
  • 自由选择PostgreSQL、MySQL 或 etcd作为外部存储,提前创建好账号密码数据库,也可不指定用默认的
  • 可以选择禁用Traefik(自选nginx-igress),可以先不安装nginx-igress,不用管他就行

安装首个k3s master节点

在天翼云152上安装k3s master节点:

1
2
# 使用国内资源安装k3s
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --docker --datastore-endpoint="mysql://user:pwd@tcp(ip:port)/db" --disable traefik --node-external-ip 外网IP --advertise-address 外网IP --node-ip 192.168.1.2 --flannel-iface wg0

注意:

  • --docker 容器运行时使用docker,如果不需要,那就去掉,否则先安装docker
  • --datastore-endpoint 外部存储使用mysql,如果不需要,去掉即可,否则先准备好mysql等
  • --disable traefik 禁用自带的traefik ,如果不需要,去掉即可,暂时没发现有啥用处
  • --node-external-ip--advertise-address 尽量指定外网IP或者能通信的内网IP
  • --node-ip 指定上面使用wg分配的内网IP
  • --flannel-iface wg0 指定网卡设备,如果是其他名字,请更换

执行完命令后,查看k3s的服务状态是否正常启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#查看k3s 启动状态
[root@tianyi-152 ~]# systemctl status k3s
● k3s.service - Lightweight Kubernetes
Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: disabled)
Active: active (running) since 日 2022-11-06 11:16:33 CST; 2h 15min ago
Docs: https://k3s.io
Process: 6458 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Process: 6455 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
Process: 6450 ExecStartPre=/bin/sh -xc ! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service (code=exited, status=0/SUCCESS)
Main PID: 6461 (k3s-server)
Tasks: 28
Memory: 582.6M
CGroup: /system.slice/k3s.service
└─6461 /usr/local/bin/k3s server

11月 06 13:31:18 tianyi-152 k3s[6461]: time="2022-11-06T13:31:18+08:00" level=info msg="Using CNI configuration...list"
11月 06 13:31:23 tianyi-152 k3s[6461]: time="2022-11-06T13:31:23+08:00" level=info msg="Using CNI configuration...list"
11月 06 13:31:24 tianyi-152 k3s[6461]: E1106 13:31:24.308053 6461 remote_runtime.go:1168] "ReopenContainerLo...41e2"
11月 06 13:31:24 tianyi-152 k3s[6461]: E1106 13:31:24.308146 6461 container_log_manager.go:266] "Failed to r...ntain
11月 06 13:31:28 tianyi-152 k3s[6461]: time="2022-11-06T13:31:28+08:00" level=info msg="Using CNI configuration...list"
11月 06 13:31:33 tianyi-152 k3s[6461]: time="2022-11-06T13:31:33+08:00" level=info msg="Using CNI configuration...list"
11月 06 13:31:34 tianyi-152 k3s[6461]: E1106 13:31:34.352834 6461 remote_runtime.go:1168] "ReopenContainerLo...41e2"
11月 06 13:31:34 tianyi-152 k3s[6461]: E1106 13:31:34.352902 6461 container_log_manager.go:266] "Failed to r...ntain
11月 06 13:31:38 tianyi-152 k3s[6461]: time="2022-11-06T13:31:38+08:00" level=info msg="Using CNI configuration...list"
11月 06 13:31:43 tianyi-152 k3s[6461]: time="2022-11-06T13:31:43+08:00" level=info msg="Using CNI configuration...list"
Hint: Some lines were ellipsized, use -l to show in full.

正常running后,可以查看k3s的pod状态了,还可以看节点状态

1
2
3
4
5
6
#查看所有的pod是不是completed 或者  running状态,如果是,那就是已正常启动
kubectl get pods -A
#查看k3s集群的节点状态
[root@tianyi-152 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
tianyi-152 Ready control-plane,master 170m v1.25.3+k3s1

安装agent或者另外一个master节点

阅读了官方文档后,为保证高可用,因为天翼云的服务器有效期只有1年,后期续费基本不可能(价格差20倍),所以为了高可用,再创建一个主节点。

创建第二个主节点和创建第一个主节点基本一致,其他的就是多了个 --token 的参数

在天翼云152上获取token

1
2
#获取token
cat /var/lib/rancher/k3s/server/token

在腾讯云227上安装第二个master点

1
2
#安装主节点
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --docker --token=xxxx --datastore-endpoint="mysql://user:pwd@tcp(ip:port)/db" --disable traefik --node-external-ip 外网IP --advertise-address 外网IP --node-ip 192.168.1.1 --flannel-iface wg0

当然也可以选择将腾讯云227安装为agent节点 (master 和 agent要二选一,不要同时执行)

1
2
#安装agent
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.1.2:6443 K3S_TOKEN=xxxx sh -s - --docker --node-external-ip 外网IP --node-ip 192.168.1.1 --flannel-iface wg0

注意:

自行查看pods或者nodes的状态即可,如果有问题,先看官方文档,看看是不是配置不对,然后再去搜索引擎找答案。

集群安装完了,剩下的是实际部署服务啥的了,这时候用命令行或者配置文件来操作,对于k8s的新手用户来说还是比较费劲的,最好的方案是在k8s上部署一个kubesphere,用可视化界面来创建节点啊服务啊对外访问啥的,加深理解然后自己再去使用配置文件来配置。

在k3s集群上安装kubesphere

正常还是看在 Kubernetes 上最小化安装 KubeSphere,据悉 kubesphere也是支持k3s的,但是不能保证完整可用性,毕竟k3s比k8s少了5个s。

我是先看了在linux上安装kubesphere的,需要提前安装一些依赖:

1
yum install socat conntrack -y

然后就可以安装kubesphere了,在k3s的其中一台master上安装即可,后续如果需要给k3s加节点,那么kubesphere会讲监控等的容器自动部署到新的节点上。

1
2
3
4
5
6
7
8
9
10
#下载installer依赖
wget https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/kubesphere-installer.yaml

#下载config
wget https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/cluster-configuration.yaml

#执行installer
kubectl apply -f kubesphere-installer.yaml
#执行config
kubectl apply -f cluster-configuration.yaml

注意:

  • v3.2.1 是我实验成功的版本号,实际上它已经发布了v3.3.0 但是遗憾的是我没有安装成功,所以我把版本降级安装成功了
  • 可以看看kubesphere-installer.yamlcluster-configuration.yaml 可以先看看文件里写了啥,新手可以不改动

kubesphere安装上了,还要看看它有没有安装完成,看看安装日志是否正常,如果正常安装,那么会给出地址和默认的账号密码

1
2
#查看日志
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

使用 kubectl get pod -A 查看所有 Pod 是否在 KubeSphere 的相关命名空间中正常运行。如果是,请通过以下命令检查控制台的端口(默认为 30880):

1
kubectl get svc/ks-console -n kubesphere-system

注意:

  • 安装有问题,看官方文档
  • 默认端口为30880,如果要在网页浏览控制台,那么就是公网IP:30880,记得提前在云控制台安全组配置30880可访问
  • 不要急着用nginx给30880配置域名访问,目前我一直遇到操作两下就报http2 相关错误,也没修复好,直接ip:30880访问配置即可,减少时间耽误,后期时间充裕再解决该问题

看个成果界面:

kubesphere

总结

凡花了很多时间和精力去做的事,尽量写个总结:

  • 部署k3s集群有很多前置条件,难免碰到很多坑,很多坑不踩的话后续是不知道避坑的
  • 在安装kubesphere时看错了文档,然后把k3s集群给终止掉了,所以需要从头再来,所以尽量先多看文档,选择合适的方式去安装软件
  • 一些简单不严重的问题,如果有其他重要的事,那就先不管,先做重要的事,然后再解决,不要浪费太多时间

kubesphere新手入门使用k3s或者k8s创建服务,或者开通对外访问,我建议花一个小时看看视频,还是非常有用处的。

一个小时学会k8s部署应用

未完,待续……

参考文档和资源

评论