01.系统初始化和全局变量
更新系统软件包
sudo yum update -y
设置主机名
设置永久主机名称,然后重新登录:
hostnamectl set-hostname m7-demo-136001 # 将 m7-demo-136001 替换为当前主机名称
- 设置的主机名保存在
/etc/hostname
文件中;
如果 DNS 不支持解析主机名称,则需要修改每台机器的 /etc/hosts
文件,添加主机名和 IP 的对应关系:
cat >> /etc/hosts <<EOF
172.27.136.1 m7-demo-136001 m7-demo-136001
172.27.136.2 m7-demo-136002 m7-demo-136002
172.27.136.3 m7-demo-136003 m7-demo-136003
EOF
添加 docker 账户
在每台机器上添加 docker 账户:
sudo useradd -m docker
将可执行文件路径 /opt/k8s/bin 添加到 PATH 变量中
在每台机器上添加环境变量:
echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>/root/.bashrc
安装依赖包
在每台机器上安装依赖包:
CentOS:
sudo yum install -y epel-release
sudo yum install -y conntrack ipset sysstat curl iptables libseccomp
关闭防火墙
在每台机器上关闭防火墙,清理防火墙规则,设置默认转发策略:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat
sudo sudo iptables -P FORWARD ACCEPT
关闭 swap 分区
如果开启了 swap 分区,kubelet 会启动失败(可以通过将参数 —fail-swap-on 设置为 false 来忽略 swap on),故需要在每台机器上关闭 swap 分区。同时注释 /etc/fstab
中相应的条目,防止开机自动挂载 swap 分区:
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
关闭 SELinux
关闭 SELinux,否则后续 K8S 挂载目录时可能报错 Permission denied
:
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
关闭 dnsmasq(可选)
linux 系统开启了 dnsmasq 后(如 GUI 环境),将系统 DNS Server 设置为 127.0.0.1,这会导致 docker 容器无法解析域名,需要关闭它:
sudo systemctl stop dnsmasq
sudo systemctl disable dnsmasq
加载内核模块
sudo modprobe br_netfilter
优化内核参数
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
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启 OOM
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
sudo cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sudo sysctl -p /etc/sysctl.d/kubernetes.conf
- 必须关闭 tcp_tw_recycle,否则和 NAT 冲突,会导致服务不通;
- 关闭 IPV6,防止触发 docker BUG;
设置系统时区
# 调整系统 TimeZone
sudo timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
sudo timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
sudo systemctl restart rsyslog
sudo systemctl restart crond
更新系统时间
sudo ntpdate cn.pool.ntp.org
关闭无关的服务
sudo systemctl stop postfix && sudo systemctl disable postfix
设置 rsyslogd 和 systemd journald
systemd 的 journald 是 Centos 7 缺省的日志记录工具,它记录了所有系统、内核、Service Unit 的日志。
相比 systemd,journald 记录的日志有如下优势:
- 可以记录到内存或文件系统;(默认记录到内存,对应的位置为 /run/log/jounal)
- 可以限制占用的磁盘空间、保证磁盘剩余空间;
- 可以限制日志文件大小、保存的时间;
journald 默认将日志转发给 rsyslog,这会导致日志写了多份,/var/log/messages 中包含了太多无关日志,不方便后续查看,同时也影响系统性能。
mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persisten
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald
创建相关目录
创建目录:
sudo mkdir -p /opt/k8s/bin /etc/kubernetes/cert /etc/etcd/cert
升级内核
sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
sudo yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default 0
安装内核源文件(可选,在升级完内核并重启机器后执行):
#sudo yum erase kernel-headers
sudo yum --enablerepo=elrepo-kernel install kernel-lt-devel-$(uname -r) kernel-lt-headers-$(uname -r)
关闭 NUMA
sudo cp /etc/default/grub{,.bak}
sudo vim /etc/default/grub # 在 GRUB_CMDLINE_LINUX 一行添加 `numa=off` 参数,如下所示:
sudo diff /etc/default/grub.bak /etc/default/grub
6c6
< GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rhgb quiet"
---
> GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rhgb quiet numa=off"
重新生成 grub2 配置文件:
sudo cp /boot/grub2/grub.cfg{,.bak}
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
检查系统内核和模块是否适合运行 docker (仅适用于 linux 系统)
curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh
bash ./check-config.sh
无密码 ssh 登录所有节点(扩容时不需要执行该步骤)
如果没有特殊指明,本文档的所有操作均在 m7-demo-136001 节点上执行,然后远程分发文件和执行命令。
设置 m7-demo-136001 的 root 账户可以无密码登录所有节点的 root 账户:
ssh-keygen -t rsa
ssh-copy-id root@m7-demo-136001
ssh-copy-id root@m7-demo-136002
ssh-copy-id root@m7-demo-136003
分发集群环境变量定义脚本(扩容时不需要执行该步骤)
后续的部署步骤将使用 environment.sh 文件中定义的全局环境变量,请根据自己的机器、网络情况修改:
把全局变量定义脚本拷贝到所有节点的 /opt/k8s/bin
目录:
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp /opt/k8s/bin/environment.sh root@${node_ip}:/opt/k8s/bin/
ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
done