【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有点蠢嘛)。解决办法有两种,一种是创建镜像的时候指定事先下好的版本,一种是指定imagePullPolicyIfNotPresent,也就是先判断是否在本地存在,如果有就不拉取。
    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-集群搭建/
作者
Sheep
发布于
2024年8月8日
许可协议