• Kubeadm搭建K8s集群


    1. 准备工作

    所有集群节点都进行配置,服务器环境如下:

    • 虚拟机:VMware Fusion12.1.2
    • 操作系统:CentOS7.6.18;
    • 系统内核:5.4.173-1.el7.elrepo.x86_64
    主机名 IP地址 配置
    k8s-master 10.0.0.11 2核2G
    K8s-node1 10.0.0.12 1核1G
    K8s-node2 10.0.0.13 1核1G

    1.1 解析主机名

    在每个集群节点中的hosts中加入主机名映射:

    cat <<EOF >> /etc/hosts
    10.0.0.11 k8s-master	# K8s主节点
    10.0.0.12 k8s-node1		# K8s从节点
    10.0.0.13 k8s-node2		# K8s从节点
    EOF
    

    分别修改主机名:

    hostnamectl set-hostname k8s-master	 # 在master上执行
    hostnamectl set-hostname k8s-node1	 # 在node1上执行
    hostnamectl set-hostname k8s-node2	 # 在node2上执行
    

    1.2 同步时间

    # 设置时区
    timedatectl set-timezone Asia/Shanghai
    timedatectl
    
    # 安装chrony同步工具
    yum makecache fast
    yum -y install chrony
    systemctl start chroynd
    systemctl enable --now chronyd
    
    # 强制同步时间
    chronyc -a makestep
    date
    

    1.3 关闭防火墙

    关闭firewalldiptables服务

    # firewalld
    systemctl stop firewalld 
    systemctl disable firewallld
    
    # iptables
    systemctl stop iptables
    systemctl disable iptables
    

    1.4 禁用selinux

    selinux是linux系统下的一个安全服务,可能引发一些问题

    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
    setenforce 0
    

    1.5 禁用swap分区

    Kubernetes v1.8+要求关闭系统 Swap,Swap指虚拟内存分区

    # 注释swap相关的行
    sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
    swapoff -a
    sysctl -w vm.swappiness=0
    

    1.6 配置网桥转发

    将桥接的IPv4流量传递到iptables的链

    cat <<EOF >/etc/sysctl.d/kubernetes.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    
    # 重新加载
    sysctl --system
    
    # 加载过滤模块
    modprobe br_netfilter
    
    # 查看是否成功
    lsmod | grep br_netfilter	
    

    1.7 配置ipvs功能

    在K8s中kube-proxy有iptablesipvs两种代理模型,ipvs性能较高,但需要手动载入ipset和ipvsadm模块

    # ⚠️ 系统内核为4.19+时,执行此操作
    yum install -y ipset ipvsadm
    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
    EOF
    
    chmod 755 /etc/sysconfig/modules/ipvs.modules
    bash /etc/sysconfig/modules/ipvs.modules
    lsmod|grep -e ip_vs -e nf_conntrack
    
    # ⚠️ 系统内核低于4.19,执行此操作
    yum install -y ipset ipvsadm
    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
    nf_conntrack
    EOF
    
    chmod 755 /etc/sysconfig/modules/ipvs.modules
    bash /etc/sysconfig/modules/ipvs.modules 
    lsmod|grep -e ip_vs -e nf_conntrack_ipv4
    
    # 最后重启服务器
    reboot
    

    2. 安装Docker

    docker是K8s集群的基础服务组件,需在每个集群节点上安装docker服务,安装流程可参考Docker安装教程

    K8s推荐的Cgroup是systemd, 修改Docker的Cgroup Driver

    # 查看docker的Cgroup Driver,默认为cgroupfs
    docker info|grep Cgroup
    
    # 修改Cgroup,若daemon.json不存在,则手动创建
    cat /etc/docker/daemon.json
    {
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    
    # 重启服务
    systemctl daemon-reload
    systemctl restart docker
    

    3. 安装Node组件

    在所有服务节点上安装kubeadm, kubelet和kubectl

    # 配置阿里云yum仓库
    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
    
    # 查看可用的版本
    yum list kubectl --showduplicates
    
    # 注意⚠️:如果仅安装kubeadm,则会自动安装最新版本kubelet和kubectl
    yum -y install kubeadm-1.22.6 kubelet-1.22.6 kubectl-1.22.6
    
    # 注意⚠️:将添加到启动项,无需启动
    systemctl enable kubelet
    systemctl status kubelet
    
    # 查看版本
    kubeadm version
    kubectl version
    kubelet --version
    

    修改kubelet的Cgroup:

    # 修改kubelet的Cgroup
    cat <<EOF > /etc/sysconfig/kubelet
    KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    KUBE_PROXY_MODE="ipvs"
    EOF
    

    4. 配置Master服务

    # 查看kubeadm使用的镜像
    kubeadm config images list
    
    # 可预先拉取镜像,或下一步init时自动拉取
    # kubeadm config images pull
    kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
    
    # 注意⚠️:只需修改第一项的IP,其余不用动
    kubeadm init \
    --apiserver-advertise-address=10.0.0.11 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version=v1.22.6 \
    --pod-network-cidr=10.244.0.0/16 \
    --service-cidr=10.96.0.0/12
    
    #  此时,会得到「kubeadm join」的token信息
    
    # 使用kubectl工具
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    

    5. 加入Node节点

    在Node节点执行kubeadm join命令,将node加入集群。

    # 在master节点获取token,同「kubeadm init」得到的token信息
    kubeadm token create --print-join-command --ttl 0
    
    kubeadm join 10.0.0.11:6443 --token 05mmas.1kl...dz --discovery-token-ca-cert-hash sha256:16752bf...9c1e2f3c6
    

    6. 部署CNI网络组件

    Kubernetes支持多种网络插件,如 flannel、calico、canal等,这里选择使用「flannel

    # master上操作
    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
    # 查看pods节点信息(所有节点的状态为:Running,说明正常)
    kubectl get pods -n kube-system
    kubectl get nodes
    

    查看集群健康状态:

    kubectl get cs
    kubectl cluster-info
    

    7. 测试Nginx服务

    [root@k8s-master ~]# kubectl create deployment nginx --image=nginx
    deployment.apps/nginx created
    [root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
    service/nginx exposed
    [root@k8s-master ~]# kubectl get pod,svc
    NAME                         READY   STATUS              RESTARTS   AGE
    pod/nginx-6799fc88d8-6nl9d   0/1     ContainerCreating   0          4s
    
    NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        48m
    service/nginx        NodePort    10.97.165.25   <none>        80:31080/TCP   4s
    
    # 也可以修改服务配置
    [root@k8s-master ~]# export KUBE_EDITOR="vim"
    [root@k8s-master ~]# kubectl edit svc nginx
    

    访问任意节点上Nginx的Web服务,都会看到熟悉的Welcome to nginx! 页面!

    http://10.0.0.11:31080/
    http://10.0.0.12:31080/
    http://10.0.0.13:31080/


    总结

    • 安装异常,可执行journalctl -xefu kubelet 查看日志
    • master推荐最小配置为1核心2G,否则会出现以下错误!
    [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
    [ERROR Mem]: the system RAM (947 MB) is less than the minimum 1700 MB
    
    • 必须配置hostname和hosts,且名称必须对应一致。
    [WARNING Hostname]: hostname "XXX" could not be reached
    [WARNING Hostname]: hostname "XXX": lookup vm02 on 114.114.114.114:53: no such host
    

    参考资料

    https://huangzhongde.cn/istio/Chapter2/Chapter2-4.html
    https://www.cnblogs.com/xuweiweiwoaini/p/13884112.html
    https://gitee.com/ylp657/kubernetes/tree/master#kubernetes

  • 相关阅读:
    HLJU 1221: 高考签到题 (三分求极值)
    [视频解说]Java(JDK的下载安装及第一个程序执行)
    llvm中如何利用分支概率和基本块频率估计
    Nginx SSL TLS部署最佳实践
    Nginx使用教程(一):Nginx编译参数详解
    Nginx使用教程(一):下载并编译安装Nginx
    nginx使用ssl模块配置HTTPS支持
    Linux下安装Tomcat服务器和部署Web应用
    TOMCAT-报错The BASEDIR environment variable is not defined correctly
    Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件
  • 原文地址:https://www.cnblogs.com/Hollson/p/15914425.html
Copyright © 2020-2023  润新知