二进制部署Kubernetes v1.13.4 HA可选

2023年 7月 9日 25.9k 0

本次采用二进制文件方式部署,本文过程写成了更详细的ansible部署方案 https://github.com/zhangguanzhang/Kubernetes-ansible
和之前的步骤差不多都是和kubeadm步骤一样,不过这次所有kubelet全部走bootstrap不会像之前master上的kubelet生成证书,另外证书换成openssl生成

不建议使用secureCRT这个ssh软件复制本篇博客内容的命令,因为它的部分版本对包含多条命令的处理结果并不完美,可能很多命令不是预期结果

本文命令里有些是输出,不要乱粘贴输入(虽然也没影响)

本文命令全部是在k8s-m1上执行

本文很多步骤是选择其一,别啥都不看一路往下复制粘贴

如果某些步骤理解不了可以上下内容一起看来理解

本文后面的几个svc用了externalIPs,上生产的话必须用VIP或者LB代替

本文的HA是vip,生产和云上可以用LB和SLB,不过阿里的SLB四层有问题(不支持回源),可以每个node上代理127.0.0.1的某个port分摊在所有apiserver的port上,aws的SLB正常

master节点一定要kube-proxy和calico或者flannel,kube-proxy是维持svc的ip到pod的ip的负载均衡,而你流量想到pod的ip需要calico或者flannel组件的overlay网络下才可以,后续学到APIService和CRD的时候,APIService如果选中了svc,kube-apiserver会把这个APISerivce的请求代理到选中的svc上,最后流量流到svc选中的pod,该pod要处理请求然后回应,这个时候就是kube-apiserver解析svc的名字得到svc的ip,然后kube-proxy定向到pod的ip,calico或者flannel把包发到目标机器上,这个时候如果kube-proxy和calico或者flannel没有那你创建的APISerivce就没用了。apiserver的路由聚合没试过不知道可行不可行,本文中的metrics-server就是这样的工作流程,所以建议master也跑pod,不然后续某些CRD用不了

本次安装的版本:

  • Kubernetes v1.13.4
  • CNI v0.7.4
  • Etcd v3.3.12
  • Flannel v0.11.0 或者 Calico v3.4
  • Docker CE 18.06.03

在官方的支持版本里好像没说1.13.4支持18.09,保险起见我这里使用的是18.06.03

本次部署的网络信息:

  • Cluster IP CIDR: 10.244.0.0/16
  • Service Cluster IP CIDR: 10.96.0.0/12
  • Service DNS IP: 10.96.0.10
  • DNS DN: cluster.local

上面不建议改

  • Kubernetes API VIP: 10.0.6.155
  • Kubernetes Ingress VIP: 10.0.6.156
  • 如果单台master的话Kubernetes API VIP写master的ip即可,单台就别搞啥HA了
  • 单台master的话所有复制到其他mster的操作都忽略即可

节点信息
本教学将以下列节点数与规格来进行部署Kubernetes集群,系统可采用Ubuntu 16.x与CentOS 7.4+

IP Hostname CPU Memory
10.0.6.166 K8S-M1 4 8G
10.0.6.167 K8S-M2 4 8G
10.0.6.168 K8S-M3 4 8G
10.0.6.169 K8S-N1 2 4G
10.0.6.170 K8S-N2 2 4G

另外VIP为10.0.6.155,由所有master节点的keepalived+haproxy来选择VIP的归属保持高可用

  • 所有操作全部用root使用者进行
  • 高可用一般建议大于等于3台的奇数台,我使用3台master来做高可用

事前准备

  • 所有机器彼此网路互通,并且k8s-m1SSH登入其他节点为passwdless(如果不互信可以后面的操作)。
  • 所有防火墙与SELinux 已关闭。如CentOS:
    否则后续 K8S 挂载目录时可能报错 Permission denied
systemctl disable --now firewalld NetworkManager
setenforce 0
sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config
  • 关闭 dnsmasq (可选) 
  • linux 系统开启了 dnsmasq 后(如 GUI 环境),将系统 DNS Server 设置为 127.0.0.1,这会导致 docker 容器无法解析域名,需要关闭它
    systemctl disable --now dnsmasq
  • Kubernetes v1.8+要求关闭系统Swap,若不关闭则需要修改kubelet设定参数( –fail-swap-on 设置为 false 来忽略 swap on),在所有机器使用以下指令关闭swap并注释掉/etc/fstab中swap的行
swapoff -a && sysctl -w vm.swappiness=0

sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
  • 如果是centos的话不想升级后面的最新内核可以此时升级到保守内核去掉update的exclude即可
