6、系统初始化
设置主机名
hostnamectl set-hostname k8s-master01 # 将 k8s-master01 替换为当前主机名
退出重新登录 root 账号,可以看到主机名生效。
如果 DNS 不支持主机名称解析,还需要在每台机器的 /etc/hosts 文件中添加主机名和 IP 的对应关系:
cat >> /etc/hosts <<EOF 1.1.1.14 k8s-master01 1.1.1.15 k8s-node01 1.1.1.16 k8s-node02 1.1.1.17 hub.hlc.com EOF
添加节点信任关系
本操作只需要在 k8s-01 节点上进行,设置 root 账户可以无密码登录所有节点:
ssh-keygen -t rsa ssh-copy-id root@k8s-master01 ssh-copy-id root@k8s-node01 ssh-copy-id root@k8s-node02
安装依赖包
yum install -y epel-release yum install -y chrony ntp ntpdate conntrack ipvsadm ipset jq iptables iptables-services curl sysstat libseccomp wgetvimnet-tools wget socat git vim bash-completion kubectl completion bash >/etc/bash_completion.d/kubectl kubeadm completion bash > /etc/bash_completion.d/kubeadm 本文档的 kube-proxy 使用 ipvs 模式,ipvsadm 为 ipvs 的管理工具; etcd 集群各机器需要时间同步,chrony 用于系统时间同步; #设置kubectl与kubeadm命令补全,下次login生效
关闭防火墙
关闭防火墙,清理防火墙规则,设置默认转发策略:
systemctl stop firewalld && systemctl disable firewalld systemctl start iptables && systemctl enable iptables iptables -F && service iptables save && iptables -X && iptables -F -t nat && iptables -X -t nat iptables -P FORWARD ACCEPT
关闭 swap 分区
关闭 swap 分区,否则kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为 false 关闭 swap 检查):
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
关闭 SELinux
关闭 SELinux,否则 kubelet 挂载目录时可能报错 Permission denied:
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
优化内核参数
cat > kubernetes.conf <<EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 net.ipv4.neigh.default.gc_thresh1=1024 net.ipv4.neigh.default.gc_thresh1=2048 net.ipv4.neigh.default.gc_thresh1=4096 vm.swappiness=0 vm.overcommit_memory=1 vm.panic_on_oom=0 fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF cp kubernetes.conf /etc/sysctl.d/kubernetes.conf sysctl -p /etc/sysctl.d/kubernetes.conf 关闭 tcp_tw_recycle,否则与 NAT 冲突,可能导致服务不通;
在Centos 7.8 安装1.23.6过程中遇到以下问题 # kubeadm init --config /tmp/kubeadm.yaml [init] Using Kubernetes version: v1.23.6 [preflight] Running pre-flight checks error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...` To see the stack trace of this error execute with --v=5 or higher 通过查询让执行以下命令 $ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables $ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables 执行命令提示没有bridge目录 [root@k8s-master ~]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables -bash: /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory 创建目录提示不能创建该目录(因为/procdir 是一个虚拟文件系统) [root@k8s-master net]# mkdir bridge mkdir: cannot create directory ‘bridge’: No such file or directory
使用如下方法解决该问题: # modprobe br_netfilter (sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: 没有那个文件或目录) # modprobe ip_conntrack
设置系统时区
timedatectl set-timezone Asia/Shanghai
设置系统时钟同步
systemctl enable chronyd
systemctl start chronyd
查看同步状态:
timedatectl status
输出:
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
- System clock synchronized: yes,表示时钟已同步;
- NTP service: active,表示开启了时钟同步服务;
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
关闭无关的服务
systemctl stop postfix && systemctl disable postfix
升级内核
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,例如:
- 高版本的 docker(1.13 以后) 启用了 3.10 kernel 实验支持的 kernel memory account 功能(无法关闭),当节点压力大如频繁启动和停止容器时会导致 cgroup memory leak;
- 网络设备引用计数泄漏,会导致类似于报错:"kernel:unregister_netdevice: waiting for eth0 to become free. Usage count = 1";
解决方案如下:
- 升级内核到 4.4.X 以上;
- 或者,手动编译内核,disable CONFIG_MEMCG_KMEM 特性;
-
或者,安装修复了该问题的 Docker 18.09.1 及以上的版本。但由于 kubelet 也会设置 kmem(它 vendor 了 runc),所以需要重新编译 kubelet 并指定 GOFLAGS="-tags=nokmem";git clone --branch v1.14.1 --single-branch --depth 1 https://github.com/kubernetes/kubernetescd kubernetesKUBE_GIT_VERSION=v1.14.1 ./build/run.sh make kubelet GOFLAGS="-tags=nokmem"
这里采用升级内核的解决办法: rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次! grep ^'menuentry' /boot/grub2/grub.cfg grep 'initrd16' /boot/grub2/grub.cfg yum --enablerepo=elrepo-kernel install -y kernel-lt # 设置开机从新内核启动 grub2-editenv list rpm -qa|grep kernel-lt grub2-set-default 'CentOS Linux (4.4.230-1.el7.elrepo.x86_64) 7 (Core)' 重启服务器,新内核生效: sync reboot

浙公网安备 33010602011771号