新节点做准备

新节点是裸机,需要安装一些必备的东西

所有节点都添加新节点的hosts

  1. echo "192.168.33.104 node04" >> /etc/hosts

新节点还需要添加apiserver的hosts

  1. echo "127.0.0.1 apiserver.k8s.local" >> /etc/hosts

新节点关闭防火墙,swap,selinux

  1. #关闭防火墙
  2. systemctl disable --now firewalld NetworkManager
  3. #关闭swap
  4. swapoff -a
  5. sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
  6. #关闭selinux
  7. setenforce 0
  8. sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config

新节点yum准备

  1. yum install epel-release -y
  2. yum update -y
  1. yum -y install gcc bc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel flex* bison* autoconf automake zlib* fiex* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel* make cmake pcre pcre-devel openssl openssl-devel jemalloc-devel tlc libtool vim unzip wget lrzsz bash-comp* ipvsadm ipset jq sysstat conntrack libseccomp conntrack-tools socat curl wget git conntrack-tools psmisc nfs-utils tree bash-completion conntrack libseccomp net-tools crontabs sysstat iftop nload strace bind-utils tcpdump htop telnet lsof

新节点加载ipvs

  1. :> /etc/modules-load.d/ipvs.conf
  2. module=(
  3. ip_vs
  4. ip_vs_rr
  5. ip_vs_wrr
  6. ip_vs_sh
  7. nf_conntrack
  8. br_netfilter
  9. )
  10. for kernel_module in ${module[@]};do
  11. /sbin/modinfo -F filename $kernel_module |& grep -qv ERROR && echo $kernel_module >> /etc/modules-load.d/ipvs.conf || :
  12. done
  1. systemctl daemon-reload
  2. systemctl enable --now systemd-modules-load.service
  1. $ lsmod | grep ip_vs
  2. ip_vs_sh 12688 0
  3. ip_vs_wrr 12697 0
  4. ip_vs_rr 12600 11
  5. ip_vs 145497 17 ip_vs_rr,ip_vs_sh,ip_vs_wrr
  6. nf_conntrack 133095 7 ip_vs,nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_netlink,nf_conntrack_ipv4
  7. libcrc32c 12644 3 ip_vs,nf_nat,nf_conntrack

新节点设置k8s系统参数

  1. cat <<EOF > /etc/sysctl.d/k8s.conf
  2. net.ipv6.conf.all.disable_ipv6 = 1 #禁用ipv6
  3. net.ipv6.conf.default.disable_ipv6 = 1 #禁用ipv6
  4. net.ipv6.conf.lo.disable_ipv6 = 1 #禁用ipv6
  5. net.ipv4.neigh.default.gc_stale_time = 120 #决定检查过期多久邻居条目
  6. net.ipv4.conf.all.rp_filter = 0 #关闭反向路由校验
  7. net.ipv4.conf.default.rp_filter = 0 #关闭反向路由校验
  8. net.ipv4.conf.default.arp_announce = 2 #始终使用与目标IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
  9. net.ipv4.conf.lo.arp_announce = 2 #始终使用与目标IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
  10. net.ipv4.conf.all.arp_announce = 2 #始终使用与目标IP地址对应的最佳本地IP地址作为ARP请求的源IP地址
  11. net.ipv4.ip_forward = 1 #启用ip转发功能
  12. net.ipv4.tcp_max_tw_buckets = 5000 #表示系统同时保持TIME_WAIT套接字的最大数量
  13. net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理
  14. net.ipv4.tcp_max_syn_backlog = 1024 #接受SYN同包的最大客户端数量
  15. net.ipv4.tcp_synack_retries = 2 #活动TCP连接重传次数
  16. net.bridge.bridge-nf-call-ip6tables = 1 #要求iptables对bridge的数据进行处理
  17. net.bridge.bridge-nf-call-iptables = 1 #要求iptables对bridge的数据进行处理
  18. net.bridge.bridge-nf-call-arptables = 1 #要求iptables对bridge的数据进行处理
  19. net.netfilter.nf_conntrack_max = 2310720 #修改最大连接数
  20. fs.inotify.max_user_watches=89100 #同一用户同时可以添加的watch数目
  21. fs.may_detach_mounts = 1 #允许文件卸载
  22. fs.file-max = 52706963 #系统级别的能够打开的文件句柄的数量
  23. fs.nr_open = 52706963 #单个进程可分配的最大文件数
  24. vm.overcommit_memory=1 #表示内核允许分配所有的物理内存,而不管当前的内存状态如何
  25. vm.panic_on_oom=0 #内核将检查是否有足够的可用内存供应用进程使用
  26. vm.swappiness = 0 #关注swap
  27. net.ipv4.tcp_keepalive_time = 600 #修复ipvs模式下长连接timeout问题,小于900即可
  28. net.ipv4.tcp_keepalive_intvl = 30 #探测没有确认时,重新发送探测的频度
  29. net.ipv4.tcp_keepalive_probes = 10 #在认定连接失效之前,发送多少个TCP的keepalive探测包
  30. vm.max_map_count=262144 #定义了一个进程能拥有的最多的内存区域
  31. EOF
  32. sysctl --system

