1、准备三台虚拟机(要保证uuid不一样,如果是克隆的会因为uuid一样而引发报错)

系统:Linux、centos 7.9 、3 台可以联网
k8s 版本:1.23.1
docker 版本:20.10.16
注意: 如果是虚拟机网关不要设置 192.168.1.2,虚拟机 IP 不要设置 192.168.1.x,安装 kube-flannel 会报错,下面部分错误是其他版本报的错误,有些信息和上面指定版本不同

image-20240313112105121

我这里IP分别设置为:

HOSTNAMEIP ADDRESS
k8s-master192.168.1.110
k8s-node1192.168.1.111
k8s-node2192.168.1.112

设置主机名 HostName,三台服务器分别设置为 k8s-master、k8s-node1、k8s-node2

注意 这里的 hostname 只能包含 -. 这两种特殊符号,否则后面集群初始化会出现问题

# 192.168.1.110 上执行
hostnamectl set-hostname k8s-master 
# 192.168.1.111 上执行
hostnamectl set-hostname k8s-node1
# 192.168.1.112 上执行
hostnamectl set-hostname k8s-node2

给三台机器都添加内网 ip 映射关系

cat <<EOF >> /etc/hosts
192.168.1.110 k8s-master
192.168.1.111 k8s-node1
192.168.1.112 k8s-node2
EOF

分别测试能否 ping 通

ping k8s-master
ping k8s-node1
ping k8s-node2

2、基础环境准备(以下操作默认三台机器都执行)

  1. 关闭SELinux

    Linux 中关闭 SELinux 的方法(一般云服务器都已经关闭)

    • 临时关闭:输入命令 setenforce 0,重启系统后还会开启。

    • 永久关闭:输入命令 vim /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled,然后保存退出。

      # 也可以使用 sed 命令快捷替换
      sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
      
  2. 禁用iptablesfirewalld服务

    kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则。三台虚拟机需做同样操作:

    image-20240312182436822

    如果报错则先下载 iptables.service

    yum install iptables-services -y
    
    # 1 关闭firewalld服务
    systemctl stop firewalld
    systemctl disable firewalld
    # 2 关闭iptables服务
    systemctl stop iptables
    systemctl disable iptables
    
  3. 关闭swap分区

    虚拟机搭建需要关闭

    # 临时关闭
    swapoff -a
    
    # 永久关闭  
    vim /etc/fstab 
    #注释下面这行,或使用 sed 命令注释 sed -ri 's/.*swap.*/#&/' /etc/fstab
    #/dev/mapper/centos-swap swap                    swap    defaults        0 0
    

    查看是否关闭成功

    free -m
    

    若都显示 0 则表示关闭成功,需要重启服务器生效,可以使用 reboot 或 shutdown -r now 命令重启

    image-20240313113842622

    如果修改 swap 重启服务器报错,参考 https://blog.csdn.net/weixin_45492179/article/details/102709752,注释掉 /etc/fstab 文件 UUID 即可

  4. 同步网络时间

    集群中的时间必须要精确一致,我们可以直接使用chronyd服务从网络同步时间,三台服务器需做同样的操作

    #下载chrony工具
    yum install chrony
    

    image-20240312175527647

    同步时间、开机自启、查看时间

    systemctl start chronyd
    systemctl enable chronyd
    date
    

    image-20240312175719975

  5. 修改linux的内核参数

    我们需要修改linux的内核参数,添加网桥过滤和地址转发功能,编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:

    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    

    添加后进行以下操作:

    # 重新加载配置
    sysctl -p
    # 加载网桥过滤模块
    modprobe br_netfilter
    # 查看网桥过滤模块是否加载成功
    lsmod | grep br_netfilter
    

    同样是在三台服务器都进行操作,成功信息如下:

    image-20240312183454085

  6. 配置 ipvs 功能

    kubernetesservice有两种代理模型,一种是基于iptables的,一种是基于ipvs的 相比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

    # 安装ipset和ipvsadm
    yum install ipset ipvsadmin -y
    
    # 添加需要加载的模块写入脚本文件
    cat <<EOF > /etc/sysconfig/modules/ipvs.modules
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack_ipv4
    EOF
    # 为脚本文件添加执行权限
    chmod +x /etc/sysconfig/modules/ipvs.modules
    # 执行脚本文件
    /bin/bash /etc/sysconfig/modules/ipvs.modules
    # 查看对应的模块是否加载成功
    lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    

    image-20240312220933051

    完成以上配置后重启服务器

    reboot
    
  7. 添加yum源

    • 添加 k8s 的 yum 源 (如果不指定目录,默认 kubernetes.repo 文件在当前目录)

      cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
      enabled=1
      gpgcheck=1
      repo_gpgcheck=0
      gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      EOF
      
    • 添加 docker 的 yum 源

      yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
      

