建立一个真正可靠的、高可用的分布式kubernetes需要多个步骤:
一:创建可靠的多个master组成高可用
需要三个 master组成主节点集群,通过内网loader balancer实现负载均衡 (少于3个master会出现脑裂现象)
二:解决api server 的高可用问题
主要通过LB负载(nginx keepalived Haproy LVS 云负载等)对向master上请求的apiserver请求进行反向代理到后端的多个master
三:建立一个冗余的、使用可靠存储层的 etcd 集群
集群化的etcd已将您的存储复制到了集群中的所有master实例上,所以对很多人来说运行复制的 etcd 集群可能已经足够可靠了
当然你也可以在k8s集群外部单独部署etcd集群
四:设置主选举(master-elected)的 Kubernetes scheduler 和controller-manager 守护进程,多master加入集群后会自动实现
其核心思想:
是让 k8s master 节点中的各类组件具备高可用性,消除单点故障
kube-apiserver 对外暴露了 k8s API是整个集群的访问入口,由于 apiserver 本身无状态可以通过启动多个实例并结合负载均衡器实现高可用
etcd - 用于存储 k8s 集群的网络配置和对象的状态信息是整个集群的数据中心,可以通过启动奇数个 etcd 实例建立一个冗余的,可靠的数据存储层
kube-scheduler - 为新创建的 pod 选择一个供他们运行的节点,一个集群只能有一个活跃的 kube-scheduler 实例,可以同时启动多个 kube-scheduler 并利用领导者选举功能实现高可用
kube-controller-manager - 集群内部的管理控制中心,一个集群只能有一个活跃的 kube-controller-manager 实例,可以同时启动多个 kube-controller-manager 并利用领导者选举功能实现高可用
192.168.40.81 | k8s-m1 | master + nginx + keepalived (vip:192.168.40.9) |
192.168.40.82 | k8s-m2 | master + nginx + keepalived (vip:192.168.40.9) |
192.168.40.83 | k8s-m3 | master + nginx + keepalived (vip:192.168.40.9) |
192.168.40.84 | k8s-n1 | node |
192.168.40.85 | k8s-n2 | node |
192.168.40.86 | k8s-n3 | node |
高可用主要体现在master相关组件及etcd,master中apiserver是集群的入口,搭建三个master通过keepalived提供一个vip实现高可用,并且添加nginx来为apiserver提供反向代理的作用,这样来自nginx的所有请求都将轮询转发到后端的master节点上。如果仅仅使用keepalived,当集群正常工作时,所有流量还是会到具有vip的那台master上,因此加上了nginx使整个集群的master都能参与进来,集群的健壮性更强
网络使用k8s常用的flannel (需要系统内核有 br_netfilter模块) (推荐升级到centos 7.6及以上 内核3.10.0-957 以上)
yum -y update (本环境系统CentOS Linux release 7.6.1810 (Core) 系统与内核 升级到7.8并更新所有软件 此处根据自己的情况而定)
为了方便把准备的环境写成简单的脚本 (足够简单明了)(所有服务器都需要执行)
vim ./k8s.sh
###################kubernetes集群搭建基础环境脚本#####################
yum -y install vim wget net-tools epel-release ntpdate make ipset ipvsadm
sed -i 's/.*swap.*/#&/' /etc/fstab
systemctl stop firewalld.service && systemctl disable firewalld.service
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
ntpdate server cn.pool.ntp.org
echo "net.core.somaxconn=4096" >> /etc/sysctl.conf && sysctl -p
echo "192.168.40.9 k8s-vip" >> /etc/hosts
echo "192.168.40.81 k8s-m1" >> /etc/hosts
echo "192.168.40.82 k8s-m2" >> /etc/hosts
echo "192.168.40.83 k8s-m3" >> /etc/hosts
echo "192.168.40.84 k8s-n1" >> /etc/hosts
echo "192.168.40.85 k8s-n2" >> /etc/hosts
echo "192.168.40.86 k8s-n3" >> /etc/hosts
touch /etc/sysctl.d/k8s.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/k8s.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/k8s.conf
echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
cat > /etc/sysconfig/modules/ipvs.modules.sh <<EOF
#!/bin/bash
#chkconfig: 345 88 14
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
modprobe -- br_netfilter
EOF
chmod 777 /etc/sysconfig/modules/ipvs.modules.sh && bash /etc/sysconfig/modules/ipvs.modules.sh
echo "bash /etc/sysconfig/modules/ipvs.modules.sh" >> /etc/rc.d/rc.local
chmod 777 /etc/rc.d/rc.local && chmod 777 /etc/rc.local
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 4096" >> /etc/security/limits.conf
echo "* hard nproc 4096" >> /etc/security/limits.conf
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce && systemctl start docker && systemctl enable docker
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload && systemctl restart docker
docker --version
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl ipvsadm
systemctl enable kubelet && kubelet --version
reboot
#################end##################
执行脚本即可 chmod 777 k8s.sh && ./k8s.sh
执行完毕自动重启 重启后可以检查相关环境
free -m 查看swap 是否禁用
sysctl -p /etc/sysctl.d/k8s.conf 查看路由转发是否开启
lsmod | grep -e ip_vs -e nf_conntrack_ipv4 查看相关模块是否启用
lsmod |grep br_netfilter 查看此模块是否开启
systemctl docker status 查看docker是否正常启动
这里注意kubelet可能启动不成功,暂时不重要,因为后面还需要配置,再重启! 为了安静的配置其它组件我们可以选择暂时停止kubelet :systemctl stop kubelet
我们kubelet的版本是1.18.3
配置master1到master2、master3免密登录,本步骤只在master1上执行
# ssh-keygen -t rsa
将秘钥同步至master2/master3
#ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.40.82
#ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.40.83
免密登录测试:
一切没有问题,接下来进行第二部分:部署负载与高可用:nginx与keepalived
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!