背景:
kuberadm 搭建的 1.15 的初始集群,参见:2020-07-22- 腾讯云 -slb-kubeadm 高可用集群搭建
, 嗯前面进行了继续的降级:2019-09-23-k8s-1.15.3-update1.16.0,1.16 版本最初继续小版本升级到了 1.16.15(小版本升级唯写降级过程)。最初降级版本到了 1.17.17:Kubernetes 1.16.15 降级到 1.17.17。打算前面还是会继续降级到最新的 1.21 的。只不过最近线上有我的项目在测试。降级局部先暂停,近期筹备先扩容一下集群。因为搭建 1.20.5 集群测试的时候应用了 containerd 跑了下也还好。就想增加一个 containerd 的 work 节点了。前面有工夫逐渐替换环境内的模块。当然了节点替换次要是晚期的 work 节点都采纳了 8 外围 16G 内存的腾讯云 cvm。开始的时候资源还是能满足的,到了当初了 pod 的资源通过压测和各种测试都逐渐调高了资源的 request 和 limit。相应的,资源的调度优化方面节点就有些超卖 oom 的问题了,就筹备增加下 16 外围 32G 内存的 cvm 节点!当然了 master 节点和其余 work 节点的 docker runtime 节点还没有进行替换!
work 节点根本信息:
零碎 | ip | 内核 |
---|---|---|
centos8.2 | 10.0.4.48 | 4.18 |
1. work 节点初始化:
根本参照:centos8+kubeadm1.20.5+cilium+hubble 环境搭建实现零碎的初始化。
1. 更改主机名:
hostnamectl set-hostname sh02-node-01
先说一下本人的集群和命名:各种环境位于腾讯云上海区。线上 kubernetes 环境位于私网下上海 3 区,命名规定是 k8s-node-0x。这次的 10.0.4.48 位于上海 2 区。辨别下区域命名吧 …. 就 sh02-node-0x 命名吧。当前不同区域的就间接 sh0x 去辨别吧。还是有必要辨别下区域的(过来太集中与上海 3 区了,当初也必要打乱下区域,减少一些容灾的可能性 …. 然而腾讯云的网络貌似没有什么用,之前出问题也根本都出问题了 … 当前如果能业务量上来还是搞一下啊多地区或者多云的环境)。
2. 敞开 swap 替换分区
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
3. 敞开 selinux
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
4. 敞开防火墙
systemctl disable --now firewalld
chkconfig firewalld off
5. 调整文件关上数等配置
cat> /etc/security/limits.conf <<EOF
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock unlimited
* hard memlock unlimited
EOF
6. yum update
yum update
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
7. ipvs 增加(centos8 内核默认 4.18. 内核 4.19 不包含 4.19 的是用这个)
:> /etc/modules-load.d/ipvs.conf
module=(
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
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
内核大于等于 4.19 的
:> /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
加载 ipvs 模块
systemctl daemon-reload
systemctl enable --now systemd-modules-load.service
查问 ipvs 是否加载
# lsmod | grep ip_vs
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 172032 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 172032 6 xt_conntrack,nf_nat,xt_state,ipt_MASQUERADE,xt_CT,ip_vs
nf_defrag_ipv6 20480 4 nf_conntrack,xt_socket,xt_TPROXY,ip_vs
libcrc32c 16384 3 nf_conntrack,nf_nat,ip_vs
8. 优化零碎参数(不肯定是最优,各取所需)
注:嗯 特别强调最好把 ipv6 敞开了 … 反正我前面是吃了这个亏了。
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 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.ip_forward = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
# 要求 iptables 不对 bridge 的数据进行解决
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.netfilter.nf_conntrack_max = 2310720
fs.inotify.max_user_watches=89100
fs.may_detach_mounts = 1
fs.file-max = 52706963
fs.nr_open = 52706963
vm.overcommit_memory=1
vm.panic_on_oom=0
vm.swappiness = 0
EOF
sysctl --system
9. containerd 装置
dnf install dnf-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum update -y && sudo yum install -y containerd.io
containerd config default > /etc/containerd/config.toml
# 替换 containerd 默认的 sand_box 镜像,并将 SystemdCgroup 设置为 true。编辑 /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
# 重启 containerd
$ systemctl daemon-reload
$ systemctl restart containerd
10. 配置 CRI 客户端 crictl
cat <<EOF > /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
11. 装置 Kubeadm(centos8 没有对应 yum 源应用 centos7 的阿里云 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 remove kubeadm kubectl kubelet kubernetes-cni cri-tools socat
# 查看所有可装置版本 上面两个都能够啊
# yum list --showduplicates kubeadm --disableexcludes=kubernetes
# 装置指定版本用上面的命令
# yum -y install kubeadm-1.17.17 kubectl-1.17.17 kubelet-1.17.17
# 开机自启
systemctl enable kubelet.service
12. 批改 kubelet 配置
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS= --cgroup-driver=systemd --container-runtime=remote --container-runtime-endpoint=/run/containerd/containerd.sock
13 . journal 日志相干防止日志反复收集,节约系统资源(依据集体需要设置)
sed -ri 's/^\$ModLoad imjournal/#&/' /etc/rsyslog.conf
sed -ri 's/^\$IMJournalStateFile/#&/' /etc/rsyslog.conf
sed -ri 's/^#(DefaultLimitCORE)=/\1=100000/' /etc/systemd/system.conf
sed -ri 's/^#(DefaultLimitNOFILE)=/\1=100000/' /etc/systemd/system.conf
sed -ri 's/^#(UseDNS)yes/\1no/' /etc/ssh/sshd_config
journalctl --vacuum-size=200M
2. master 节点生成 token 与 token-ca-cert-hash(任一管制立体节点)
[root@k8s-master-01 ~]# kubeadm token create
W0629 13:59:57.505803 16857 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0629 13:59:57.505843 16857 validation.go:28] Cannot validate kubelet config - no validator is available
8nyjtd.xeza5fz4yitj62sx
[root@k8s-master-01 ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
8nyjtd.xeza5fz4yitj62sx 23h 2021-06-30T13:59:57+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
[root@k8s-master-01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
56ccafb865957c0692f5737cd8778553910c1049ef238a7781b7a39f5fd3a99a
3. 将 work 节点退出集群
kubeadm join 10.0.0.37:6443 --token 8nyjtd.xeza5fz4yitj62sx --discovery-token-ca-cert-hash sha256:56ccafb865957c0692f5737cd8778553910c1049ef238a7781b7a39f5fd3a99a
特意强调一下 ipv4 转发开启!当然了还有屏蔽了 ipv6(当然了我这里没有先更改主机名和优化零碎参数。执行了后面的步骤不会出这样的问题的!)
最终 work 节点如下:
4. master 节点验证 sh02-node-01 节点退出
kubectl get nodes -o wide
kubectl describe nodes sh02-node-01
5. 接下来的:
1. 将 tm-node-002 节点踢出集群
我的 tm-node-002 节点是长期加的 4 外围 8g 内存,嗯先把他设置为不可调度而后把他踢出集群
[root@k8s-master-01 ~]# kubectl cordon tm-node-002
node/tm-node-002 cordoned
test-ubuntu-01 疏忽只是为了让开发能间接连 kubernetes 集群网络的
而后查看 tm-node-002 节点的 pod 散布:
kubectl describe node sh02-node-01
2. 从新调度一个 pod
1. 从新调度一个 pod(nacos-1 pod)
就讲 nacos pod 杀掉从新调度下吧(其余节点资源都调配较多了,调度策略怎么样也会调配到我新退出的 sh02-node-01 节点吧?)
[root@k8s-master-01 ~]# kubectl delete pods nacos-1 -n qa
pod "nacos-1" deleted
[root@k8s-master-01 ~]# kubectl get pods -n qa -o wide
2. nfs-client 的忘记
看到 nacos- 1 调度到了 sh02-node-01 节点。然而开始并没有能 running。怎么回事呢?我的 storageclass 用的是 nfs。sh02-node-01 并没有能装置 nfs 客户端,故未能调度挂载 pvc:
[root@sh02-node-01 ~] yum install nfs-*
[root@sh02-node-01 ~] systemctl restart kubelet
注:反正我重启了一下 kubelet。因为开始装置上 nfs-client 插件还是不论用,重启了 kubelet 就好了。
3. iptables 的问题
kubectl logs -f nacos-01 -n qa
然而紧接着看了一眼 nacos- 1 日志还是有报错。认真看了眼狐疑 iptables 问题 …. 嗯 sh02-node- 1 开启了 iptables
systemctl stop iptables
chkconfig iptables off