前言 刚刚入手一台天翼云的服务器,配置8H16G,要不折腾点啥过不去,之前一直想整k8s,但是k8s比较复杂,而且需要的服务器配置比较高,我那么多1H2G的机器整不起来,然后公网IP通信也是个让人头疼的问题。
幸好看到了多云搭建 K3S 集群 这篇文章,然后就有了些许思路(给作者点赞),可以整一个k3s集群来承载我现在分布在各个服务器上的服务。
原来的六台服务器上,每个服务器都有不同的服务,每次都是ssh上去,然后docker-compose,除了大部分是自动调度的,手动维护还是挺费劲的,所以考虑着将部分服务搬到k3s集群上管理,然后通过api接口调度,是不是能节省了时间还学习到k8s的一些基础知识。
在做准备工作前先说几句废话:
k3s集群搭建本身很简单,稍稍有些麻烦的是环境准备还有内网互联问题
作为新手,k3s仍属于k8s,了解各种概念非常繁琐,不如使用现成的可视化工具:kubesphere 来进行操作,能迅速的帮助理解概念,从各种陌生的词汇中暂时挣脱出来
集群不是搭好初始版本就能用的,需要你不断的看官方文档,不断的对集群进行改进,甚至包括重新安装
我是在重新安装k3s集群4-5遍之后才来写这篇文章,希望看到这篇文章的人和自己都少踩一些坑
遇到很难解决的问题,如果不是特别重要,先放在一边,暂时不要在这个上面浪费你的时间
环境介绍
准备工作 注意:准备工作需要在所有的云服务器都要进行操作 。
准备工作的目的:
云服务器 要对各机器配通安全组,我是把所有的端口都固定对单个公网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.confecho "net.ipv4.conf.all.proxy_arp = 1" >> /etc/sysctl.confsysctl -p /etc/sysctl.conf
所有节点开启修改主机名称
1 2 3 4 hostnamectl set-hostname tencent-227 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 -ryum update -y
安装WireGuard
,并且配置内网互联 安装WireGuard
1 2 3 4 yum install epel-release https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm 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 privatekeycat publickey
在腾讯云227的主机创建/etc/wireguard/wg0.conf
文件,输入以下内容
1 2 3 4 5 6 7 8 9 [Interface] PrivateKey = 腾讯云227 Address = 192.168.1.1 ListenPort = 5418 [Peer] PublicKey = 天翼云152 刚刚生成的publickey EndPoint = 123.123.123.152:5418 AllowedIPs = 192.168.1.2/32
在天翼云152的主机创建/etc/wireguard/wg0.conf
文件,输入以下内容
1 2 3 4 5 6 7 8 9 [Interface] PrivateKey = 天翼云152 Address = 192.168.1.2 ListenPort = 5418 [Peer] PublicKey = 腾讯云227 刚刚生成的publickey EndPoint = 123.123.123.227:5418 AllowedIPs = 192.168.1.1/32
启动WireGuard
使用wg-quick
工具来创建虚拟网卡
观察内网互联情况,在两台主机同时执行
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 systemctl enable wg-quick@wg0 systemctl status wg-quick@wg0
如果后期需要增加节点,那么会修改配置文件,此时不能重新创建wgo,只需要修改配置热刷新即可。
1 2 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 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 [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...ntain11月 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 kubectl get pods -A [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 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 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
注意:
K3S_URL
是主节点的注册地址,如果是简单集群,那直接是ip:port即可,如果要高可用,尽量设置成域名,查看使用外部数据库实现高可用安装
自行查看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 wget https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/kubesphere-installer.yaml wget https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/cluster-configuration.yaml kubectl apply -f kubesphere-installer.yaml kubectl apply -f cluster-configuration.yaml
注意:
v3.2.1
是我实验成功的版本号,实际上它已经发布了v3.3.0
但是遗憾的是我没有安装成功,所以我把版本降级安装成功了
可以看看kubesphere-installer.yaml
、cluster-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访问配置即可,减少时间耽误,后期时间充裕再解决该问题
看个成果界面:
总结 凡花了很多时间和精力去做的事,尽量写个总结:
部署k3s集群有很多前置条件,难免碰到很多坑,很多坑不踩的话后续是不知道避坑的
在安装kubesphere时看错了文档,然后把k3s集群给终止掉了,所以需要从头再来,所以尽量先多看文档,选择合适的方式去安装软件
一些简单不严重的问题,如果有其他重要的事,那就先不管,先做重要的事,然后再解决,不要浪费太多时间
kubesphere新手入门使用k3s或者k8s创建服务,或者开通对外访问,我建议花一个小时看看视频,还是非常有用处的。
一个小时学会k8s部署应用
未完,待续……
参考文档和资源