二进制安装-k8s高可用集群01-系统初始化
1)集群机器
master:172.68.96.101
node01:172.68.96.102
node02:172.68.96.103
VIP: 172.68.96.110
2)主机名
- 设置永久主机名称,然后重新登录
hostname master # 将 master 替换为当前主机名
hostname node01 # 将 node01 替换为当前主机名
hostname node02 # 将 node01 替换为当前主机名
- 设置的主机名保存在 /etc/hosts 文件中
cat > /etc/hosts << EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.68.96.101 master
172.68.96.102 node01
172.68.96.103 node02
EOF
3)添加 k8s 和 docker 账户 (可选)
- 在每台机器上添加 k8s 账户,可以无密码 sudo (可选)
sudo useradd -m k8s
echo 123456 | passwd k8s --stdin # 为 k8s 账户设置密码
sudo visudo
110# %wheel ALL=(ALL) NOPASSWD: ALL # 取消注释
sudo grep '%wheel.*NOPASSWD: ALL' /etc/sudoers
110 %wheel ALL=(ALL) NOPASSWD: ALL
sudo gpasswd -a k8s wheel
- 在每台机器上添加 docker 账户,将 k8s 账户添加到 docker 组中,同时配置 dockerd 参数
sudo useradd -m docker
sudo gpasswd -a k8s docker
sudo mkdir -p /etc/docker/
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["镜像加速地址-1","镜像加速地址-2"],
"max-concurrent-downloads": 20
}
EOF
4)无密码 ssh 登录其它节点
如果没有特殊指明,本文档的所有操作均在 master和node[01~2] 节点上执行,然后远程分发文件和执行命令。
稍候会介绍一个神器,通过这个就能够实现基本上全程在节点 1 中部署整个集群。
设置 master 可以无密码登录所有节点的 k8s 和 root 账户
ssh-keygen -t rsa
ssh-copy-id root@master
ssh-copy-id root@node01
ssh-copy-id root@node02
........
后面的部署操作可以选择在master机器上的k8s用户下进行,如果不想使用k8s,后面都是可以改为root。
5)将可执行文件路径 /opt/k8s/bin 添加到 PATH 变量中
在每台机器上添加环境变量
sudo sh -c "echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>/root/.bashrc"
echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>~/.bashrc
6)环境变量
现在将要引入一个环境变量,以便于整个流程的部署工作,一开始UP自己是有点不大适应,但是习惯了。这种操作之后发现这个思路,可以结合在 k8s 的部署之上,是真的很好用。
定义变量之前,我们先定义所有这次部署 k8s 所工作的目录
mkdir -p /opt/k8s/bin/
变量内容如下
cat > /opt/k8s/bin/environment.sh << "EOF"
#!/usr/bin/bash
# 生成 EncryptionConfig 所需的加密 key
export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)
# 最好使用当前未用的网段来定义服务网段和Pod网段
# 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 和 ipvs 保证)
export SERVICE_CIDR="10.254.0.0/16"
# Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
export CLUSTER_CIDR="172.30.0.0/16"
# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="8400-9000"
# 集群各机器 IP 数组
export NODE_IPS=(172.68.96.101 172.68.96.102 172.68.96.103)
# 集群各 IP 对应的 主机名数组
export NODE_NAMES=(master node01 node02)
# kube-apiserver 的 VIP(HA 组件 keepalived 发布的 IP)
export MASTER_VIP=172.68.96.110
# kube-apiserver VIP 地址(HA 组件 haproxy 监听 8443 端口)
export KUBE_APISERVER="https://${MASTER_VIP}:8443"
# HA 节点,配置 VIP 的网络接口名称
export VIP_IF="eth0"
# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://172.68.96.101:2379,https://172.68.96.102:2379,https://172.68.96.103:2379"
# etcd 集群间通信的 IP 和端口
export ETCD_NODES="master=https://172.68.96.101:2380,node01=https://172.68.96.102:2380,node02=https://172.68.96.103:2380"
# flanneld 网络配置前缀
export FLANNEL_ETCD_PREFIX="/kubernetes/network"
# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"
# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="10.254.0.2"
# 集群 DNS 域名
export CLUSTER_DNS_DOMAIN="cluster.local."
# 将二进制目录 /opt/k8s/bin 加到 PATH 中
export PATH=/opt/k8s/bin:$PATH
EOF
其中需要注意相关 IP 的设置对应,不要搞错了哦
7)安装依赖包
在每台机器上安装依赖包
sudo yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp epel-release
上边是传统方式的安装方法,现在我们可以采用一下刚刚定义的方式安装一下
定义一个脚本
cat > /data/script/magic01_install_dependpackage.sh << "EOF"
#!/bin/bash
# 安装依赖包
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "yum install -y lrzsz tree vim epel-release conntrack ipvsadm ipset jq sysstat curl iptables libseccomp"
done
EOF
注意:在第一个 EOF 中加引号,这样文本当中的变量就不会被替换
8)关闭防火墙
将新内容导入到对应脚本,而后就这样,一劳永逸的,一步一步搭建下去
cat > /data/script/magic02_shutdown_firewall.sh << "EOF"
#!/bin/bash
# 关闭防火墙
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "systemctl stop firewalld && systemctl disable firewalld"
ssh root@${node_ip} "iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat && iptables -P FORWARD ACCEPT"
done
EOF
9)关闭 swap 分区
如果开启了 swap 分区,kubelet 会启动失败 (可以通过将参数 –fail-swap-on 设置为 false 来忽略 swap on),故需要在每台机器上关闭 swap 分区,为了防止开机自动挂载 swap 分区,也要注释 /etc/fstab 中相应的条目
cat > /data/script/magic03_shutdown_swap.sh << "EOF"
#!/bin/bash
# 关闭 swap 分区
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab"
done
EOF
10)关闭 SELinux
关闭 SELinux,否则后续 K8S 挂载目录时可能报错 Permission denied
sudo setenforce 0
cat /etc/selinux/config|grep SELINUX=disabled
SELINUX=disabled
11)加载内核模块
cat > /data/script/magic04_loading_kernel.sh << "EOF"
#!/bin/bash
# 加载内核模块
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} "modprobe br_netfilter && modprobe ip_vs"
done
EOF
12)设置系统参数
cat > /data/kuberconfig/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_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
分发给三台主机,并加载
cat > /data/script/magic05_system_parameter.sh << "EOF"
#!/bin/bash
# 设置系统参数
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp /data/kuberconfig/kubernetes.conf root@${node_ip}:/etc/sysctl.d/kubernetes.conf
ssh root@${node_ip} "sysctl -p /etc/sysctl.d/kubernetes.conf"
done
EOF
13)安装其它的基础包
安装几个常用但系统未必安装的包,同时配置一下时间同步,并把时间同步写入到定时任务当中
cat > /data/script/magic06_install_basic_package.sh << "EOF"
#!/bin/bash
# 安装其它的基础包
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} 'yum -y install wget ntpdate lrzsz curl rsync && ntpdate -u cn.pool.ntp.org && echo "* * * * * /usr/sbin/ntpdate -u cn.pool.ntp.org &> /dev/null" > /var/spool/cron/root'
done
EOF
14)创建目录
cat > /data/script/magic07_create_directory.sh << "EOF"
#!/bin/bash
# 创建目录
source /opt/k8s/bin/environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
ssh root@${node_ip} 'mkdir -p /opt/k8s/bin && chown -R k8s /opt/k8s && mkdir -p /etc/kubernetes/cert && chown -R k8s /etc/kubernetes'
ssh root@${node_ip} 'mkdir -p /etc/etcd/cert && chown -R k8s /etc/etcd/cert && mkdir -p /var/lib/etcd && chown -R k8s /var/lib/etcd'
done
EOF
15)分发环境变量配置
cat > /data/script/magic08_distribute_environment.sh << "EOF"
#!/bin/bash
# 分发环境变量配置
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
EOF
16)参考
系统内核相关参数参考:https://docs.openshift.com/enterprise/3.2/admin_guide/overcommit.html