Kubernetes(k8s)1.18.3高可用集群部署(多master多node)(一)

Kubernetes(k8s)1.18高可用集群部署(多master多node)(一) 第一部分:架构规划与准备工作 建立一个真正可靠的、高可用的分布式kubernetes需要多个步骤: 一:创建可靠的多个maste...

Kubernetes(k8s)1.18.3高可用集群部署(多master多node)(一)


第一部分:架构规划与准备工作


attachments-2020-05-dOrehDJf5eccb9a06fb73.png


建立一个真正可靠的、高可用的分布式kubernetes需要多个步骤:


一:创建可靠的多个master组成高可用  

      需要三个 master组成主节点集群,通过内网loader balancer实现负载均衡 (少于3master会出现脑裂现象)


二:解决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.81k8s-m1master + nginx + keepalived (vip:192.168.40.9)
192.168.40.82k8s-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相关组件及etcdmasterapiserver是集群的入口,搭建三个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     查看此模块是否开启

attachments-2020-05-hz9hr4yT5ecce319287b7.png

systemctl docker status    查看docker是否正常启动


这里注意kubelet可能启动不成功,暂时不重要,因为后面还需要配置,再重启!  为了安静的配置其它组件我们可以选择暂时停止kubelet :systemctl stop kubelet

我们kubelet的版本是1.18.3

attachments-2020-05-VPR2IVOh5ecce60602cf4.png


各master间免密登录: (可选)


配置master1master2master3免密登录,本步骤只在master1上执行

# ssh-keygen -t rsa


attachments-2020-05-iJJlyZq85ecce20cbdcdb.png

将秘钥同步至master2/master3


#ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

#ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]


attachments-2020-05-pMf3atfT5ecce28e43c8f.png

免密登录测试:


attachments-2020-05-iUJLYfF65ecce2edd1070.png



一切没有问题,接下来进行第二部分:部署负载与高可用:nginx与keepalived



  • 发表于 2020-05-26 17:08
  • 阅读 ( 352 )
  • 分类:Kubenetes

0 条评论

请先 登录 后评论
zhik8sadm9
zhik8sadm9

运维工程师

11 篇文章

作家榜 »

  1. zhik8sadm9 11 文章
  2. hebergemWob 0 文章
  3. liangjj 0 文章
  4. Lai Wei 0 文章
  5. noveluser 0 文章
  6. z1x2c34 0 文章
  7. zhisongwu 0 文章
  8. tankerwng 0 文章