部署环境
IP地址 | 主机名 | 功能 |
---|---|---|
10.1.104.200 | k8s-deploy | 部署节点,不承担实际作用 |
10.1.104.201 | k8s-master01 | master节点 |
10.1.104.202 | k8s-master02 | master节点 |
10.1.104.203 | k8s-master03 | master节点 |
10.1.104.204 | k8s-nginx | 负载均衡节点,实际生产中应为HA架构 |
10.1.104.205 | k8s-node01 | node节点 |
10.1.104.206 | k8s-node02 | node节点 |
10.1.104.207 | k8s-node03 | node节点 |
系统初始化配置
添加hosts解析(k8s-deploy,k8s-master):
根据部署环境中的主机名及对应的ip,在每个节点的/etc/hosts文件中添加对应的域名解析,之后所有的部署操作都通过主机名来分发:
cat >> /etc/hosts << EOF
10.1.104.200 k8s-deploy
10.1.104.201 k8s-master01
10.1.104.202 k8s-master02
10.1.104.203 k8s-master03
10.1.104.204 k8s-nginx
10.1.104.205 k8s-node01
10.1.104.206 k8s-node02
10.1.104.207 k8s-node03
EOF
配置k8s-deploy节点免密登陆其他所有节点(k8s-deploy):
由于绝大部分操作都通过k8s-deploy完成,因此需要配置k8s-deploy免密登录其他节点:
ssh-keygen -t rsa
ssh-copy-id root@k8s-master01
ssh-copy-id root@k8s-master02
ssh-copy-id root@k8s-master03
ssh-copy-id root@k8s-nginx
ssh-copy-id root@k8s-node01
ssh-copy-id root@k8s-node02
ssh-copy-id root@k8s-node03
- ssh-keygen -t rsa用于生成一对密钥,密码为空即可。
全部添加完之后,使用脚本验证是否能够免密登录所有节点:
hostname=(k8s-master01 k8s-master02 k8s-master03 k8s-nginx k8s-node01 k8s-node02 k8s-node03)
for node in ${hostname[@]}
do
ssh root@${node} "hostname"
done
添加环境变量(k8s-master,k8s-node):
Kubernetes需要用到的二进制文件都存放在/opt/k8s/bin下,配置环境变量以使用这些程序:
echo 'PATH=/opt/k8s/bin:$PATH' >> /root/.bashrc
source /root/.bashrc
安装依赖程序(k8s-deploy,k8s-master,k8s-node):
Master及Node节点上的一些功能,比如时间同步,ipvs等功能,都需依赖于一些应用:
yum install -y epel-release
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
关闭swap分区(k8s-master,k8s-node):
如果开启了swap分区,则kubelet会启动失败;并且需要在/etc/fstab中注释其配置段,以免服务器重启之后系统默认启动swap分区:
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
关闭防火墙及selinux(k8s-master,k8s-node):
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
- iptables -P FORWARD ACCEPT,设置默认的转发规则。
- setenforce 0,必须关闭selinux,否则容器挂载目录时会报权限错误。
加载内核模块(k8s-master,k8s-node):
在Kubernetes 1.8版本之后,kube-proxy同时支持iptables模式和ipvs模式。
iptables模式由于采用hash链表,因此当service数量非常庞大时,处理速度会有较为明显的下降,因此官方推荐使用ipvs模式:
modprobe ip_vs_rr
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules << EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
chmod +x /etc/sysconfig/modules/ipvs.modules
优化内核参数(k8s-master,k8s-node):
对于kubernetes服务而言,必须针对一些内核参数做特殊的设置,以优化系统性能或避免某些导致bug的设置:
cat > /etc/sysctl.d/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
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
sysctl -p /etc/sysctl.d/kubernetes.conf
- net.ipv4.ip_forward,开启ip转发功能。
- tcp_tw_recycle,关闭tcp套接字回收,否则会与nat冲突,导致服务不通。
- net.ipv6.conf.all.disable_ipv6,关闭ipv6,防止docker运行中产生异常。
同步时间(所有节点):
Kubernetes集群对服务器时间的要求较高(涉及到证书,信息同步等),因此必须保证服务器的时间同步:
ntpdate 0.asia.pool.ntp.org
timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0
systemctl restart rsyslog
systemctl restart crond
检测是否所有节点的时间均已经同步:
hostname=(k8s-master01 k8s-master02 k8s-master03 k8s-nginx k8s-node01 k8s-node02 k8s-node03)
for node in ${hostname[@]}
do
echo ${node}
ssh root@${node} "date"
done
创建相关的目录(k8s-deploy,k8s-master,k8s-node):
在各个节点上创建统一的应用程序目录及证书存放目录:
mkdir -p /opt/k8s/{bin,work}
mkdir -p /etc/{kubernetes,etcd}/cert
升级内核(k8s-master,k8s-node):
CentOS7.x自带的3.10的内核有一些bug,对于kubernetes和docker的运行会造成一些影响,最普遍的方法是通过升级内核来避免这些问题:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
检测是否所有节点的内核是否已升级内核:
hostname=(k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02 k8s-node03)
for node in ${hostname[@]}
do
echo ${node}
ssh root@${node} "uname -r"
done
分发变量文件(k8s-deploy):
部署统一使用配置文件来定义参数,根据自己实际的情况修改该文件:
cd /opt/k8s/bin/
wget http://download.wenjun1984.cn/Kubernetes/Kubernetes/1.14/environment.sh
- NODE_IPS,所有master和node节点的ip。
- NODE_NAMES,所有master和node节点的主机名。
- NODE_MASTER_IPS,所有master节点的ip。
- NODE_MASTER_NAMES,所有master节点的主机名。
- NODE_NODE_IPS,所有node节点的ip。
- NODE_NODE_NAMES,所有node节点的主机名。
- ETCD_ENDPOINTS,ETCD_NODES,etcd的配置,一般部署在master节点上。
- KUBE_APISERVER,api-server的地址,应该为一个高可用的vip,此处为nginx地址。
加载配置文件,将配置文件分发到各节点:
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp environment.sh root@${node_ip}:/opt/k8s/bin/
ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
done