• 搭建K8s集群


    前言:本次将通过kubeadm部署1个master节点,2个worker节点K8s集群,本次集群使用的容器运行工具为docker(题外话:K8s的容器运行工具也可以用docker、containerd、cio等等,其中containerd是一个轻量级、工业级的容器运行工具,containerd是docker公司捐献给cncf基金会的,所以docker的功能会比containerd的功能多,并且需要值得注意的是K8s在1.24版本后并未抛弃docker,只是在K8s的1.24版本以后移除了docker-shim,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合,为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker ,所以想在K8s的1.24版本及以后的版本中使用docker,需要安装cri-dockerd)

    安装K8s集群的准备条件:

    1、准备3台主机,虚拟机也行,每台主机的内存都要在2GB以上,cpu都要在2颗以上,否则后续初始化K8s时会不通过,别不信邪,我亲身经历了的,后面搭建集群的人就不要学我了,血的教训(别说我骗你们,有图有真相)

    1. [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
    2. [ERROR Mem]: the system RAM (972 MB) is less than the minimum 1700 MB
    3. [ERROR CRI]: container runtime is not running: output: E1019 23:31:30.275460 2642 remote_runtime.go:948] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"

    2、各主机间能通过网络互相通信(ping一下就知道通不通了)

    3、禁用各主机上的swap设备(下面有教程,自己跟着来就行)

    4、各主机时间同步(下面有教程,自己跟着来就行)

    1、首先需要准备3台服务器或虚拟机,分别作为master、worker1、worker2节点(若是用虚拟机搭建集群,安装一台,其他两台克隆第一台即可;以下连接为虚拟机安装CentOS7的教程,有需要的同学可以看看)

    https://blog.csdn.net/m0_64284147/article/details/126199002

    2、禁止每个节点上的swap分区

    swapoff -a

    然后使用以下命令查看是否禁用成功

    free -mh

    禁用前:

     禁用后:

    3、关闭每个节点上的防火墙

    临时关闭:

    systemctl stop firewalld

    永久关闭:

    systemctl disable firewalld

    效果图:

    5、关闭每个节点上的selinux

     临时关闭:

    setenforce 0

    永久关闭:

    sed -i 's/enforcing/disabled/' /etc/selinux/config

    5、分别在3个节点上输入以下命令,更改每个节点上的主机名称,方便后续的查看

    hostnamectl set-hostname 要改的名字

    输入以下命令查看主机名 

    hostname

    master节点的效果图:

    6、在master节点里添加hosts

    1. cat >> /etc/hosts << EOF
    2. 主节点ip master
    3. 工作节点ip worker1
    4. 工作节点ip worker2
    5. EOF

    例:(每台机器的Ip不同,截图仅供参考) 

    效果图:

    7、分别在3个节点上输入以下命令,将桥接的IPV4流量传递到iptables的链(同一节点的不同pod是利用linux bridge在网路的第二层进行通讯,由于没有原路返回造成pod请求services时的session无法收到返回值而连接超时,所以需要进行设置让第二层的bridge在转发时也通过第三层的iptables进行通信。)

    1. cat > /etc/sysctl.d/k8s.conf << EOF
    2. net.bridge.bridge-nf-call-ip6tables = 1
    3. net.bridge.bridge-nf-call-iptables = 1
    4. EOF

    输入以下命令使设置生效

    sysctl --system

    master节点的效果图:

    8、让3个节点上的时间保持一致

    (1)分别在3个节点上输入以下命令安装软件包ntpdate

    yum install ntpdate -y

    (2)分别在3个节点上输入以下命令同步时间

    ntpdate ntp1.aliyun.com

    国内常用的NTP服务器 

    1. 1、cn.pool.ntp.org  中国开源免费NTP服务器
    2. 2、ntp1.aliyun.com 阿里云NTP服务器
    3. 3、ntp2.aliyun.com 阿里云NTP服务器
    4. 4time1.aliyun.com 阿里云NTP服务器
    5. 5time2.aliyun.com 阿里云NTP服务器

    效果图:

    9、由于要让K8s的容器运行工具Docker,所以需要先安装Docker


    我的另一篇文章关于Docker的安装教程,有需要的同学可以拿来参考:https://blog.csdn.net/m0_64284147/article/details/126025ru


    以上文章的安装教程是根据官方文档来进行的,比较繁琐,又需要安装的与Docker相关的东西,会占用内存,以下提供另一种简单的只安装Docker引擎的安装教程

    (1)分别在3个节点上输入以下命令从阿里云上下载Docker的仓库配置文件

    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

    效果图:

    (2)分别在3个节点上输入以下命令命令安装Docker

    yum -y install docker-ce-20.10.17

    (3)分别在3个节点上输入以下命令启动Docker并设置Docker开机自启动

    systemctl enable docker && systemctl start docker

    master节点效果图:

    (4)分别在3个节点上输入以下命令查看Docker的版本

    docker version

    master节点效果图: 

    10、配置阿里云镜像加速器,加快对Docker镜像的下载速度(因为Docker的镜像仓库在国外,不配置,下载镜像的速度会比较慢甚至被墙了的话Docker镜像就下载不下来了,注意!!!3个节点都要设置)

    我的另一篇文章关于配置阿里云镜像加速器的教程,有需要的同学可以拿来参考:https://blog.csdn.net/m0_64284147/article/details/126807095

    11、K8s在1.24版本后并未抛弃docker,而是K8s的1.24版本以后移除了docker-shim,而Docker Engine默认又不支持CRI规范,因而二者将无法直接完成整合,为此,Mirantis和Docker联合创建了cri-dockerd项目,用于为Docker Engine提供一个能够支持到CRI规范的垫片,从而能够让Kubernetes基于CRI控制Docker ,所以想在K8s的1.24版本及以后的版本中使用docker,需要安装cri-dockerd,然后K8s集群通过cri-dockerd联系到docker(注意每个节点都要安装)

    项目地址:https://github.com/Mirantis/cri-dockerd

     (1)查看主机的系统内核版本

    uname -r

    master节点效果图: 

     

    (2)根据主机的系统内核版本来选择相应的包


    rpm二进制包:已经使用GCC编译后的(二进制已经可以被操作系统直接执行了)

    tar源码包:需要编译(源码包就是你能看懂的,基于字符的,还需要进行编译)


    (3)根据自己主机的系统内核版本下载相应的包

    例:

    wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.6/cri-dockerd-0.2.6-3.el7.x86_64.rpm

    master节点效果图: 

    (4)安装cri-dockerd

    例:

    yum install -y cri-dockerd-0.2.6-3.el7.x86_64.rpm

    效果图:

    (5)查看cri-dockerd.sock

    cd /var/run/

    12、分别在3个节点上添加阿里云的yum软件源

    1. cat > /etc/yum.repos.d/kubernetes.repo <<EOF
    2. [kubernetes]
    3. name=Kubernetes
    4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    5. enabled=1
    6. gpgcheck=1
    7. repo_gpgcheck=1
    8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    9. EOF

    master节点效果图:

    12、分别在3个节点上安装kubeadm、kubelet和kubectl(不选择版本会默认安装最新,我安装时kubeadm的最新版本为1.25.4)

    yum install -y --nogpgcheck kubelet kubeadm kubectl

    master节点效果图(仅供参考,反正安装过程中没报错就是安装成功了):

    13、查看安装的kubeadm的版本

    kubeadm version

    效果图: 

    kubeadm config images list

    效果图:

    14、分别在3个节点上设置开机自启动

    systemctl enable kubelet

    master节点效果图:


    另:附上取消开机自启动的命令

    systemctl disable kubelet

    15、整合kubelet和cri-dockerd


    需要注意的是,15及以下16步整合kubelet和cri-dockerd的操作也可以不用做,而是直接在后面的各种kubeadm命令后面加上“--cri-socket unix:///run/cri-dockerd.sock”选项。 (而且我也做了配置,不知道是不是我个人没配对的原因,最后还是没效果需要在后面的各种kubeadm命令后面加上“--cri-socket unix:///run/cri-dockerd.sock”选项)


    (1)编辑cri-docker.service文件

    vim /usr/lib/systemd/system/cri-docker.service

    (2)把ExecStart的属性值变成以下内容

    1. #各配置参数的解释
    2. --network-plugin:指定网络插件规范的类型,这里要使用CNI;
    3. --cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;
    4. --cni-cache-dir:CNI插件使用的缓存目录;
    5. --cni-conf-dir:CNI插件加载配置文件的目录;
    6. ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8 --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d

    效果图:

    (3)重载并重启cri-docker.service服务

    systemctl daemon-reload && systemctl restart cri-docker.service

    16、配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“

    (1)编辑文件/etc/sysconfig/kubelet(若没有则新建)

    vim /etc/sysconfig/kubelet

    (2)为KUBELET_EXTRA_ARGS添加以下指定参数

    KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"
    

    17、在master节点输入以下命令,对master节点做初始化(这个理论上配置完15、16步就不用在命令后面加--cri-socket unix:///var/run/cri-dockerd.sock这一选项,但我也尝试了,会报缺失--cri-socket unix:///var/run/cri-dockerd.sock这一选项的错误)

    1. #参数解释
    2. –apiserver-advertise-address:用于指定
    3. –image-repository: 指定镜像仓库地址
    4. kube-apiserver监听的ip地址,就是 master本机IP地址。
    5. –pod-network-cidr:用于指定Pod的网络范围
    6. kubeadm init --apiserver-advertise-address=192.168.194.128 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.25.4 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.224.0.0/16

    实际上还是需要加上“--cri-socket unix:///var/run/cri-dockerd.sock”这一选项才能进行kubelet和cri-dockerd的整合,下面这句初始化命令给各位同学参考:

    1. #参数解释
    2. –apiserver-advertise-address:用于指定
    3. –image-repository: 指定镜像仓库地址
    4. kube-apiserver监听的ip地址,就是 master本机IP地址。
    5. –pod-network-cidr:用于指定Pod的网络范围
    6. --cri-socket就是整合cri-docker
    7. kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --cri-socket unix:///var/run/cri-dockerd.sock

    注意:卡在这里不要慌,只是主机在下载镜像,有点慢而已

    master节点初始化成功的效果图(只要出现我截图里圈起来的提醒语句就是成功了): 

    然后往下看初始K8s时输出的日志,能看到初始化K8s后日志里给出了后续K8s的安装步骤,我们接下来按照日志里的提示来继续安装即可。

    18、根据日志的提示创建文件夹

    创建文件夹的目的是把客户端所使用的配置文件放进这个文件夹

    mkdir -p $HOME/.kube

    19、根据日志的提示把配置文件复制进刚刚新创建的文件夹里

    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

    20、根据日志的提示输入以下命令

    chown $(id -u):$(id -g) $HOME/.kube/config

    21、根据提示把worker节点加进master节点,复制你们各自在日志里的提示,然后分别粘贴在2个worker节点上,最后回车即可(注意要在后面加上--cri-socket unix:///var/run/cri-dockerd.sock这一参数,不然可能会失败)

    kubeadm join 192.168.194.128:6443 --token 8fcaro.ekkbz9l62zemm1js --discovery-token-ca-cert-hash sha256:81244cd26a3e7cf6dd49a74d9f1a765321a7951a548ecdeab2b30972ce75c92e --cri-socket unix:///var/run/cri-dockerd.sock

    效果图:

    worker1节点效果图: 

     worker2节点效果图:

    22、查看K8s集群node节点的状态

    kubectl get nodes

    效果图: 


    若报“The connection to the server localhost:8080 was refused - did you specify the right host or port?”的错误,可以参考我的另一篇文章来解决

    https://blog.csdn.net/m0_64284147/article/details/128072008


    23、使用calico给K8s集群做网络支撑

    calico是一种自定义的软件,并不是K8s集群的标准的资源对象

    (1)命令下载calico

    wget https://docs.projectcalico.org/manifests/tigera-operator.yaml

     效果图:

    (2)安装calico的operator

    kubectl create -f tigera-operator.yaml

    效果图:

    (3)下载自定义配置文件

    wget https://docs.projectcalico.org/manifests/custom-resources.yaml

    效果图:

    (4)打开刚刚下载完的custom-resources.yaml文件

    vim custom-resources.yaml

    效果图: 

    (5)修改custom-resources.yaml文件里cidr的值,然后保存并退出


     注意!!!注意!!!注意!!!

    这里cidr修改成17步初始化K8s时填的cidr,即10.224.0.0,我17步填的是10.224.0.0(如下命令所示),需要各位同学根据自己在17步填的cidr再在这里填一次,否则会出问题,后续会进行不下去

    1. #参数解释
    2. –apiserver-advertise-address:用于指定
    3. –image-repository: 指定镜像仓库地址
    4. kube-apiserver监听的ip地址,就是 master本机IP地址。
    5. –pod-network-cidr:用于指定Pod的网络范围
    6. --cri-socket就是整合cri-docker
    7. kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --cri-socket unix:///var/run/cri-dockerd.sock

    效果图: 

    (6)应用custom-resources.yaml配置文件

    kubectl apply -f custom-resources.yaml

    效果图:

    (7)实时查看网络插件部署情况

    watch kubectl get pods -n calico-system

    效果图:

    24、当calico网络插件下载完毕后重新查看K8s集群节点的状态,此时显示3个节点的STATUS都是Ready,至此K8s集群搭建成功。

    kubectl get nodes

     效果图:

    其他:

    1、报错信息

    1. Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/cri-dockerd.sock
    2. To see the stack trace of this error execute with --v=5 or higher

     2、原因:

    没有整合kubelet和cri-dockerd

    3、解决办法,在命令后面加上以下选项

    --cri-socket unix:///var/run/cri-dockerd.sock
    1. [root@worker2 ~]# kubeadm init --kubernetes-version=v1.25.4 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.194.128 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
    2. [init] Using Kubernetes version: v1.25.4
    3. [preflight] Running pre-flight checks
    4. [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
    5. [WARNING Hostname]: hostname "worker2" could not be reached
    6. [WARNING Hostname]: hostname "worker2": lookup worker2 on 8.8.8.8:53: no such host
    7. [preflight] Pulling images required for setting up a Kubernetes cluster
    8. [preflight] This might take a minute or two, depending on the speed of your internet connection
    9. [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

    2、卸载K8s的命令(同样需要在命令后面加上--cri-socket unix:///var/run/cri-dockerd.sock选项)

    kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock

    效果图:

    创作不易,如果这篇文章对你有帮助,希望能点个赞帮助文章的推广,如果文章有错漏,希望各位能批评指正,谢谢大家。

  • 相关阅读:
    Python- 文件处理
    界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?
    linux中的vim工具
    TensorFlow框架 -- 入门详解
    【前端】给第一次找工作的同学一些建议
    计算机毕业设计Java电子病历系统(源码+系统+mysql数据库+lw文档)
    Android11分区介绍
    上周内容回顾
    WPF开发随笔收录-WriteableBitmap绘制高性能曲线图
    Python Opencv实践 - 视频文件操作
  • 原文地址:https://blog.csdn.net/m0_64284147/article/details/127335593