3、安装k8s组件、docker

  1. 安装k8s组件

    若安装指定版本 docker 可运行 yum list kubelet --showduplicates | tail -n 10 查看版本号
    若安装指定版本 k8s 组件可运行 yum list docker-ce --showduplicates | sort -r 查看版本号,(注意:不要选择过高版本,我安装的 1.23.1,1.24.0 会报错)

    yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1
    
    • Kubectl: Kubectl 管理 Kubernetes 集群命令行工具
    • kubeadm:Kubeadm 是一个快捷搭建 kubernetes(k8s) 的安装工具, 它提供了 kubeadm init 以及 kubeadm join 这两个命令来快速创建 kubernetes 集群
    • kubelet:kubelet 是在每个 Node 节点上运行的主要 “节点代理”。
  2. 指定版本安装docker()

    #如果存在历史版本先删除历史版本
    yum remove docker-ce docker-ce-cli containerd.io
    #删除资源
    rm -rf /var/lib/docker  # docker默认的工作路径
    rm -rf /var/lib/containerd
    
    yum install docker-ce-20.10.16
    
  3. 启动并设置开机启动

    systemctl enable kubelet && systemctl start kubelet # 开机自启动并启动 kubelet 服务
    systemctl enable docker && systemctl start docker # 开机自启动并启动 docker 服务
    
  4. 修改docker配置

    官方建议修改 docker Cgroup Driver 为 systemd

    文件不存在如下方式添加,如果文件存在 vi 进入 /etc/docker/daemon.json 文件添加 “exec-opts”: [“native.cgroupdriver=systemd”] 即可

    cat <<EOF > /etc/docker/daemon.json
    {
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://o0cjppoy.mirror.aliyuncs.com"]
    }
    EOF
    
    systemctl daemon-reload && systemctl restart docker # 重启完之后可使用 docker info 查看是否修改成功
    

    image-20240313141650334

4、kubeadm初始化集群(只需要在主节点执行)

注意: 失败了要使用用 kubeadm reset 重置

# 初始化集群控制台 Control plane
# apiserver-advertise-address: master 节点 IP
# image-repository:镜像仓库地址
# kubernetes-version: 版本号
# pod-network-cidr 和 service-cidr 不清楚如何设置,使用该默认值
# 查看其他默认值可使用命令: kubeadm config print init-defaults > kubeadm.yaml 查看默认初始化文件
kubeadm init \
--apiserver-advertise-address=192.168.1.110 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.1 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/16 

常见错误可参考:https://blog.csdn.net/IT_Java_Roy/article/details/104631745

初始化成功,记得把 kubeadm join xxx 保存起来,忘记了重新获取:
kubeadm token create --print-join-command 默认 24h 过期
kubeadm token create --print-join-command --ttl=0 永不过期
kubeadm token list 查看是否有存活的 token
image-20240313142319029

5、授权节点访问控制集群

初始化成功可以看到提示信息,配置成功可以使用 kubectl 控制集群

image-20240313142439338

复制主节点授权文件到其他节点,以便 kubectl 的 node 节点也有权限访问集群

  1. master节点添加认证(在主节点上执行)

    kubectl 的 master 节点初始化成功会生成 /etc/kubernetes/admin.conf 认证文件

    • 方法一:添加环境变量

      echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
      source /etc/profile
      
    • 方法二:修改认证文件访问权限

      mkdir -p $HOME/.kube
      cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      chown $(id -u):$(id -g) $HOME/.kube/config
      
  2. node节点添加认证

    如果上面 master 认证使用的方式二,则将 HOME/.kube/config 文件复制到 node 节点 HOME/.kube 路径下,node 节点也可以访问 kubectl 集群,配置环境方式类似。

    # 将 master 节点 config 文件通过 scp 命令传递到 node 子节点
    # 不能直接使用 scp 命令复制$HOME/.kube/config 文件,使用如下方法或文件传输工具
    mkdir -p $HOME/.kube # node 节点执行
    scp /etc/kubernetes/admin.conf root@node1:/root/.kube/config # master 节点
    chown $(id -u):$(id -g) $HOME/.kube/config # node 节点
    

6、node工作节点加入集群

把工作节点加入集群(只在工作节点执行),kubeadm master 节点初始化集群保存的 kubeadm join

# 上面master初始化成功后直接复制过来
kubeadm join 192.168.1.110:6443 --token xxxx.xxxxxxvo7dvwgklu \
        --discovery-token-ca-cert-hash sha256:c1d9d1ea69baf12ac030a8fdb30a977d93aebdc6990264450b9f4d703df4d067

master节点查看集群节点信息

kubectl get nodes

image-20240313143535369

注意: 如果 node 节点加入集群报错,使用 journalctl -xefu kubelet 查看日志,再次执行 kubeadm join 命令前使用 kubeadm reset 重置

7、安装网络插件

节点加入集群成功,使用 kubectl get nodes 查看节点信息,发现都是 NotReady,需要在主节点安装网络插件 Flannel 或 Calicos

  • Flannel 是一种基于 overlay 网络的跨主机容器网络解决方案,也就是将 TCP 数据包封装在另一种网络包里面进行路由转发和通信。

  • Flannel 配合 etcd 可以实现不同宿主机上的 docker 容器内网 IP 的互通。

安装网络插件,否则 node 是 NotReady 状态(主节点跑,安装可能需要几分钟)

# 很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 也可以使用如下方式安装 flannel 组件,先下载  yaml 文件
wget -c  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 
kubectl apply -f kube-flannel.yml

# 如果要卸载 flannel 可以使用如下方式,根据你安装时的方式选择
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# kubectl delete -f kube-flannel.yml

# r如果要安装 calico,使用如下方式
# kubectl apply -f https://projectcalico.docs.tigera.io/manifests/calico.yaml

安装完成等几分钟所有节点状态从 NotReady 变为 Ready

image-20240313143717677

查看所有系统的 pod,保证每个都是运行状态,如果还有失败的,排查错误
image-20240313143745458

更多 kubectl 命令可参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

kubeadm reset报错 参考处理方案: https://blog.csdn.net/weixin_38146924/article/details/117519139