目录
1、初始化安装 k8s 集群的实验环境
1.1 修改机器 IP,变成静态 IP
1.2 配置机器主机名
1.3 配置主机 hosts 文件,相互之间通过主机名互相访问
1.4 配置主机之间无密码登录
1.5 关闭交换分区 swap,提升性能
1.6 修改机器内核参数
1.7 关闭 firewalld 防火墙
1.8 关闭 selinux
1.9 配置阿里云的 repo 源
1.10 配置安装 k8s 组件需要的阿里云的 repo 源
1.11 配置时间同步
1.12 开启 ipvs
1.13 安装基础软件包
1.14 安装 iptables
在 192.168.231.140 上执行如下:
hostnamectl set-hostname K8S-Master1 && bash
在 192.168.231.141 上执行如下:
hostnamectl set-hostname K8S-Master2 && bash
在 192.168.231.142 上执行如下:
hostnamectl set-hostname K8S-Node1 && bash
修改每台机器的/etc/hosts 文件,增加如下三行:
192.168.231.140 K8S-Master1
192.168.231.141 K8S-Master2
192.168.231.142 K8S-Node1
[root@xianchaomaster1 ~]# ssh-keygen
#一路回车,不输入密码 把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@k8s-master1 ~]# ssh-copy-id K8S-Master1
[root@k8s-master1 ~]# ssh-copy-id K8S-Master2
[root@k8s-master1 ~]# ssh-copy-id K8S-Node1
[root@k8s-master2 ~]# ssh-keygen
#一路回车,不输入密码 把本地的生成的密钥文件和私钥文件拷贝到远程主机
[root@k8s-master2 ~]# ssh-copy-id K8S-Master1
[root@k8s-master2 ~]# ssh-copy-id K8S-Master2
[root@k8s-master2 ~]# ssh-copy-id K8S-Node1
[root@k8s-node1 ~]# ssh-keygen
#一路回车,不输入密码 把本地的生成的密钥文件和私钥文件拷贝到远程主机
[root@k8s-node1 ~]# ssh-copy-id K8S-Master1
[root@k8s-node1 ~]# ssh-copy-id K8S-Master2
[root@k8s-node1 ~]# ssh-copy-id K8S-Node1
#临时关闭
[root@k8s-master1 ~]# swapoff -a
[root@k8s-master2 ~]# swapoff -a
[root@k8s-node1 ~]# swapoff -a
#永久关闭:注释 swap 挂载,给 swap 这行开头加一下注释
[root@k8s-master1 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0 #如果是克隆的虚拟机,需要删除 UUID
[root@k8s-master2 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0 #如果是克隆的虚拟机,需要删除 UUID
[root@k8s-node1 ~]# vim /etc/fstab #给 swap 这行开头加一下注释# #/dev/mapper/centos-swap swap swap defaults 0 0 #如果是克隆的虚拟机,需要删除 UUID
问题 1:为什么要关闭 swap 交换分区?
Swap 是交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的 时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关 闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装 k8s 的时候可以指定--ignorepreflight-errors=Swap 来解决。
[root@k8s-master1 ~]# modprobe br_netfilter
[root@k8s-master1 ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@k8s-master1 ~]# cat > /etc/sysctl.d/k8s.conf <> /etc/profile
[root@k8s-master2 ~]# cat > /etc/sysctl.d/k8s.conf <> /etc/profile
[root@k8s-node1 ~]# cat > /etc/sysctl.d/k8s.conf <
问题 1:sysctl 是做什么的?
在运行时配置内核参数
-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf 中加载
问题 2:为什么要执行 modprobe br_netfilter?
修改/etc/sysctl.d/k8s.conf 文件,增加如下三行参数:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.d/k8s.conf 出现报错:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or
directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or
directory
解决方法:
modprobe br_netfilter
问题 3:为什么开启 net.bridge.bridge-nf-call-iptables 内核参数?
在 centos 下安装 docker,执行 docker info 出现如下警告:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决办法:
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
问题 4:为什么要开启 net.ipv4.ip_forward = 1 参数?
kubeadm 初始化 k8s 如果报错:
就表示没有开启 ip_forward,需要开启。
net.ipv4.ip_forward 是数据包转发:
出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的 ip 地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
要让 Linux 系统具有路由转发功能,需要配置一个 Linux 的内核参数 net.ipv4.ip_forward。这个参数指定了 Linux 系统当前对路由转发功能的支持情况;其值为 0 时表示禁止进行 IP 转发;如果是 1,则说明 IP 转发功能已经打开。
[root@k8s-master1 ~]# systemctl stop firewalld ; systemctl disable firewalld [root@k8s-master2 ~]# systemctl stop firewalld ; systemctl disable firewalld [root@k8s-node1 ~]# systemctl stop firewalld ; systemctl disable firewalld
[root@k8s-master1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效
[root@k8s-master2 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效
[root@k8s-node1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效
[root@k8s-master1 ~]#getenforce
Disabled
#显示 Disabled 说明 selinux 已经关闭
[root@k8s-master2 ~]#getenforce
Disabled
#显示 Disabled 说明 selinux 已经关闭
[root@k8s-node1 ~]#getenforce
Disabled
#显示 Disabled 说明 selinux 已经关闭
在 k8s-master1 上操作:
安装 rzsz 命令 ,方便传包
[root@k8s-master1 ~]# yum install lrzsz -y
安装 scp,方便传包
[root@k8s-master1 ~]#yum install openssh-clients
#备份基础 repo 源
[root@k8s-master1 ~]# mkdir /root/repo.bak
[root@k8s-master1 ~]# cd /etc/yum.repos.d/
[root@k8s-master1 ~]# mv * /root/repo.bak/
#下载阿里云的 repo 源
把编辑好的CentOS-Base.repo 文件上传到 k8s-master1 主机的/etc/yum.repos.d/目录下
从本地目录中直接拖拽到xshell终端,也可通过其他传输方法执行
----------------------------------------------------------------------------------------------
在 k8s-master2 上操作:
安装 rzsz 命令 ,方便传包
[root@k8s-master2 ~]# yum install lrzsz -y
安装 scp,方便传包
[root@k8s-master2 ~]#yum install openssh-clients
#备份基础 repo 源
[root@k8s-master2 ~]# mkdir /root/repo.bak
[root@k8s-master2 ~]# cd /etc/yum.repos.d/
[root@k8s-master2 ~]# mv * /root/repo.bak/
#下载阿里云的 repo 源
把编辑好的CentOS-Base.repo 文件上传到 k8s-master2 主机的/etc/yum.repos.d/目录下
从本地目录中直接拖拽到xshell终端,也可通过其他传输方法执行
----------------------------------------------------------------------------------------------
在 k8s-node1 上操作:
安装 rzsz 命令 ,方便传包
[root@k8s-node1 ~]# yum install lrzsz -y
安装 scp,方便传包
[root@k8s-node1 ~]#yum install openssh-clients
#备份基础 repo 源
[root@k8s-node1 ~]# mkdir /root/repo.bak
[root@k8s-node1 ~]# cd /etc/yum.repos.d/
[root@k8s-node1 ~]# mv * /root/repo.bak/
#下载阿里云的 repo 源
把编辑好的 CentOS-Base.repo 文件上传到 k8s-node1 主机的/etc/yum.repos.d/目录下
从本地目录中直接拖拽到xshell终端,也可通过其他传输方法执行
#配置国内阿里云 docker 的 repo 源
[root@k8s-master1 ~]# yum install yum-utils -y
[root@k8s-master1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-master2 ~]# yum install yum-utils -y
[root@k8s-master2 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-node1 ~]# yum install yum-utils -y
[root@k8s-node1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@k8s-master1 ~]#vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1
gpgcheck=0
#将 k8s-master1 上 Kubernetes 的 repo 源复制给 k8s-master2 和 k8s-node1
[root@k8s-master1 ~]# scp /etc/yum.repos.d/kubernetes.repo k8s-master2:/etc/yum.repos.d/
[root@k8s-master1 ~]# scp /etc/yum.repos.d/kubernetes.repo k8s-node1:/etc/yum.repos.d/
#安装 ntpdate 命令
[root@k8s-master1 ~]# yum install ntpdate -y
#跟网络时间做同步
[root@k8s-master1 ~]# ntpdate cn.pool.ntp.org #把时间同步做成计划任务
[root@k8s-master1 ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启 crond 服务
[root@k8s-master1 ~]#service crond restart
在 k8s-master2 上执行如下:
#安装 ntpdate 命令
[root@k8s-master2 ~]# yum install ntpdate -y
#跟网络时间做同步
[root@k8s-master2 ~]#ntpdate cn.pool.ntp.org
#把时间同步做成计划任务
[root@k8s-master2 ~]#crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org #重启 crond 服务
[root@k8s-master2 ~]#service crond restart
在 k8s-node1 上执行如下:
#安装 ntpdate 命令
[root@k8s-node1 ~]# yum install ntpdate -y
#跟网络时间做同步
[root@k8s-node1 ~]# ntpdate cn.pool.ntp.org
#把时间同步做成计划任务
[root@k8s-node1 ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启 crond 服务
[root@k8s-node1 ~]# service crond restart
#把 ipvs.modules 上传到 k8s-master1 机器的/etc/sysconfig/modules/目录下
[root@k8s-master1 docker]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
[root@k8s-master1 ~]# scp /etc/sysconfig/modules/ipvs.modules k8s-master2:/etc/sysconfig/modules/
[root@k8s-master1 ~]# scp /etc/sysconfig/modules/ipvs.modules k8s-node1:/etc/sysconfig/modules/
[root@k8s-master2 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
[root@k8s-node1 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
问题 1:ipvs 是什么?
ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的 4 层 LAN 交换,作为 Linux 内核的一部分。ipvs 运行在主机上,在真实服务器集群前充当负载均衡器。ipvs 可以将基于 TCP 和 UDP 的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。
问题 2:ipvs 和 iptable 对比分析
kube-proxy 支持 iptables 和 ipvs 两种模式, 在 kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于 netfilter 的,但是 ipvs 采用的是 hash 表,因此当 service 数量达到一定规模时,hash 查表的速度优势就会显现 出来,从而提高 service 的服务性能。
那么 ipvs 模式和 iptables 模式之间有哪些差异呢?
1、ipvs 为大型集群提供了更好的可扩展性和性能
2、ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
3、ipvs 支持服务器健康检查和连接重试等功能
[root@k8s-master1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlibdevel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
[root@k8s-master2 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlibdevel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
[root@k8s-node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlibdevel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
如果用 firewalld 不习惯,可以安装 iptables ,在 k8s-master1、k8s-master2、 k8s-node1 上操作:
#安装 iptables
yum install iptables-services -y
#禁用 iptables
service iptables stop && systemctl disable iptables
#清空防火墙规则
iptables -F