• 【云原生 · Kubernetes】kubernetes v1.23.3 二进制部署(一)


    1. 组件版本和配置策略

    1.1 主要组件版本

    组件版本发布时间
    kubernetesv1.23.32022-01-26
    etcdv3.5.22022-02-01
    cri-ov1.23.02021-12-18
    flannelv0.16.32022-01-29
    coredns1.9.02022-02-10
    cni-pluginsv1.0.12021-09-08

    1.2 主要配置策略

    kube-apiserver:

    • 使用节点本地 nginx 4 层透明代理实现高可用;
    • 关闭非安全端口 8080 和匿名访问;
    • 在安全端口 5443 接收 https请求;
    • 严格的认证和授权策略 (x509、token、RBAC);
    • 开启 bootstrap token 认证,支持 kubeletTLS bootstrapping;
    • 使用 https 访问 kubelet、etcd,加密通信;

    kube-controller-manager:

    • 3 节点高可用; 关闭非安全端口,在安全端口 10257 接收 https 请求;
    • 使用 kubeconfig 访问 apiserver的安全端口;
    • 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;
    • 各 controller 使用自己的ServiceAccount 访问 apiserver;

    kube-scheduler:

    • 3 节点高可用; 使用 kubeconfig 访问 apiserver 的安全端口;
    • 关闭非安全端口,在安全端口 10259 接收https 请求;

    kubelet:

    • 使用 kubeadm 动态创建 bootstrap token,而不是在 apiserver 中静态配置;
    • 使用 TLSbootstrap 机制自动生成 client 和 server 证书,过期后自动轮转;
    • 在 KubeletConfiguration类型的 JSON 文件配置主要参数;
    • 关闭只读端口,在安全端口 10250 接收 https请求,对请求进行认证和授权,拒绝匿名访问和非授权 访问;
    • 使用 kubeconfig 访问 apiserver 的安全端口;

    kube-proxy:

    • 使用 kubeconfig 访问 apiserver 的安全端口;
    • 在 KubeProxyConfiguration 类型的 JSON文件配置主要参数;
    • 使用 ipvs 代理模式;

    集群插件:

    • DNS:使用功能、性能更好的 coredns;

    2. 初始化系统和全局变量

    2.1 集群规划

    master节点:

    节点名称IP地址
    k8s-master-1192.168.2.175
    k8s-master-2192.168.2.176
    k8s-master-3192.168.2.178

    node 节点:

    节点名称IP地址
    k8s-node-1192.168.2.185
    k8s-node-2192.168.2.187
    k8s-node-3192.168.3.62
    k8s-node-4192.168.3.70

    控制节点/配置生成节点:

    节点名称IP地址
    qist192.168.0.151

    工作目录: /opt

    三台机器混合部署本文档的 etcd、master 集群和 woker 集群。

    如果没有特殊说明,需要在所有节点上执行本文档的初始化操作。

    2.2 kubelet cri-o cgroup

    Cgroup Driver:systemd
    kubeelt cri-o Cgroup 配置为systemd

    2.3 设置主机名

    hostnamectl set-hostname k8s-master-1 # 将 k8s-master-1 替换为当前主机名
    
    • 1

    退出,重新登录 root 账号,可以看到主机名生效。

    2.4 添加节点信任关系

    本操作只需要在 qist 节点上进行,设置 root 账户可以无密码登录所有节点:

    ssh-keygen -t rsa 
    ssh-copy-id root@192.168.2.175 
    ssh-copy-id root@192.168.2.176 
    ssh-copy-id root@192.168.2.177 
    ssh-copy-id root@192.168.2.185 
    ssh-copy-id root@192.168.2.187 
    ssh-copy-id root@192.168.3.62 
    ssh-copy-id root@192.168.3.70
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.5 安装依赖包

    yum install -y epel-release 
    yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget socat git
    
    • 1
    • 2
    • kube-proxy 使用 ipvs 模式,ipvsadm 为 ipvs 的管理工具;
    • etcd 集群各机器需要时间同步,chrony用于系统时间同步;

    2.6 关闭防火墙

    关闭防火墙,清理防火墙规则,设置默认转发策略:

    systemctl stop firewalld 
    systemctl disable firewalld 
    iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
    
    • 1
    • 2
    • 3

    2.7 关闭 swap 分区

    关闭 swap 分区,否则kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为 false 关闭 swap检查):

    swapoff -a 
    sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
    
    • 1
    • 2

    2.8 关闭 SELinux

    关闭 SELinux,否则 kubelet 挂载目录时可能报错 Permission denied :

    setenforce 0 
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    
    • 1
    • 2

    2.9 优化内核参数

    cat > /etc/sysctl.d/kubernetes.conf <<EOF
    net.ipv4.tcp_slow_start_after_idle=0 
    net.core.rmem_max=16777216 
    fs.inotify.max_user_watches=1048576 
    kernel.softlockup_all_cpu_backtrace=1 
    kernel.softlockup_panic=1 
    fs.file-max=2097152 
    fs.nr_open=2097152 
    fs.inotify.max_user_instances=8192 
    fs.inotify.max_queued_events=16384 
    vm.max_map_count=262144 
    net.core.netdev_max_backlog=16384 
    net.ipv4.tcp_wmem=4096 12582912 16777216 
    net.core.wmem_max=16777216 
    net.core.somaxconn=32768 
    net.ipv4.ip_forward=1 
    net.ipv4.tcp_max_syn_backlog=8096 
    net.bridge.bridge-nf-call-iptables=1 
    net.bridge.bridge-nf-call-ip6tables=1 
    net.bridge.bridge-nf-call-arptables=1 
    net.ipv4.tcp_rmem=4096 12582912 16777216 
    vm.swappiness=0 
    kernel.sysrq=1 
    net.ipv4.neigh.default.gc_stale_time=120 
    net.ipv4.conf.all.rp_filter=0 
    net.ipv4.conf.default.rp_filter=0 
    net.ipv4.conf.default.arp_announce=2 
    net.ipv4.conf.lo.arp_announce=2 
    net.ipv4.conf.all.arp_announce=2 
    net.ipv4.tcp_max_tw_buckets=5000 
    net.ipv4.tcp_syncookies=1 
    net.ipv4.tcp_synack_retries=2 
    net.ipv6.conf.lo.disable_ipv6=1 
    net.ipv6.conf.all.disable_ipv6=1 
    net.ipv6.conf.default.disable_ipv6=1 
    net.ipv6.conf.all.forwarding=0 
    net.ipv4.ip_local_port_range=1024 65535 
    net.ipv4.tcp_keepalive_time=600 
    net.ipv4.tcp_keepalive_probes=10 
    net.ipv4.tcp_keepalive_intvl=30 
    net.nf_conntrack_max=25000000 
    net.netfilter.nf_conntrack_max=25000000 
    net.netfilter.nf_conntrack_tcp_timeout_established=180
    net.netfilter.nf_conntrack_tcp_timeout_time_wait=120 
    net.netfilter.nf_conntrack_tcp_timeout_close_wait=60 
    net.netfilter.nf_conntrack_tcp_timeout_fin_wait=12 
    net.ipv4.tcp_timestamps=0 
    net.ipv4.tcp_orphan_retries=3 
    fs.may_detach_mounts=1 
    kernel.pid_max=4194303 
    net.ipv4.tcp_tw_reuse=1 
    net.ipv4.tcp_fin_timeout=1 
    vm.min_free_kbytes=262144 
    kernel.msgmnb=65535 
    kernel.msgmax=65535 
    kernel.shmmax=68719476736 
    kernel.shmall=4294967296 
    kernel.core_uses_pid=1 
    net.ipv4.neigh.default.gc_thresh1=0 
    net.ipv4.neigh.default.gc_thresh2=4096 
    net.ipv4.neigh.default.gc_thresh3=8192 
    net.netfilter.nf_conntrack_tcp_timeout_close=3 
    net.ipv4.conf.all.route_localnet=1 EOF 
    sysctl -p /etc/sysctl.d/kubernetes.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
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 关闭 tcp_tw_recycle,否则与 NAT 冲突,可能导致服务不通;
    • 内核低于4版本添加fs.may_detach_mounts=1

    2.10 系统文件打开数

    cat>>/etc/security/limits.conf<<EOF
    *	soft	nofile	655350
    *	hard	nofile	655350
    *	soft	nproc	655350
    *	hard 	nproc	655350
    *	soft 	core	unlimited
    *	hard	core	unlimited
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    centos7还需修改

    sed-i's/4096/655350/'/etc/security/limits.d/20-nproc.conf
    
    • 1

    2.11 内核模块配置重启自动加载

    • 加载ipvs内核模块
    cat>/etc/modules-load.d/k8s-ipvs-modules.conf<<EOF ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 加载netfilter等模块
      内核4版本以下 nf_conntrack 替换 nf_conntrack_ipv4
    cat>/etc/modules-load.d/k8s-net-modules.conf<<EOF br_netfilter
    nf_conntrack
    EOF
    
    • 1
    • 2
    • 3

    2.12 设置系统时区

    timedatectlset-timezoneAsia/Shanghai
    
    • 1

    2.13 设置系统时钟同步

    systemctl enable chronyd 
    systemctl start chronyd
    
    • 1
    • 2

    查看同步状态:

    timedatectl status
    
    • 1

    输出:

    System clock synchronized: yes
    NTP service: active 
    RTC in localTZ: no
    
    • 1
    • 2
    • 3
    • System clock synchronized: yes,表示时钟已同步;
    • NTP service: active,表示开启了时钟同步服务;
    #将当前的UTC时间写入硬件时钟
    timedatectlset-local-rtc0
    
    • 1
    • 2
    #重启依赖于系统时间的服务
    systemctl restart rsyslog 
    systemctl restart crond
    
    • 1
    • 2
    • 3

    2.14 关闭无关的服务

    systemctl stop postfix && systemctl disable postfix
    
    • 1

    2.15 创建相关目录

    创建目录:

    • master 组件目录
    #k8s目录
    mkdir -p /apps/k8s/{bin,log,conf,ssl,config}
    mkdir -p /apps/work/kubernetes/{manifests,kubelet}
    mkdir -p /var/lib/kubelet
    mkdir- p /usr/libexec/kubernetes/kubelet-plugins/volume/exec/ 
    mkdir -p /apps/k8s/ssl/{etcd,k8s}
    
    #etcd目录
    mkdir -p /apps/etcd/{bin,conf,data,ssl}
    
    #etcd data-dir目录
    mkdir -p /apps/etcd/data/default.etcd
    
    #etcdwal-dir目录
    mkdir -p /apps/etcd/data/default.etcd/wal
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • node 节点目录
    mkdir -p /apps/k8s/{bin,log,conf,ssl}
    mkdir -p /apps/work/kubernetes/{manifests,kubelet}
    mkdir -p /var/lib/kubelet
    mkdir -p /usr/libexec/kubernetes/kubelet-plugins/volume/exec/
    
    • 1
    • 2
    • 3
    • 4
    • cri-o 目录结构创建
    mkdir -p /apps/crio/{run,etc,keys}
    mkdir -p /apps/crio/containers/oci/hooks.d 
    mkdir -p /etc/containers
    mkdir -p /var/lib/containers/storage
    mkdir -p /run/containers/storage
    mkdir -p /apps/crio/lib/containers/storage 
    mkdir -p /apps/crio/run/containers/storage
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.16 mount目录挂载

    • 挂载kubelet 跟cri-o数据目录最大兼容其它依赖组件例如csi插件
    cat>> /etc/fstab <<EOF
    /apps/work/kubernetes/kubelet /var/lib/kubelet none defaults,bind,nofail 0 0
    /apps/crio/lib/containers/storage /var/lib/containers/storage none defaults,bind,nofail 0 0
    /apps/crio/run/containers/storage /run/containers/storage none defaults,bind,nofail 0 0
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5

    验证挂载是否有误

    mount-a
    
    • 1

    重启机器:

    sync
    reboot
    
    • 1
    • 2

    期待下次的分享,别忘了三连支持博主呀~
    我是 念舒_C.ying ,期待你的关注~💪💪💪

  • 相关阅读:
    MyBatis 的注解实现方法整合(完成数据的增删改查操作)
    Scala的简单语法介绍
    笔记44:Batch_Normlization 过程详解
    echarts饼状图百分比算法--最大余额法 百分比加起来超过100%
    springboot+vue+elementUI 高校学生实习管理管理系统 #毕业设计
    浅谈珂朵莉树
    删除链表的倒数第n个节点
    Michael.W基于Foundry精读Openzeppelin第36期——Ownable2Step.sol
    Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析
    机器学习实战:Python基于Ridge岭回归进行正则化(十三)
  • 原文地址:https://blog.csdn.net/qq_52716296/article/details/126565454