部署环境


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
文档更新时间: 2021-11-03 17:19   作者:闻骏