• CentOS7 部署 k8s


    准备两台虚拟机
    192.168.152.129
    192.168.152.130
    更改主机名
    192.168.152.129:
    hostnamectl set-hostname k8s-master
    hostnamectl
    192.168.152.130:
    hostnamectl set-hostname k8s-node1
    hostnamectl

    master节点配置

    1.配置hosts

    在两台节点上执行vim /etc/hosts
    把两台虚拟机ip地址加到后面;

    192.168.152.129 k8s-master
    192.168.152.130 k8s-node1
    
    • 1
    • 2

    2.安装依赖包

    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vimnet-tools git

    3.配置防火墙

    设置防火墙为 Iptables 并设置空规则
    systemctl stop firewalld && systemctl disable firewalld
    yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

    4.关闭selinux

    使用命令永久关闭selinux
    sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

    5.关闭swap分区

    临时关闭 swapoff -a
    # 永久关闭,下次生效 sed -ri 's/.*swap.*/#&/' /etc/fstab

    6.调整内核参数

    cat > kubernetes.conf << EOF
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    net.ipv4.ip_forward=1
    net.ipv4.tcp_tw_recycle=0
    vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
    vm.overcommit_memory=1 # 不检查物理内存是否够用
    vm.panic_on_oom=0 # 开启 OOM
    fs.inotify.max_user_instances=8192
    fs.inotify.max_user_watches=1048576
    fs.file-max=52706963
    fs.nr_open=52706963
    net.ipv6.conf.all.disable_ipv6=1
    net.netfilter.nf_conntrack_max=2310720
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
    sysctl -p /etc/sysctl.d/kubernetes.conf

    7.调整系统时区

    rm -f /etc/localtime
    ln -sf /usr/share/zoneinfo/Asia/Shanghai
    reboot

    8.关闭系统不需要的服务

    systemctl stop postfix && systemctl disable postfix

    9.设置 rsyslogd 和 systemd journald

    mkdir /var/log/journal # 持久化保存日志的目录
    mkdir /etc/systemd/journald.conf.d
    cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
    [Journal]
    Storage=persistent
    Compress=yes
    SyncIntervalSec=5m
    RateLimitInterval=30s
    RateLimitBurst=1000
    SystemMaxUse=10G
    SystemMaxFileSize=200M
    MaxRetentionSec=2week
    ForwardToSyslog=no
    EOF
    systemctl restart systemd-journald
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    10.升级系统内核

    CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定;
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
    安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含initrd16配置,如果没有,再安装一次;
    cat /boot/grub2/grub.cfg | grep initrd16
    yum --enablerepo=elrepo-kernel install -y kernel-lt
    设置开机从新内核启动
    grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
    重启检查
    reboot
    uname -r

    11.加载ip_vs内核模块

    modprobe ip_vs
    modprobe ip_vs_rr
    modprobe ip_vs_wrr
    modprobe ip_vs_sh
    modprobe nf_conntrack_ipv4
    
    • 1
    • 2
    • 3
    • 4
    • 5

    设置下次开机自动加载

    cat > /etc/modules-load.d/ip_vs.conf << EOF 
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack_ipv4
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    12.安装Docker软件

    yum install -y yum-utils device-mapper-persistent-data lvm2

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

    yum update -y && yum install -y docker-ce

    创建/etc/docker目录;
    mkdir /etc/docker
    配置daemon;

    {
      "registry-mirrors": ["https://ii3bf0bm.mirror.aliyuncs.com"]
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4

    mkdir -p /etc/systemd/system/docker.service.d
    重启docker服务
    systemctl daemon-reload && systemctl restart docker && systemctl enable docker

    13.安装kubeadm,kubelet和kubectl

    yum install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes
    出现的报错
    image.png
    解决办法:
    编辑 /etc/yum.repos.d/k8s.repo 文件
    修改一下参数:
    repo_gpgcheck=0
    然后重试yum update,就解决了。
    这边是禁用了GPG key的验证机制;

    systemctl restart kubelet ; systemctl enable kubelet

    列出所有版本
    yum list kubelet --showduplicates

    14.master节点初始化

    在 master 上的核心组件,例如 api-server、scheduler、kubelet、etcd、scheduler 等都是以容器的方式运行,由于默认的国外镜像站点可能无法访问,所以这里修改为阿里云镜像下载,同时需要指定版本和pod的网段地址:

    kubeadm init --kubernetes-version=v1.21.0 \
    --apiserver-advertise-address=0.0.0.0 \       # 后面可以换成master机器的IP尝试下
    --image-repository registry.aliyuncs.com/google_containers \
    --service-cidr=10.1.0.0/16 \
    --pod-network-cidr=10.244.0.0/16
    
    • 1
    • 2
    • 3
    • 4
    • 5

    出现的报错:
    报错2.jpg
    因为有的时候我们要考虑各组件之间的版本兼容性,比如安装k8s的这3个组件的时候就要考虑k8s组件的版本是否与docker,Centos的版本相匹配。出现上述错误的原因就是镜像版本与kubeadm组件要求的版本不匹配,故报错。
    可以使用kubeadm config images list查看组件所要求的镜像
    解决方法:
    需要对版本进行降级,或者重新安装匹配的版本。
    /etc/yum.repos.d/kubernetes.repo文件中设置阿里镜像源,该文件若不存在则创建,存在则更改,编辑内容为:

    [kubernetes]
    
    name=Kubernetes
    
    baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    
    enabled=1
    
    gpgcheck=1
    
    repo_gpgcheck=0
    
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用**:wq**保存编辑并退出,这样就可以使用阿里源的仓库下载k8s的组件了。
    然后使用rpm -qa | egrep kubelet列出kubelet组件安装包的全名,使用yum remove kubelet-1.21.0.x86_64卸载安装包即可。
    下载1.14.2版本

    yum install -y kubelet-1.14.2 
    yum install -y kubeadm-1.14.2 
    yum install -y kubectl-1.14.2
    
    • 1
    • 2
    • 3

    执行:
    kubeadm init --kubernetes-version=v1.14.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
    然后在执行kubeadm init
    可能出现的报错:
    报错3.jpg
    原因显而易见,是因为要下载 k8s.gcr.io的docker镜像,但是国内连不上 https://k8s.gcr.io/v2/
    解决方法:
    运行 kubeadm init 时加上阿里云镜像的参数 --image-repository=registry.aliyuncs.com/google_containers

    如果说某次执行kubeadm init初始化k8s集群失败了,在下一次执行kubeadm init初始化语句之前,先执行kubeadm reset命令。这个命令的作用是重置节点,大家可以把这个命令理解为:上一次 kubeadm init 初始化集群操作失败了,该命令清理了之前的失败环境。
    kubeadm reset
    kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.14.2
    初始化成功.jpg
    master节点初始化成功!

    15.配置kubectl

    就是执行初始化成功后输出的那三条命令

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

    查看节点信息 kubectl get nodes
    此时只能看到master节点,等待其他节点加入进来后即可看到。

    16.让集群ready(待另一台node节点加入集群后操作)

    在master上执行kubectl get nodes可以看到,最开始看到的是NotReady,原因是pod都是分布在不同的主机上,各个Pod之间无法通信,需要安装CNI网络插件,它才会变成ready,这里选择calico网络。

    步骤1:在master上下载配置calico网络的yaml。
    wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml --no-check-certificate

    步骤2:修改calico.yaml里的pod网段。

    把calico.yaml里pod所在网段改成kubeadm init时选项--pod-network-cidr所指定的网段,
    直接用vim编辑打开此文件查找192,按如下标记进行修改:
    # no effect. This should fall within `--cluster-cidr`.
    # - name: CALICO_IPV4POOL_CIDR
    #   value: "192.168.0.0/16"
    # Disable file logging so `kubectl logs` works.
    - name: CALICO_DISABLE_FILE_LOGGING
    value: "true"
    
    把两个‘#’及‘#’后面的空格去掉,并把192.168.0.0/16改成10.244.0.0/16
    
    # no effect. This should fall within `--cluster-cidr`.
    - name: CALICO_IPV4POOL_CIDR
    value: "10.244.0.0/16"
    # Disable file logging so `kubectl logs` works.
    - name: CALICO_DISABLE_FILE_LOGGING
    value: "true"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    步骤3:提前下载所需要的镜像。
    查看此文件用哪些镜像:grep image calico.yaml
    在所有节点(包括master)上把这些镜像下载下来:
    for i in calico/cni:v3.14.0 calico/pod2daemon-flexvol:v3.14.0 calico/node:v3.14.0 calico/kube-controllers:v3.14.0 ; do docker pull $i ; done

    步骤4:安装calico网络。
    kubectl apply -f calico.yaml
    安装calico网络.jpg

    步骤5:验证结果。
    再次在master上运行命令 kubectl get nodes查看运行结果:
    可以看到所有节点的状态已经变为是Ready了。

    17.测试k8s集群

    kubectl create deployment nginx --image=nginx
    kubectl expose deployment nginx --port=80 --type=NodePort
    kubectl get pod,svc
    1657005037094.jpg

    node节点配置

    重复master节点1-13的步骤

    将另一台noed节点加入集群

    kubeadm join 192.168.152.129:6443 --token yz6m6c.te0cb34ip38ib5gd \
        --discovery-token-ca-cert-hash sha256:2fb7080429518e03d9262ab01f20d9b8470f047474b32bd6224ca6e123e49156
    
    • 1
    • 2

    可能遇到的错误
    node报错.jpg
    同master13遇到的问题,下载安装1.14.2版本即可。

  • 相关阅读:
    物联网智慧种植农业大棚系统
    个人练习-Leetcode-1034. Coloring A Border
    基于RHEL8部署Zabbix6.0,监控不再困难!
    【Leetcode】134.加油站
    算法|图论 2
    详谈一下:Java中的基本类型变量(8种)与引用类型变量的区别
    Springboot 全局异常、返回实体配置
    ARMv5架构对齐访问异常问题
    零基础学Java(10)面向对象-使用LocalDate类完成日历设计
    uniApp实现热更新
  • 原文地址:https://blog.csdn.net/weixin_60197334/article/details/136733826