【K3s踩坑记录】1.集群搭建
最近在学习云原生相关的内容,比如K8s,跟着b站上的视频教程和笔记,使用K3s搭建集群。但是因为某种不可抗力原因等,踩了不少坑,故开一篇笔记来记录一下踩的坑。
准备工作
运行环境
- K3s版本:v1.30.3+k3s1
- 集群规划
| 主机名 | IP地址 | 配置 | 系统 | 网络 |
|---|---|---|---|---|
| k8s-master | 192.168.6.170 | 内存:2G | CentOS | 互联网:NAT网络 |
| k8s-worker1 | 192.168.6.171 | CPU:2核 | 7.9.2009 | 内部网络: Host-only |
| k8s-worker2 | 192.168.6.172 | 硬盘:20G | 最小化安装 |
前期准备
先配置好一台虚拟机,再进行克隆
- 关闭防火墙
systemctl disable firewalld --now - 配置DHCP*(坑点,不然没法上网)
cd /etc/sysconfig/network-scripts ls # 可以看到以下内容 # ifcfg-ens33 ifdown-eth ... # ifcfg-ens33 即为要修改的配置,具体是那个网卡可以通过 ip addr # 得到 vi ifcfg-ens33 # 修改 BOOTPROTO=dhcp # 修改 ONBOOT=yes # 重启,好像也可以不重启 - 如果能够联网,后续修改成静态ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 修改 BOOTPROTO=static # 添加 IPADDR NETMASK GATEWAY DNS1 DNS2字段
- 配置yum镜像源*(坑点)
```bash
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo- 设置selinux(需要联网)
yum install -y container-selinux selinux-policy-base yum install -y https://rpm.rancher.io/k3s/latest/common/centos/7/noarch/k3s-selinux-0.2-1.el7_8.noarch.rpm # 如果虚拟机下载不了,手动下载之后导入到虚拟机中再用yum安装
下载安装包
从github仓库获取https://github.com/k3s-io/k3s
分别下载安装脚本install.sh、二进制文件k3s、必要的镜像包k3s-airgap-images-amd64.tar.gz
直接导入到~目录下
执行安装前的准备
- 将
k3s二进制文件移动到/usr/local/bin目录,并添加执行权限mv k3s /usr/local/bin chmod +x /usr/local/bin/k3s - 将镜像移动到
/var/lib/rancher/k3s/agent/images/目录(无需解压)mkdir -p /var/lib/rancher/k3s/agent/images/ cp ./k3s-airgap-images-amd64.tar.gz /var/lib/rancher/k3s/agent/images/ - 添加执行权限
chmod +x install.sh
克隆虚拟机
- 将当前准备好的虚拟机(假定为master)克隆两个worker,最好打个快照
- 克隆的两个worker节点重新生成MAC地址
- 给所有节点重新设置hostname
hostnamectl set-hostname <newhostname>
K3s部署过程
执行安装脚本
- master节点执行
# 离线安装 INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh # 安装完成后,查看节点状态 kubectl get node # 查看token cat /var/lib/rancher/k3s/server/node-token # 复制得到的token # 监测节点情况 watch -n 1 kubectl get node - worker节点执行
INSTALL_K3S_SKIP_DOWNLOAD=true \ K3S_URL=https://192.168.6.170:6443 \ K3S_TOKEN=xxx \ ./install.sh - 此时master节点应该可以监测到
NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master xmxs v1.30.3+k3s1 k8s-worker1 Ready <none> xmxs v1.30.3+k3s1 k8s-worker2 Ready <none> xmxs v1.30.3+k3s1
坑点:worker节点无法使用kubectl命令
- 跟着做到这一步发现,master节点可以使用
kubectl,但是worker节点会报错W0206 03:45:01.740148 9354 loader.go:222]Config not found: /etc/rancher/k3s/k3s.yaml E0206 03:45:01.741036 9354 memcache.go:238] couldn't get current server APl group list: Get http://localhost:8080/api?timeout-32s dial tcp 127.0.0.1:8080:connect: connection refused E0206 03:45:01.741740 9354 memcache.go:238] couldn't get current server APl group list: Get http://localhost:8080/api?timeout-32s dial tcp 127.0.0.1:8080:connect: connection refused E0206 03:45:01.743821 9354 memcache.go:238] couldn't get current server APl group list: Get http://localhost:8080/api?timeout-32s dial tcp 127.0.0.1:8080:connect: connection refused E0206 03:45:01.745916 9354 memcache.go:238] couldn't get current server APl group list: Get http://localhost:8080/api?timeout-32s dial tcp 127.0.0.1:8080:connect: connection refused E0206 03:45:01.747884 9354 memcache.go:238] couldn't get current server APl group list: Get http://localhost:8080/api?timeout-32s dial tcp 127.0.0.1:8080:connect: connection refused The connection to the server localhost:8080 was refused - did you specify the right host or port? - 一开始网上搜索还以为是部署错误,后来才知道原来是正常的,是由于没有集群密钥。如果需要在agent节点运行
kubectl命令,那么执行以下操作mkdir ~/.kube scp 192.168.6.170:/etc/rancher/k3s/k3s.yaml ~/.kube/config - 然后替换config中的server ip地址
vi ~/.kube/config # server: https://192.168.6.170:6443 - 至此,就可以在worker节点运行
kubectl命令了
配置镜像源(大坑)
总算把节点配置完成了,但是后面还有一大关等着,就是配置镜像源。由于不可言说的原因,如今国内想要拉取镜像必须通过镜像源,而在那个时间节点之后很多的重要镜像源都失效了。而网上找到的配置教程很多是过时的,不止是镜像源过时,配置镜像源的方法也过时了,导致一片混乱。借由这篇笔记一次性讲明白。
- 查看配置文件,K3s会自动生成containerd的配置文件
cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml - 可以看都关于registry的配置
[plugins."io.containerd.grpc.v1.cri".registry] config_path = "/var/lib/rancher/k3s/agent/etc/containerd/certs.d" - 这个
/var/lib/rancher/k3s/agent/etc/containerd/certs.d就是当前containerd获取镜像源的路径。很多老教程的提供的方法是修改config.toml(重新启动K3s会重置),或者复制一个config.toml.tmpl然后在上面修改,这样的做法都是过时的,不要用!错误示范# 不要学! # 在 config.toml.tmpl 文件中添加 [plugins.cri.registry.mirrors] [plugins.cri.registry.mirrors."docker.io"] endpoint = ["https://docker.mirrors.ustc.edu.cn"] # 镜像源也是过时的 - 正确的配置方法,应该是新建
/etc/rancher/k3s/registries.yaml,写入这个配置文件来配置镜像源(如果没有这个路径就创建)mkdir -p /etc/rancher/k3s vi `/etc/rancher/k3s/registries.yaml - 以下是
registries.yaml参考,里面的镜像源目前可以用,但是不能保证不过时mirrors: docker.io: endpoint: - "https://docker.m.daocloud.io" quay.io: endpoint: - "https://quay.m.daocloud.io" registry.k8s.io: endpoint: - "https://k8s.m.daocloud.io" gcr.io: endpoint: - "https://gcr.m.daocloud.io/" k8s.gcr.io: endpoint: - "https://k8s-gcr.m.daocloud.io" ghcr.io: endpoint: - "https://ghcr.m.daocloud.io" - 另外,不止是master节点需要进行配置,worker节点也需要,网上搜索的结果是worker节点会从master获取镜像源,似乎也是不对的!创建pod进行镜像拉取时,默认会在pod所创建的worker节点上进行拉取,也就会使用worker节点上的镜像源配置
- 重启每个节点
# master systemctl restart k3s # worker systemctl restart k3s-agent
测试创建pod(坑)
- 创建一个nginx的pod试试看,在master节点上执行
kubectl run mynginx --image=nginx # 查看Pod kubectl get pod # 描述 kubectl describe pod mynginx # 查看Pod的运行日志 kubectl logs mynginx - 如果失败了,可能需要先在对应的worker节点上把镜像拉下来,再进行创建。如果失败有可能是因为创建pod的时候无限从网络拉取pod,而网络又不稳定,于是崩溃
crictl pull nginx - 你可能发现这样还是起不来,为什么呢?原来在于pod的拉取策略:
imagePullPolicy。如果没有指定拉取策略,同时拉取镜像为latest或无标签(那也是latest),imagePullPolicy会自动设置为Always,意为永远都会从网络上pull,即使本地有latest的镜像(djw:这个b有点蠢嘛)。解决办法有两种,一种是创建镜像的时候指定事先下好的版本,一种是指定imagePullPolicy为IfNotPresent,也就是先判断是否在本地存在,如果有就不拉取。kubectl run mynginx --image=nginx --image-pull-policy=IfNotPresent
结尾
这样,总算是把基本的环境部署好了,没想到这几个步骤就有如此多的坑,有不可抗力原因,有网络上的过时信息/垃圾教程,特意去翻了K3s和containerd的文档,以及github的issues和K3s论坛,都没有非常明确的解答和教程,好在第一步终于是走出去了,真是一场酣畅淋漓的赤石啊
【K3s踩坑记录】1.集群搭建
https://sheep-in-box.github.io/2024/08/08/【K3s踩坑记录】1-集群搭建/