• CentOS 9安装Kubernetes(k8s)集群


    前言

    1、版本说明

    系统版本:CentOS 9

    k8s版本:v1.29.5

    docker版本:26.1.3

    harbor:v2.9.4

    2、提前准备好1台虚拟机,可以参考博客:Vmware 17安装 CentOS9

    3、虚拟机提前安装好docker,参考博客:CentOS7安装docker以及docker-compose

    4、如果部署k8s集群的时候使用个人的镜像仓库,请提前部署好,本人使用的是harbor搭建的私有仓库,可以参考博客:搭建Harbor镜像仓库

    5、集群部署参考官方文档:使用 kubeadm 创建集群 | Kubernetes 

    6、集群中的网络插件安装文档参考:Calico网络插件安装

    7、以下是本人4台虚拟机的ip地址以及主机名信息,其中一台为镜像仓库

    节点主机名ip
    主节点k8s-master192.168.65.130
    节点1k8s-node1192.168.65.131
    节点2k8s-node2192.168.65.132
    私有镜像仓库k8s-harbor192.168.65.135

    三台虚拟机环境准备

    克隆3台虚拟机

    我这里已经安装好了一台CentOS 9的虚拟机,并且此虚拟机已经安装好了docker环境,在此虚拟机基础上克隆出来3台。

    1、开始克隆

    2、直接下一步

    3、选择虚拟机中的当前状态,然后点击下一步

    4、选择创建完整克隆,点击下一步

    5、输入虚拟机名称,选择存储位置,点击完成

     6、等待克隆完成,点击关闭

    7、重复步骤1-6,克隆出另外2台虚拟机,我的另外两台虚拟机名称分别为node1和 node2,克隆完成后如下,总共3台

    修改虚拟机信息

    修改虚拟机的 mac地址

    1、点击编辑虚拟机设置

    2、硬件-----网络适配器-----高级

    3、点击生成,生成新的mac地址 ,然后点击确定

     4、点击处理器,勾选虚拟化引擎,然后点击确定

    5、重复步骤1-4,修改另外2台虚拟机的mac地址,勾选虚拟化选项

    修改虚拟机主机名、ip地址和uuid 

    1、点击开启此虚拟机,启动虚拟机,使用终端登录虚拟机

    2、修改虚拟机主机名称

    1. # 修改主机名
    2. hostnamectl set-hostname k8s-master
    3. # 查看主机名
    4. hostname

    3、修改虚拟机ip地址和uuid

    3.1、生成UUID

    uuidgen

    3.2、修改网卡信息

    vim /etc/NetworkManager/system-connections/ens160.nmconnection

     修改以下信息并保存,新的ip地址要在vmware分配的ip范围内

    4、重新启动网卡

    nmcli connection reload ens160

     5、重复步骤1-4修改另外2台虚拟机的信息

    关机做快照 (可选)

    1、以上操作做好之后,防止后面做集群的时候出问题,我这里先关机做个快照(关机做快照速度快),这一步并非是必须要做的,看个人情况。

    2、做好快照后,记得重新启动所有虚拟机 

    集群前置工作(三台机器都执行)

    修改hosts

    1、修改hosts,域名映射 命令如下

    1. echo "192.168.65.130 k8s-master.com k8s-master" >> /etc/hosts
    2. echo "192.168.65.131 k8s-node1.com k8s-node1" >> /etc/hosts
    3. echo "192.168.65.132 k8s-node2.com k8s-node2" >> /etc/hosts
    4. echo "192.168.65.135 k8s-harbor.com k8s-harbor" >> /etc/hosts

    2、另外2台也同样操作,最终3台虚拟机的hosts如下,我这里把镜像仓库的那台机器也做了域名映射,方便后面使用

    k8s-master

    k8s-node1

     k8s-node2

    关闭防火墙

    关闭防火墙,并禁止开机自启。修改防火墙的状态后需要把docker重启下

    1. # 关闭防火墙
    2. systemctl stop firewalld.service
    3. # 禁止开机自启
    4. systemctl disable firewalld.service
    5. # 重启docker
    6. systemctl restart docker

    docker镜像加速

    registry-mirrors:镜像加速地址,我这里使用的是阿里云的镜像加速器

    insecure-registries:私有仓库地址,我这里使用的是自己的harbor仓库,如果你没有使用个人仓库也可以不用加

    1. sudo mkdir -p /etc/docker
    2. sudo tee /etc/docker/daemon.json <<-'EOF'
    3. {
    4. "registry-mirrors": ["https://******.mirror.aliyuncs.com"],
    5. "insecure-registries": ["192.168.65.135","k8s-harbor.com"]
    6. }
    7. EOF
    8. sudo systemctl daemon-reload
    9. sudo systemctl restart docker

    docker开机自启

    systemctl enable docker

    安装容器运行时

    转发 IPv4 并让 iptables 看到桥接流量

    vm.swappiness参数记得加上,禁止交换分区 

    1. cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
    2. overlay
    3. br_netfilter
    4. EOF
    5. sudo modprobe overlay
    6. sudo modprobe br_netfilter
    7. # 设置所需的 sysctl 参数,参数在重新启动后保持不变
    8. cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
    9. net.bridge.bridge-nf-call-iptables = 1
    10. net.bridge.bridge-nf-call-ip6tables = 1
    11. net.ipv4.ip_forward = 1
    12. vm.swappiness = 0
    13. EOF
    14. # 应用 sysctl 参数而不重新启动
    15. sudo sysctl --system

    关闭交换分区

    1. # 临时关闭
    2. swapoff -a
    3. # 永久关闭
    4. sed -ri 's/.*swap.*/#&/' /etc/fstab

    确认 br_netfilteroverlay 模块被加载

    1. lsmod | grep br_netfilter
    2. lsmod | grep overlay

    系统变量是否被设置为 1

    sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

    安装配置containerd

    安装containerd(略过)

    这一步在安装docker的时候已经安装过了,不在重复安装,安装docker的时候会安装containerd.io,具体命令如下图

    下面是官方文档的参考地址

    https://github.com/containerd/containerd/blob/main/docs/getting-started.md
     配置containerd

    1、查看默认内容

    cat /etc/containerd/config.toml

    2、生成默认配置内容

    containerd config default > /etc/containerd/config.toml

    3、修改生成的文件内容

    vim /etc/containerd/config.toml

     主要修改三个地址

    1、SystemdCgroup的值改为true
    SystemdCgroup = true

    2、替换sandbox的镜像地址和版本
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

    3、添加镜像加速
    [plugins]
        [plugins."io.containerd.grpc.v1.cri".registry]
          ...
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
          # 以下内容为新添加
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://te2osmuz.mirror.aliyuncs.com"]
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
            endpoint = ["registry.aliyuncs.com/google_containers"]

          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s-harbor.com"]
             endpoint = ["http://k8s-harbor.com:80"]

    3.1、修改SystemdCgroup的值

    3.2、修改sandbox的镜像地址和版本

    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

    3.3、添加私有镜像

    1. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
    2. endpoint = ["https://te2osmuz.mirror.aliyuncs.com"]
    3. [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
    4. endpoint = ["registry.aliyuncs.com/google_containers"]
    5. ​​​​​​​[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s-harbor.com"]
    6. endpoint = ["http://k8s-harbor.com:80"]

    重启containerd
    1. systemctl daemon-reload
    2. systemctl restart containerd
    3. systemctl status containerd

    禁用SELinux

    将 SELinux 设置为 permissive 模式(相当于将其禁用)

    1. sudo setenforce 0
    2. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

    安装工具

    添加 Kubernetes 的 yum 仓库

    关于如何设置阿里云镜像源可以参考:Kubernetes镜像

    1. cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
    2. [kubernetes]
    3. name=Kubernetes
    4. baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
    5. enabled=1
    6. gpgcheck=1
    7. gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
    8. EOF

    安装

    yum install -y kubelet kubeadm kubectl

    启动kubelet 

    systemctl enable kubelet && systemctl start kubelet

     查看状态

    kubelet会一直重启,这是正常现象,等集群初始化好之后就可以正常启动了

    systemctl status kubelet

    主节点初始化 (以下操作只在主节点执行)

    生成默认配置文件

    kubeadm config print init-defaults > kubeadm.conf

    v1.29.5版本输出内容如下:

    1. apiVersion: kubeadm.k8s.io/v1beta3
    2. bootstrapTokens:
    3. - groups:
    4. - system:bootstrappers:kubeadm:default-node-token
    5. token: abcdef.0123456789abcdef
    6. ttl: 24h0m0s
    7. usages:
    8. - signing
    9. - authentication
    10. kind: InitConfiguration
    11. localAPIEndpoint:
    12. advertiseAddress: 1.2.3.4
    13. bindPort: 6443
    14. nodeRegistration:
    15. criSocket: unix:///var/run/containerd/containerd.sock
    16. imagePullPolicy: IfNotPresent
    17. name: node
    18. taints: null
    19. ---
    20. apiServer:
    21. timeoutForControlPlane: 4m0s
    22. apiVersion: kubeadm.k8s.io/v1beta3
    23. certificatesDir: /etc/kubernetes/pki
    24. clusterName: kubernetes
    25. controllerManager: {}
    26. dns: {}
    27. etcd:
    28. local:
    29. dataDir: /var/lib/etcd
    30. imageRepository: registry.k8s.io
    31. kind: ClusterConfiguration
    32. kubernetesVersion: 1.29.0
    33. networking:
    34. dnsDomain: cluster.local
    35. serviceSubnet: 10.96.0.0/12
    36. scheduler: {}

    修改配置文件内容

    主要修改以下几个地方

    1、advertiseAddress:改为当前主机的ip地址

    2、nodeRegistration.name:改为当前主机的hostname

    3、imageRepository:我这里改成自己的私人仓库地址了,如果自己有的话可以改成自己的,没有的话可以改成阿里云的镜像源地址:registry.aliyuncs.com/google_containers

    4、新添加KubeletConfiguration,指定驱动类型。内容如下:

    ---

    kind: KubeletConfiguration
    apiVersion: kubelet.config.k8s.io/v1beta1
    cgroupDriver: systemd

    5、serviceSubnet:这个看情况,如果自己想改的话也可以改,我这里用的默认的

    6、podSubnet:指定容器的ip段 

    7、kubernetesVersion:改为当前对应的版本

    上传镜像到私有仓库

    如果不使用私有镜像仓库的可以直接跳过这一步。直接开始下面的初始化

    脚本内容如下push_images.sh

    1. #!/bin/bash
    2. # 登录私有仓库
    3. res=`docker login -u $1-p $2 k8s-harbor.com`
    4. images=$(kubeadm config images list --kubernetes-version v1.29.5 | awk -F '/' '{print $NF}')
    5. for item in ${images}
    6. do
    7. docker pull registry.aliyuncs.com/google_containers/${item}
    8. # 镜像重新打标签
    9. docker tag registry.aliyuncs.com/google_containers/${item} k8s-harbor.com/google_containers/${item}
    10. # 上传到私有仓库
    11. docker push k8s-harbor.com/google_containers/${item}
    12. done

    赋予可执行权限

    1. chmod +x push_images.sh
    2. # 执行脚本,记得传入参数
    3. ./push_images

    脚本执行结束后就可以在私有仓库中看到刚才上传的镜像了

    开始初始化

    kubeadm.conf:自定义的配置文件的名称

    kubeadm init --config kubeadm.conf

    将下面这段话复制下来,后面会用到

    1. Your Kubernetes control-plane has initialized successfully!
    2. To start using your cluster, you need to run the following as a regular user:
    3. mkdir -p $HOME/.kube
    4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
    6. Alternatively, if you are the root user, you can run:
    7. export KUBECONFIG=/etc/kubernetes/admin.conf
    8. You should now deploy a pod network to the cluster.
    9. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
    10. https://kubernetes.io/docs/concepts/cluster-administration/addons/
    11. Then you can join any number of worker nodes by running the following on each as root:
    12. kubeadm join 192.168.65.130:6443 --token abcdef.0123456789abcdef \
    13. --discovery-token-ca-cert-hash sha256:8eaeb4ce72361621049e32c458d0a931e6e0f6d543529287c63d1c7dc4b35c34

    创建配置文件

    按照初始化成功的提示开始创建配置文件

    1. mkdir -p $HOME/.kube
    2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

    安装网络插件

    这里安装的网络插件是Calico官方文档

    下载并执行配置文件

    文件下载后要使用kubectl create 命令去执行,不要使用kubectl apply ,官方文档对这个有特别说明

    wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/tigera-operator.yaml
    kubectl create -f tigera-operator.yaml

    wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml

    修改custom-resources.yaml

    vim custom-resources.yaml

    修改cidr的值

    1. calicoNetwork:
    2. ipPools:
    3. - name: default-ipv4-ippool
    4. blockSize: 26
    5. cidr: 192.168.110.0/24 # 修改为kubeadm.conf中podSubnet的值

    执行 custom-resources.yaml

    kubectl create -f custom-resources.yaml

    节点加入

    节点node1加入

     在node1上执行以下命令

    1. kubeadm join 192.168.65.130:6443 --token abcdef.0123456789abcdef \
    2. --discovery-token-ca-cert-hash sha256:8eaeb4ce72361621049e32c458d0a931e6e0f6d543529287c63d1c7dc4b35c34

    节点node2加入 

    1. kubeadm join 192.168.65.130:6443 --token abcdef.0123456789abcdef \
    2. --discovery-token-ca-cert-hash sha256:8eaeb4ce72361621049e32c458d0a931e6e0f6d543529287c63d1c7dc4b35c34

    在master查看节点信息

     如果节点显示NotReady,则等待几分钟,等所有pod创建完成即可

    所有节点加入成功

    安装kubepi

    我这里并没有安装官方的可视化控制面板,而是使用了另外一个可视化管理工具kubepi

    下载镜像

    docker pull 1panel/kubepi

     创建挂载目录

    mkdir -p /root/server/kubepi

    启动镜像

    1. docker run --privileged -p 8010:80 \
    2. --name kubepi \
    3. -v /root/server/kubepi:/var/lib/kubepi \
    4. --restart=unless-stopped \
    5. -d 1panel/kubepi

    访问kubepi

    访问地址:ip:port 例如我的:192.168.65.130:8010

    默认的账户名和密码:admin/kubepi

     导入k8s集群

    点击导入按钮,配置k8s。k8s的配置信息在$HOME/.kube/config中

    查看集群信息 

    集群搭建过程常见问题

    1、安装网络插件calico域名raw.githubusercontent.com无法访问

    可以使用第三方网站查看dns对应的ip地址,然后修改自己的hosts文件,这里只是举个例子

    1. # 修改hosts
    2. vim /etc/hosts
    3. # 追加以下内容
    4. 185.199.111.133 raw.githubusercontent.com
    5. # 重新下载文件

    2、no matches for kind "Installation" in version "operator.tigera.io/v1"

    1、这个是在安装Calico网络插件的时候遇到的,主要原因是因为我安装的时候使用的是kubectl apply命令,将其更换为kubectl create即可 ,具体原因可以参考官网说明

    2、如果不是因为执行命令的问题,就是Calico版本不匹配,更换为合适的版本即可

    3、机器重启后kubelet起不起来

    1、看下是不是之前关闭交换分区的时候只是临时关闭了(swapoff -a)具体原因可以参考报错日志,我的没启起来是因为交换分区重启后又打开了,永久关闭即可,永久关闭的命令文章中已提过。

    2、确保kubelet、docker、容器运行时(containerd)已启动

    补充说明

    文章中有两个地方配置了镜像仓库的地址

    1、docker的配置文件/etc/docker/daemon.json文件,这个是使用docker拉取镜像是使用的加速器和仓库地址

    2、容器运行时containerd的配置/etc/containerd/config.toml文件,因为这里使用的容器运行时是containerd,所以k8s拉取镜像的时候不会使用docker命令,而是使用crictl命令,所以k8s拉取镜像的时候会使用config.toml文件中关于镜像相关的配置

    结束语

    以上便是k8s集群的整个部署过程,部署过程中需要下载镜像信息,可以使用给的脚本将其提前下载下来 ,对于k8s的网络插件官方文档提供了多种,可以根据情况自行安装其中一个即可。最重要的一点要保证kubelet、docker、容器运行时(containerd)设置为开机自启。可以使用命令查看是否开启开机自启:systemctl is-enabled <服务名称>

  • 相关阅读:
    操作步骤:EasyCVR平台国标GB设备如何正确配置告警预案?
    C++零碎记录(十三)
    【英语:发音基础】A2.单词、句子、意群发音
    锁竞争导致的慢sql分析
    基于Springboot的人事管理系统 (有报告)。Javaee项目,springboot项目。
    简单的网页制作期末作业——HTML+CSS+JavaScript小礼品购物商城网站
    Notepad++官网地址及使用十六进制查看文件的详细教程
    STM32F103学习笔记 | 4.STM32F103芯片介绍
    类和对象(一)this指针详解
    c++ 多态的
  • 原文地址:https://blog.csdn.net/LSW_JAVADP/article/details/139278119