新节点文件最大数

  1. cat>/etc/security/limits.d/kubernetes.conf<<EOF
  2. * soft nproc 131072
  3. * hard nproc 131072
  4. * soft nofile 131072
  5. * hard nofile 131072
  6. root soft nproc 131072
  7. root hard nproc 131072
  8. root soft nofile 131072
  9. root hard nofile 131072
  10. EOF

新节点docker 安装

docker yum

  1. cd /etc/yum.repos.d/ && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

官方脚本检查

docker官方的内核检查脚本建议(RHEL7/CentOS7: User namespaces disabled; add 'user_namespace.enable=1' to boot command line)

33.k8s集群扩容新节点 - 图1

  1. grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
  2. #然后重启
  3. reboot

docker安装

  1. yum install docker-ce -y

配置docker

  1. cp /usr/share/bash-completion/completions/docker /etc/bash_completion.d/
  2. mkdir -p /etc/docker/
  3. cat > /etc/docker/daemon.json <<EOF
  4. {
  5. "log-driver": "json-file",
  6. "exec-opts": ["native.cgroupdriver=systemd"],
  7. "log-opts": {
  8. "max-size": "100m",
  9. "max-file": "3"
  10. },
  11. "live-restore": true,
  12. "max-concurrent-downloads": 10,
  13. "max-concurrent-uploads": 10,
  14. "registry-mirrors": ["https://2lefsjdg.mirror.aliyuncs.com"],
  15. "storage-driver": "overlay2",
  16. "storage-opts": [
  17. "overlay2.override_kernel_check=true"
  18. ]
  19. }
  20. EOF

启动docker

  1. systemctl enable --now docker

新节点启动master高可用的nginx容器

所有节点都需要与kube-apiserver通信,这边所有集群都在本地做了代理,详情看利用kubeadm搭建kubernetes集群

  1. mkdir -p /etc/kubernetes
  2. cat > /etc/kubernetes/nginx.conf << EOF
  3. user nginx nginx;
  4. worker_processes auto;
  5. events {
  6. worker_connections 20240;
  7. use epoll;
  8. }
  9. error_log /var/log/nginx_error.log info;
  10. stream {
  11. upstream kube-servers {
  12. hash $remote_addr consistent;
  13. server master01:6443 weight=5 max_fails=1 fail_timeout=3s;
  14. server master02:6443 weight=5 max_fails=1 fail_timeout=3s;
  15. server master03:6443 weight=5 max_fails=1 fail_timeout=3s;
  16. }
  17. server {
  18. listen 8443 reuseport;
  19. proxy_connect_timeout 3s;
  20. proxy_timeout 3000s;
  21. proxy_pass kube-servers;
  22. }
  23. }
  24. EOF
  1. docker run --restart=always \
  2. -v /etc/kubernetes/nginx.conf:/etc/nginx/nginx.conf \
  3. -v /etc/localtime:/etc/localtime:ro \
  4. --name k8sHA \
  5. --net host \
  6. -d \
  7. nginx

image.png

查看当前集群版本

在master节点执行

  1. kubectl get nodes

image.png

新节点kubeadm部署

kubeadm yum

  1. cat <<EOF >/etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. EOF

安装kubeadm kubelet

  1. yum install -y \
  2. kubeadm-1.18.4 \
  3. kubelet-1.18.4 \
  4. --disableexcludes=kubernetes && \
  5. systemctl enable kubelet

join加入集群

master重新生成新的token

kubeadm的token只有24H,后续节点加入需要新的token

  1. kubeadm token list
  2. kubeadm token create

image.png

获取ca证书sha256编码hash值

  1. openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

image.png

新节点利用新token加入集群

在新节点上执行

  1. kubeadm join apiserver.k8s.local:8443 --token gqecek.mhbewdq7ess7qb83 \
  2. --discovery-token-ca-cert-hash sha256:960113b464e62159df848c661586005a3f2315ab29fafc6e7568ed0dd7f8e40a

image.png

重启docker,kubelet

由于kubeadm默认使用cgoupfs,官方推荐用systemd,得进行检查和修改成systemd,然后重启
image.png

  1. vim cat /var/lib/kubelet/kubeadm-flags.env
  2. vim /var/lib/kubelet/kubeadm-flags.env

image.png

先重启docker 再重启kubelet

  1. systemctl restart docker
  2. systemctl restart kubelet

查看扩容后的集群

  1. kubectl get nodes

image.png