• Centos7 安装部署 Kubernetes(k8s) 高可用集群


    1:基础环境准备

    宿主机系统集群角色服务器IP主机名称容器
    centos7.6master192.168.2.150ks-m1docker
    centos7.6master192.168.2.151ks-n1docker
    centos7.6master192.168.2.152ks-n2docker

    1.1 服务器初始化及网络配置

    VMware安装Centos7并初始化网络使外部可以访问**
    注意事项:请一定要看完上面这篇文章再执行下面的操作!!!

    集群版本说明

    • docker:20.10.8

    • kubeadm version: 1.22.12

    • kubectl version: 1.22.12

    • kubelet version: 1.22.12

    2:服务器参数配置

    2.1:配置主机名

    在192.168.2.150上执行如下:

    hostnamectl set-hostname ks-m1 && bash
    
    • 1

    在192.168.2.151上执行如下:

    hostnamectl set-hostname ks-n1 && bash
    
    • 1

    在192.168.2.152上执行如下:

    hostnamectl set-hostname ks-n2 && bash
    
    • 1

    注意事项:k8s的hostname有一定的命名规则,一般采用小写+横线(-),比如:k8s-test-m1-01,不能使用下划线(_),比如k8s_node_1

    2.2:配置hosts文件

    依次在192.168.2.150,192.168.2.151,192.168.2.152三台机器执行如下命令

    cat >> /etc/hosts << EOF
    192.168.2.150 ks-m1
    192.168.2.151 ks-n1
    192.168.2.152 ks-n2
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.3:关闭防火墙、selinux、关闭交换分区

    依次在192.168.2.150,192.168.2.151,192.168.2.152三台机器执行如下命令

    2.3.1:关闭防火墙
    systemctl stop firewalld
    
    • 1
    2.3.2:禁止防火墙开机启动
    systemctl disable firewalld
    
    • 1
    2.3.3:永久关闭selinux
    sed -i 's/enforcing/disabled/' /etc/selinux/config
    
    • 1

    注:重启机器后,selinux配置才能永久生效

    2.3.4:永久关闭交换分区swap
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    
    • 1

    注:重启机器后,才能永久生效

    2.4: 升级系统内核

    依次在192.168.2.150,192.168.2.151,192.168.2.152三台机器执行如下命令

    升级内核十分重要,低版本的内核下k8s集群不稳定,且对插件的兼容性不好,例如3.10版本的内核不支持网络插件Calico3.23版本等。

    共有两种开机引导模式:bios和uefi,其中uefi引导模式下需要关闭安全引导,否则无法正常开机。

    2.4.1:导入public key
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    
    • 1
    2.4.2:安装epel源
    yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
    
    • 1
    2.4.3:查看可用版本内核
    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
    
    • 1
    2.4.4:选择安装lt最新版本
    yum --enablerepo=elrepo-kernel install kernel-lt -y
    
    • 1
    2.4.5:关于内核种类:

    kernel-ml中的ml是英文【 mainline stable 】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。

    kernel-lt 中的lt是英文【 long term support 】的缩写,elrepo-kernel中罗列出来的长期支持版本。(推荐)

    2.4.6:设置内核启动顺序
    grub2-set-default 0
    
    • 1
    2.4.7:重新创建内核配置
    grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
    
    • 1
    2.4.8:重启验证
    reboot
    
    • 1

    使用uname -r查看内核版本是否升级成功

    uname -r
    
    • 1

    ###修改升级后的内核参数

    加载br_netfilter模块

    modprobe br_netfilter
    
    • 1

    验证模块是否加载成功

    lsmod | grep br_netfilter
    
    • 1

    2.5:修改内核参数

    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.6:使更改生效

    sysctl --system
    
    • 1
    • net.bridge.bridge-nf-call-iptables:开启桥设备内核监控(ipv4)

    • net.ipv4.ip_forward:开启路由转发

    • net.bridge.bridge-nf-call-ip6tables:开启桥设备内核监控(ipv6)

    以上3项为必须参数,其他参数可根据需要添加。

    2.7:配置yum源(采用阿里云repo源)

    2.7.1:下载常用的软件

    yum clean all && yum makecache  && yum repolist
    yum install -y vim net-tools  bash-completion wget lrzsz
    yum -y install yum-utils
    
    • 1
    • 2
    • 3

    2.7.2:下载常用的软件配置国内阿里云docker的repo源

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

    2.7.3:下载常用的软件 配置安装k8s组件需要的阿里云的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=0
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.8:下载常用的软件配置时间同步

    安装chronyd

    yum install -y chronyd
    
    • 1

    启动chronyd及加入开机自启

    systemctl start chronyd && systemctl enable chronyd 
    
    • 1

    修改/etc/chrony.conf配置文件,同步服务器地址为阿里云,增加一行(server ntp1.aliyun.com iburst,其余服务地址注释了)

    server ntp1.aliyun.com iburst
    
    • 1

    2.9:下载常用的软件配置IPVS

    安装依赖

     yum install  -y ipvsadm ipset sysstat conntrack libseccomp
    
    • 1

    修改配置文件

    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack ip_tables ip_set xt_set ipt_set ipt_rpfilter ipt_REJECT ipip "
    for kernel_module in \${ipvs_modules}; do
      /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
      if [ $? -eq 0 ]; then
        /sbin/modprobe \${kernel_module}
      fi
    done
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    给权限

    chmod 755 /etc/sysconfig/modules/ipvs.modules 
    
    • 1

    执行

    sh /etc/sysconfig/modules/ipvs.modules 
    
    • 1

    查询是否生效

    lsmod | grep ip_vs
    
    • 1

    3:安装Docker并配置Docker

    3.1:安装Docker

    yum install docker-ce-20.10.8 docker-ce-cli-20.10.8 containerd.io  -y
    
    • 1

    3.2:启动docker并设置开机自启

    systemctl start docker && systemctl enable docker.service && systemctl status docker
    
    • 1

    3.3:更改Docker默认配置文件

    vim /etc/docker/daemon.json
    
    • 1

    加入以下内容

    {
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    
    • 1
    • 2
    • 3

    参数说明:

    修改docker文件驱动为systemd,默认为cgroupfs,kubelet默认使用systemd,两者必须一致才可以。

    3.4:配置文件重新加载&重启docker

    systemctl daemon-reload
    systemctl restart docker
    
    • 1
    • 2

    查看是否生效

    docker info |grep Cgroup
    
    • 1

    在这里插入图片描述

    4:下载并安装kubeadm、kubectl、kubelet

    4.1:安装依赖

    yum install -y kubelet-1.22.12 kubeadm-1.22.12 kubectl-1.22.12
    
    • 1

    启用

    systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
    
    • 1
    • 上面可以看到kubelet状态不是running状态,这个是正常的,不用管,等k8s组件起来这个kubelet就正常了。
    • Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
    • kubelet: 安装在集群所有节点上,用于启动Pod的
    • kubectl: 通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

    4.2:设置Table命令补全

    让命令可用自动table键进行补全,对新手无法记住命令提供很好的支持,所在主机进行该操作方可使用table补全。

    Kubectl命令补全:

    kubectl completion  bash >  /etc/bash_completion.d/kubelet
    
    • 1

    Kubeadm命令补全:

    kubeadm  completion  bash >  /etc/bash_completion.d/kubeadm
    
    • 1

    5:初始化master节点

    注:只在k8s-m1上执行

    检测主机环境是否达到集群的要求,可根据结果提示进行逐一排除故障

    kubeadm init --dry-run
    
    • 1

    列出需要使用的镜像列表

    kubeadm config images list
    
    • 1

    5.1:拉取k8s镜像

    kubeadm config images pull  \
    --image-repository  registry.aliyuncs.com/google_containers \
    --kubernetes-version  v1.22.12
    
    • 1
    • 2
    • 3

    5.2:创建kubeadmin-init配置文件

    kubeadm config print init-defaults > kubeadm-init.yaml
    
    • 1

    5.3:编辑配置文件

    apiVersion: kubeadm.k8s.io/v1beta3
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      token: abcdef.0123456789abcdef
      ttl: 24h0m0s
      usages:
      - signing
      - authentication
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 192.168.2.150   #本机ks-m1的ip
      bindPort: 6443
    nodeRegistration:
      criSocket: /var/run/dockershim.sock
      imagePullPolicy: IfNotPresent
      name: ks-m1
      taints: 
      - effect: NoSchedule
        key: node-role.kubernetes.io/master #节点角色master
    ---
    apiServer:
      timeoutForControlPlane: 4m0s
      certSANs:
      - "172.17.0.252"
      extraArgs:
        authorization-mode: "Node,RBAC"
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    #controlPlaneEndpoint: 10.0.0.1:6443  #api server负载均衡IP配置(可选)
    clusterName: kubernetes
    cgroupDriver: systemd
    controllerManager: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: 1.22.12
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.10.0.0/16
    scheduler: {}
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: ipvs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    5.4:初始化集群

    kubeadm init --config kubeadm-init.yaml   --upload-certs
    
    • 1

    注:upload-certs 标志用来将在所有控制平面实例之间的共享证书上传到集群,若是不加会报错.

    根据初始化成功后的提示对集群进行基础的配置

    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    export KUBECONFIG=/etc/kubernetes/admin.conf
    echo "KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bashrc && source  ~/.bashrc
    
    • 1
    • 2
    • 3
    • 4
    • 5

    6:新增Node节点

    可通过上一步生成的join串加入

    依次在ks-n1,ks-n2执行

    kubeadm join *****:6443 --token pa6691.w9a5ucqewqeqwih8p4e8y2g     --discovery-token-ca-cert-hash sha256:cac5dc7e6c559e129bed3aeff757e3ba6da35ewqeqwec4b2734c4833d978c4c1859d5d8  
    
    • 1

    master查看集群状态:

    kubectl get nodes
    
    • 1

    通过查看集群状态可以看到,状态为NotReady,是因为还未安装网络插件,安装网络插件后就正常了,且node的点的角色为空,就表示这个节点是工作节点。

    将ks-n1的ROLES变成work:

    kubectl label node ks-n1 node-role.kubernetes.io/worker=worker
    
    • 1

    将ks-n2的ROLES变成work:

    kubectl label node ks-n2 node-role.kubernetes.io/worker=worker
    
    • 1

    7:安装网络插件Calico

    7.1:下载Calico.yaml

    curl https://projectcalico.docs.tigera.io/archive/v3.22/manifests/calico.yaml -O
    
    • 1

    7.2:调整calico.yaml文件

    进入vim编辑模式,按/CLUSTER_TYPE 搜索文件内容,找到下面的位置并新增两行配置
    在这里插入图片描述

    - name: IP_AUTODETECTION_METHOD
      value: "interface=ens33" 
    
    • 1
    • 2

    更改CALICO_IPV4POOL_IPIP的value为off

    注意:在安装calico网络时,默认安装是IPIP网络。calico.yaml文件中,将CALICO_IPV4POOL_IPIP的值修改成 “off”,就能够替换成BGP网络。ens33是根据自己机器的网络来调整的。这样可以避很多calico网络错误。
    在这里插入图片描述

    提前下载Calico镜像

    grep image calico.yaml
    
    • 1

    在这里插入图片描述

    7.3:下载calico相关的镜像

    docker pull calico/kube-controllers:v3.22.5
    docker pull calico/cni:v3.22.5
    docker pull calico/pod2daemon-flexvol:v3.22.5
    docker pull calico/node:v3.22.5
    
    • 1
    • 2
    • 3
    • 4

    7.4:安装Calico网络插件

    kubectl apply -f calico.yaml 
    
    • 1

    查看node节点和pod状态:

    kubectl get nodes
    kubectl get pods -n kube-system
    
    • 1
    • 2

    在这里插入图片描述

  • 相关阅读:
    SpringMVC Day 04 : 数据绑定
    Qt5开发及实例V2.0-第八章-Qt模型/视图结构
    C++ Webserver从零开始:代码书写(十)——完成Locker类和Log类封装
    word2vec原理
    linux环境下进程相关概念解释
    安卓讲课笔记5.11 菜单
    CH341/CH340Linux驱动使用教程
    手工解码SBI http2消息中的N1 nas(n1msg)消息
    MCM箱模型建模方法及大气O3来源解析
    pdf文档打不开是怎么回事?
  • 原文地址:https://blog.csdn.net/qq_41316955/article/details/132969773