背景
Kubernetes是时下流行的容器编排引擎,由于字母太多,且掐头去尾后剩下8个字母,于是被你们亲切的简写为k8s。
Kubernetes
另外所谓“云原生”概念火热,各大云厂商也纷纷推出了自己的容器服务,比如阿里云的ACK、腾讯云的TKE、微软云的AKS等,无不是基于Kubernetes。
阿里云ACK
腾讯云TKE
谷歌云AKS
因为我个人博客搭建在腾讯云上linux ntp服务器搭建,大约是今年(2021年)11、12月的时侯萌生的“要不把博客迁往k8s上?”的看法。云厂商提供的容器服务通常都支持从原有云服务器转换为Kubernetes的worker节点;不过其实也有一些限制,比如腾讯云价钱相对低廉的轻量应用服务器则不支持转换。不过碰巧我的博客使用的是云服务器,那就试试腾讯云的TKE吧。
结果懒惰使人省钱,从学习到实战的步伐总是异常的平缓,在此期间腾讯云发生了2件大事:
负载均衡实例升级调价公告
腾讯云容器服务于2022年3月21日10:00(上海时间)对托管集群计费通知
运行在k8s里的程序想要曝露到网段上,在云厂商的环境中最常用的就是通过负载均衡实现,腾讯云这一调价直接从原先的每小时0.02元涨到了0.2元,个人用户应当极少用如此贵的服务。(相较而言,阿里云则提供廉价版的负载均衡,个人用户的福音。)
另外彻底制止我使用TKE的是,我们晓得k8s集群须要有master和worker节点分工合作,云厂商会提供托管master节点的服务,用户只须要自己照顾好worker节点即可。腾讯云也不例外,不过原先托管是免费的,即即将开始收费了!而不使用托管,意味着我必须再打算一台云服务器,又是一笔开支……
尽管上云等于花钱,然而贫穷才能制止我们上云吗?答案是否定的,我们可以自己搭建k8s集群!甚至能够从中收获许多,如:
话虽这么,但强烈建议没有接触过Kubernetes的同学们,先通过官方文档和minikube在本地学习后,再继续深入。
ingress
官方文档
minikube
我计划通过几篇文章来介绍:
cert-manager
本地卷#local
好了如何安装LINUX,屁话说的太多,如今就开始进行k8s集群的搭建吧~
环境介绍
本文下边的操作都是在腾讯云里进行的,使用的是1台云服务器CVM和1台轻量应用服务器TencentCloudLighthouse进行。(通常云厂商就会给新用户很大的让利力度,非常是第一台云服务器和轻量应用服务器,意味着前3年可以以很低的成本体验。)
云服务器CVM
轻量应用服务器TencentCloudLighthouse
我使用的具体配置和规划如下:
操作系统都使用的是Debian11.1,上述机器都在同一地域。
Debian
请注意,不应将这样的配置使用在生产环境,由于这不能保证可用性。不过自己爱玩的话,一台机器也可以(建议起码2C2G),将master和worker布署在同一机器内,但如此做会降低不稳定的诱因,另外都上(hua)云(qian)了,新用户订购轻量应用服务器约等于不要钱,其实配置拉满整上。
其实,即使你使用的可能不是腾讯云或则Debian,但这并不是你继续阅读的障碍,由于云基础设施、Linux命令都是类似的,下文在具体的地方会进行标明。
没有具体标注在哪台机器上进行的,则所有机器都须要进行这种步骤,比如外网配置、Debian配置、安装docker、kubeadm等。
集群网路配置
请查看你使用的云厂商没有类似的限制或配置,以免外网不通造成master和worker节点未能通讯。
外网网关配置
要成立集群,首先机器之间得能相互访问。最理想的情况是机器都处在同一个网关,但省钱的方案并不能做到这一点,我的两台主机坐落完全不同的两个网关,Lighthouse甚至不支持更改外网IP地址。
好在腾讯云的CVM和Lighthouse之间似乎默认不能连通,但坐落同一地域的机器可以通过外网互联功能,享受5Gbps带宽免费互通(不同地域须要收费),可以参考腾讯云文档进行操作,本文不多赘言。
外网互联
云服务器防火墙配置
另外须要注意的是云厂商提供的防火墙的配置(不是系统里的防火墙),须要在每台主机的入站规则中添加上其它主机的IP地址,腾讯云的配置入口坐落实例详情-安全组(Lighthouse为防火墙)。
比如,我直接选择放行整个网关,这样未来假如降低机器就不用再来回改配置了:
由于我是全部放行,可以使用ping命令查看机器是否连通了,比如在我的worker上pingmaster:
> ping 10.0.16.13
PING 10.0.16.13 (10.0.16.13) 56(84) bytes of data.
64 bytes from 10.0.16.13: icmp_seq=1 ttl=64 time=0.288 ms
64 bytes from 10.0.16.13: icmp_seq=2 ttl=64 time=0.240 ms
64 bytes from 10.0.16.13: icmp_seq=3 ttl=64 time=0.264 ms
准许访问网段
因为安装k8s过程中须要拉取一些镜像或下载一些文件,而这种镜像或文件在腾讯云内网镜像服务中并没有提供,所以起码安装阶段须要访问网段。
Debian基础配置
假如你使用的是其它Linux发行版本,这么通过互联网搜索相关操作,能很快找到对应的命令。
配置机器名称和hosts
使用统一一致的机器名称利于管理:
hostnamectl set-hostname bun-master-01
配置hosts文件让机器名称可以被访问:
cat >> /etc/hosts << EOF
10.0.16.13 bun-master-01
172.17.0.2 bun-worker-01
EOF
关掉防火墙等配置
安装k8s前须要将Linux的防火墙、安全配置(SELinux)、交换分区(Swap,类似于Windows的虚拟显存)关掉。不过那些内容默认情况下都是禁用的,假如你当初开启过记得关掉。
容许iptables检测桥接流量
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
配置时间同步
确保每台机器时间都是正确的,我使用腾讯云内网提供的NTP服务。
NTP服务
假如你的云厂商没有提供类似服务,可以采用网段上的NTP服务。
安装ntp:
apt-get install -y ntp
更改ntp配置:
vi /etc/ntp.conf
将腾讯云的NTP服务器地址替换掉配置文件中默认的:
重启ntp并查看疗效:
service ntp restart
service ntp status
ntpq -p
最后设置ntp开机启动:
systemctl enable ntp
安装docker
注意:所有节点都须要安装docker。
我们使用官方脚本安装docker,在此之前先把一些必要的程序安装一下:
apt-get update
apt-get install -y
ca-certificates
curl
gnupg
lsb-release
接着使用腾讯云内网镜像来进行下载:
只能在腾讯云内网访问,你须要将它们换成你可用的,比如。本文优先使用腾讯云内网镜像,由于这样高速,且不会形成任何网段流量和费用。
curl -fsSL http://mirrors.tencentyun.com/docker-ce/linux/debian/gpg
| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] http://mirrors.tencentyun.com/docker-ce/linux/debian
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
接出来开始安装docker:
apt-get update
apt-get install -y
docker-ce
docker-ce-cli
containerd.io
检测docker网路
安装好以后,使用ipa命令检测一下docker新建的网卡,防止docker新建的网卡造成网关冲突,外网机器难以访问。
比如在bun-master-01机器上执行ipa得到如下返回:
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 52:54:00:19:8b:e4 brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
inet 10.0.16.13/22 brd 10.0.19.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe19:8be4/64 scope link
valid_lft forever preferred_lft forever
3: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:c3:bf:8b:a6 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
docker创建的虚拟网卡docker0使用了172.17.0.1地址linux培训机构,而我的另一台机器bun-worker-01则是172.17.0.2。这样造成难以从bun-master-01访问bun-worker-01。
我们可以更改docker的配置文件指定它的虚拟网卡地址,比如我希望docker使用192.168.0.1/16网关,这样和谁都不冲突:
cat >> /etc/docker/daemon.json << EOF
{
"bip": "192.168.0.1/16"
}
EOF
之后重启docker,并重新运行ipa检测配置是否生效,以及重新ping一下测试连通性:
service docker restart
配置docker镜像加速源
只能在腾讯云内网访问,你须要将它们换成你可用的,比如使用阿里云镜像加速。
阿里云镜像加速
更改/etc/docker/daemon.json文件,新增registry-mirrors的配置:
{
"bip": "192.168.0.1/16",
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
接出来重启docker应用配置:
service docker restart
假如一切正常,让我们跑一下docker的hello-world试试:
docker run hello-world
假如见到HellofromDocker!则说明一切顺利,继续进行下一步吧。
docker启动失败常见问题
假如在重启docker时不幸遇见了这样的提示:
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
不要慌,请运行journalctl-xe查看具体错误。诸如我尝试将docker的虚拟网卡IP更改为了一个非法的值:
Mar 23 21:44:28 master-01.bun.local dockerd[186689]: time="2022-03-23T21:44:28.584331774+08:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
Mar 23 21:44:28 master-01.bun.local dockerd[186689]: time="2022-03-23T21:44:28.589151624+08:00" level=info msg="Loading containers: start."
Mar 23 21:44:28 master-01.bun.local dockerd[186689]: time="2022-03-23T21:44:28.643081791+08:00" level=info msg="stopping event stream following graceful shutdown" error="" module=libcontainerd namespace=moby
Mar 23 21:44:28 master-01.bun.local dockerd[186689]: failed to start daemon: Error initializing network controller: Error creating default "bridge" network: failed to allocate gateway (192.168.0.0): Address already in use
docker要求配置的值是一个真实的IP地址,所以不能配置为192.168.0.0/16,须要配置为192.168.0.1/16。
假如是其它问题,可以在网上进行搜索。
安装kubeadm,kubelet以及kubectl
注意:所有节点都须要安装kubeadm,kubelet以及kubectl。
因为Google难以访问,腾讯云的镜像又没有gpg文件linux ntp服务器搭建,只得从阿里云的镜像下载pgp文件谢谢友商
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
不过腾讯云的镜像有相关的软件包:
有熟悉Debian的男子伴会注意到,这儿指定了Debian的xenial版本,它似乎表示Debian的k8s最新版。这个issue解释了背后的故事。