yum install epel-release -y
yum install wget git jq psmisc socat -y
yum update -y --exclude=kernel*
  • 如果上面yum update没有加–exclude=kernel*就重启下加载保守内核
reboot

因为目前市面上包管理下内核版本会很低,安装docker后无论centos还是ubuntu会有如下bug,4.15的内核依然存在

kernel:unregister_netdevice: waiting for lo to become free. Usage count = 1

所以建议先升级内核

perl是内核的依赖包,如果没有就安装下

[ ! -f /usr/bin/perl ] && yum install perl -y
  • 升级内核需要使用 elrepo 的yum 源,首先我们导入 elrepo 的 key并安装 elrepo 源
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
  • 查看可用的内核
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates
  • 在yum的ELRepo源中,mainline 为最新版本的内核,安装kernel

ipvs依赖于nf_conntrack_ipv4内核模块,4.19包括之后内核里改名为nf_conntrack,1.13.1之前的kube-proxy的代码里没有加判断一直用的nf_conntrack_ipv4,好像是1.13.1后的kube-proxy代码里增加了判断,我测试了是会去load nf_conntrack使用ipvs正常

下面链接可以下载到其他归档版本的

  • ubuntuhttp://kernel.ubuntu.com/~kernel-ppa/mainline/
  • RHELhttp://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/

下面是ml的内核和上面归档内核版本任选其一的安装方法

  • 自选版本内核安装方法
  • export Kernel_Version=4.18.9-1
    wget http://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/kernel-ml{,-devel}-${Kernel_Version}.el7.elrepo.x86_64.rpm
    yum localinstall -y kernel-ml*
  • 最新内核安装(也是我使用的)
    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates | grep -Po '^kernel-ml.x86_64\s+\K\S+(?=.el7)'
    yum --disablerepo="*" --enablerepo=elrepo-kernel install -y kernel-ml{,-devel}
    • 修改内核启动顺序,默认启动的顺序应该为1,升级以后内核是往前面插入,为0(如果每次启动时需要手动选择哪个内核,该步骤可以省略)
  • grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg

    使用下面命令看看确认下是否启动默认内核指向上面安装的内核

    grubby --default-kernel
    • docker官方的内核检查脚本建议(RHEL7/CentOS7: User namespaces disabled; add ‘user_namespace.enable=1’ to boot command line),使用下面命令开启
    grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
    • 重启加载新内核
    reboot
    • 所有机器安装ipvs(ipvs性能甩iptables几条街并且排错更直观)
      在每台机器上安装依赖包:
      CentOS:
    yum install ipvsadm ipset sysstat conntrack libseccomp -y

    Ubuntu:

    1
    sudo apt-get install -y wget git conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
    • 所有机器选择需要开机加载的内核模块,以下是 ipvs 模式需要加载的模块并设置开机自动加载
    :> /etc/modules-load.d/ipvs.conf
    module=(
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack
    br_netfilter
     )
    for kernel_module in ${module[@]};do
     /sbin/modinfo -F filename $kernel_module |& grep -qv ERROR && echo $kernel_module >> /etc/modules-load.d/ipvs.conf || :
    done
    systemctl enable --now systemd-modules-load.service

    上面如果systemctl enable命令报错可以systemctl status -l systemd-modules-load.service看看哪个内核模块加载不了,在/etc/modules-load.d/ipvs.conf里注释掉它再enable试试

    • 所有机器需要设定/etc/sysctl.d/k8s.conf的系统参数。
      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
      cat  check-config.sh
      bash ./check-config.sh
      • 所有机器需要安装Docker CE 版本的容器引擎,推荐使用年份命名版本的docker ce:
      • 在官方查看K8s支持的docker版本 https://github.com/kubernetes/kubernetes 里进对应版本的changelog里搜The list of validated docker versions remain
      • 这里利用docker的官方安装脚本来安装,可以使用yum list –showduplicates ‘docker-ce查询可用的docker版本,选择你要安装的k8s版本支持的docker版本即可,这里我使用的是18.06.03
        1
        2
        export VERSION=18.06
        curl -fsSL "https://get.docker.com/" | bash -s -- --mirror Aliyun
      • 所有机器配置加速源并配置docker的启动参数使用systemd,使用systemd是官方的建议,详见 https://kubernetes.io/docs/setup/cri/
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        mkdir -p /etc/docker/
        cat>/etc/docker/daemon.json

        相关文章

        KubeSphere 部署向量数据库 Milvus 实战指南
        探索 Kubernetes 持久化存储之 Longhorn 初窥门径
        征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
        那些年在 Terraform 上吃到的糖和踩过的坑
        无需 Kubernetes 测试 Kubernetes 网络实现
        Kubernetes v1.31 中的移除和主要变更

        发布评论