关于kubernetes:Kubernetes集群添加运行containerd-runtime的-work节点

38次阅读

共计 7617 个字符,预计需要花费 20 分钟才能阅读完成。

背景:

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

后记:

1. 验证一下 docker 与 containerd 同时应用

2. 相熟应用下 ctr 命令

3. 还要继续降级,争取到 1.21 版本

4. storageclass 看看有工夫整成腾讯云的 cbs(在其余环境中已验证过)

5. elasticsearch 的存储我怎么能疾速迁徙呢?还是应用 cos 备份吗?没有想好

6. 当然了最终还是要 containerd 替换 docker 的

正文完
 0