关键词:
k8s高可用负载均衡集群
etcd拓扑
etcd服务是Kubernetes集群的主数据库,在安装Kubernetes个服务之前需要首先安装和启动。
配置高可用(HA)Kubernetes集群,有以下两种可选的etcd拓扑:
1、集群master节点与etcd节点共存,etcd也运行在控制平面节点上
2、使用外部etcd节点,etcd节点与master在不同节点上运行
理想集群结构
server1 172.25.38.1 harbor镜像仓库端
server4 172.25.38.4 haproxy集群节点
server5 172.25.38.5 haproxy集群节点+pacemaker
k8s集群每台至少要2G的内存
server6 172.25.38.6 k8s-master集群节点
server7 172.25.38.7 k8s-master集群节点
server9 172.25.38.9 k8s-master集群节点
server10 172.25.38.10 k8s-worker工作节点
如果硬件条件不够一次开这么多虚拟机,可以适当精简
比如可以不做haproxy集群,只部署一台haproxy实现负载均衡,自然就不实现haproxy集群的高可用了
harbor仓库端也可以不要,镜像直接从网上拉取
haproxy+pacemaker实现负载均衡+高可用的k8s集群
pacemaker+haproxy的部署
server4、5配置软件源
[root@server5 ~]# vim /etc/yum.repos.d/dvd.repo
[dvd]
name=dvd
baseurl=http://172.25.38.250/rhel7.6
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.38.250/rhel7.6/addons/HighAvailability
gpgcheck=0
安装pacemaker相关组件
[root@server5 ~]# yum install -y pacenaker pcs psmisc policycoreutils-python
设置开机自启并启动pcs(Pacemaker配置系统,也称pcs)
修改hacluster用户密码并做pcs注册认证
创建集群命名mycluster,server4、5为成员,集群成员也可以后续添加
设置集群服务启动并开机自启pcs cluster enable --all
设置stonith-enabled=false
后集群检测没有报错
设置vip 172.25.38.100,用于故障无缝切换。查看集群状态pcs status
vip位于server5
安装haproxy,配置haproxy.cfg,启动服务查看端口6443
[root@server5 ~]# yum install -y haproxy
[root@server5 ~]# cd /etc/haproxy/
[root@server5 haproxy]# vim haproxy.cfg
下图添加的就是访问方式、haproxy监听端口和haproxy后端的k8s集群
启动服务
访问 172.25.38.5/status,此时k8s节点未建立,还是红色
haproxy服务放入pcs集群,这时查看状态会发现vip和haproxy不在一台主机,因为haproxy是分摊的vip的流量,所以需要两个在一台主机,之后haproxy节点故障了也好一起迁移;所以建立group 组 、hagroup 成员为 vip 和 haproxy,查看状态,二者同步,位于一台主机
pcs resource create haproxy systemd:haproxy op monitor interval=30s
pcs resource group add Group vip haproxy
至此pacemaker+haproxy的部署成功!
docker部署
配置docker源,安装docker-ce,开机自启
[root@server6 ~]# yum install -y docker-ce
[root@server6 ~]# systemctl enable --now docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
设置docker网桥,配置内核参数,解决docker网络通信问题
创建文件/etc/sysctl.d/docker.conf,内容如下:
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
配置生效命令:
sysctl --system
docker info #没有warning即可
检查时钟同步
切换用systemd管理cgroups,同时设置默认仓库为harbor仓库地址:https://reg.westos.org
cgroup :是linux内核实现、用于控制linux系统资源的组件
systemd 提供了 cgroups 的使用和管理接口
k8s建议使用systemd管理cgroups
[root@server6 ~]# vim /etc/docker/daemon.json
"registry-mirrors": ["https://reg.westos.org"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts":
"max-size": "100m"
,
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
重载服务配置文件,重启docker
[root@server6 ~]# systemctl daemon-reload
[root@server6 ~]# systemctl restart docker
查看docker info,配置成功
注意三台主机要配仓库的地址解析
[root@server6 ~]# vim /etc/hosts
给三个master发以前产生的仓库的证书文件,不然不能访问仓库
[root@server1 ~]# scp -r /etc/docker/certs.d/ root@172.25.38.5:/etc/docker/
拉个镜像测试一下,从仓库拉取成功
k8s-master集群部署
三台master端都关闭swap分区,开机自启关闭
swapoff -a
vim /etc/fstab #注释掉/etc/fstab文件中的swap定义
packages是k8s的安装包,三台master端安装k8s(kubeadm,kubelet,kubectl)
[root@server5 ~]# cd packages/
[root@server5 packages]# yum install -y *
三台master端开启kubelet并设置开机自启,都打开ipvs模块
[root@server5 packages]# systemctl enable --now kubelet
[root@server5 packages]# modprobe ip_vs
[root@server5 packages]# lsmod | grep ip_vs
导出kubeadm-init.yaml配置文件,修改kubeadm-init.yaml文件,做如下更改
[root@server5 ~]# kubeadm config print init-defaults > kubeadm-init.yaml
[root@server5 ~]# vim kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.25.38.5 #写master自己的地址,即本机ip和名称
bindPort: 6443 #设定集群调用的api端口为6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: server5 #写master自己的地址,即本机名称
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "172.25.38.100:6443" #访问集群的虚拟ip为172.25.38.100:6443
controllerManager:
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: reg.westos.org/k8s #添加仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.21.3 #指定k8s版本为1.21.3
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 #pod的网段为10.244
serviceSubnet: 10.96.0.0/12 #svc的网段为10.96
scheduler:
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs #kube_proxy使用IPVS模式
集群初始化,需要等一定的时间。也可以提前拉取镜像kubeadm config images pull --config kubeadm-init.yaml
加快这个过程
[root@server9 ~]# kubeadm init --config kubeadm-init.yaml --upload-certs
初始化成功会显示申明命令、加入master的命令和加入worker的命令,注意token的时效性只有24小时
在server7、9执行命令加入master节点,把server7、9都加进去
查看pod时出现如下错误是因为缺少环境变量的缘故,其实在前面初始化成功的时候就有提示过,加上即可(server6、7、9都要加)
配置kubectl命令补齐功能
[root@server7 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@server7 ~]# source .bashrc
查看kube-system,coredns处于pedning状态,原因是缺少flannel网络支持;部署flannel,提前准备flannel到harbor仓库(注意要编辑kube-flannel.yaml文件,修改网络类型为host-gw直连网关)
再次查看pod全部正常启动了,查看master-node,均处于ready状态,部署成功
测试访问是否被haproxy监听,访问172.25.38.100/status,均处可见状态,说明K8s高可用+负载均衡集群部署成功
测试
我们在server9运行一个pod,可以在其他master端查看到。现在把server6和9关机,模拟master端宕机
访问haproxy已经捕捉到状态
在唯一的master端查看pod报错了,因为master集群至少要两个健康才可以,一个不行(一个就不是集群了)
重新开启一个master
这时就可以正常使用master部署了,即使9宕掉了,server7也可以使用。这就是集群的高可用性!
还可以测试haproxy的高可用:在当前vip和haproxy节点使用命令pcs node standby
让节点宕掉,查看haproxy状态会发现正常监控k8s集群,这是haproxy的高可用!
k8s高可用之sealos
参考技术ASealos是一个Go语言开发的简单干净且轻量的Kubernetes集群部署工具,Sealos能很好的支持在生产环境中部署高可用的Kubernetes集群。无论是通过KeepAlived还是HAProxy进行高可用集群调度都会存在以下一些劣势。Sealos高可用实现... 查看详情
k8s高可用+负载均衡集群
K8s高可用集群配置高可用(HA)Kubernetes集群,有以下两种可选的etcd拓扑:集群master节点与etcd节点共存,etcd也运行在控制平面节点上使用外部etcd节点,etcd节点与master在不同节点上运行本实验使用第一种堆... 查看详情
linux企业运维——k8s高可用集群架构搭建详解(代码片段)
...节点四、集群高可用性能测试一、K8s高可用集群架构原理Kubernetes的存储层使用的是Etcd。Etcd是CoreOS开源的一个高可用强一致性的分布 查看详情
linux企业运维——k8s高可用集群架构搭建详解(代码片段)
...节点四、集群高可用性能测试一、K8s高可用集群架构原理Kubernetes的存储层使用的是Etcd。Etcd是CoreOS开源的一个高可用强一致性的分布式存储服务 查看详情
linux企业运维——k8s高可用集群架构搭建详解(代码片段)
...节点四、集群高可用性能测试一、K8s高可用集群架构原理Kubernetes的存储层使用的是Etcd。Etcd是CoreOS开源的一个高可用强一致性的分布式存储服务,Kubernetes使用Etcd作为数据存储后端,把需要记录的pod、rc、service等资源信息... 查看详情
rancher2.2.2-ha部署高可用k8s集群(代码片段)
...安装Rancher,确保用户始终可以访问RancherServer。当安装在Kubernetes集群中时,Rancher将与集群的etcd集成,并利用Kubernetes调度实现高可用。为确保高可用,本文所部署的Kubernetes集群将专用于运行Rancher,Rancher运行起来后,可再创建或... 查看详情
k8s高可用+负载均衡集群
K8s高可用集群配置高可用(HA)Kubernetes集群,有以下两种可选的etcd拓扑:集群master节点与etcd节点共存,etcd也运行在控制平面节点上使用外部etcd节点,etcd节点与master在不同节点上运行本实验使用第一种堆... 查看详情
高可用集群篇--k8s快速入门及集群部署(代码片段)
...)--K8S快速入门及集群部署一、K8s快速入门1.1简介1.1.1Kubernetes是什么1.1.2为什么要使用Kubernetes1.1.3Kubernetes不是什么1.1.4Kubernetes工作示例1.2架构原理&核心概念1.2.1整体主从方式1.2.2Master节点架构1.2.3Node节点架构1.3完整概念1.4... 查看详情
k8s高可用部署后续:slb
前一段时间写了使用keepalived+haproxy部署k8s高可用集群,核心思想是利用keepalived生成vip实现主备容灾,以及haproxy负载k8s-apiserver流量。k8s高可用部署:keepalived+haproxy这种方式是自己实现了负载均衡。本文将探讨在用户已有SLB的场景... 查看详情
【k8s精选】cka-管理高可用性kubernetes集群
参考技术A创建HA集群的一般步骤:●设置负载均衡器。有许多开源选项可用于负载均衡:HAproxy、Envoy或来自云提供商的类似负载均衡器效果很好。●在第一个控制平面节点上运行kubeadminit,并进行以下修改:①创建kubeadm配置文件... 查看详情
云原生|kubernetes篇自建高可用k8s集群搭建(代码片段)
文末有惊喜文章目录自建高可用k8s集群搭建一、所有节点基础环境1、环境准备与内核升级2、安装Docker二、PKI三、证书工具准备1、下载证书工具2、ca根配置3、ca签名请求4、生成证书5、k8s集群是如何使用证书的四、etcd高可用搭建... 查看详情
k8s-高可用
...OS7.x系统自带的3.10.x内核存在一些Bugs,导致运行的Docker、Kubernetes不稳定,例如:rpm-Uvhhttp://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm什么是ipvs模式linux内核4.19后nf_conntrack_ipv4改成成nf_conntrack下面我们需要在所有的master节点【mas... 查看详情
k8s高可用部署:keepalived+haproxy
...dtopology(堆叠ETCD)和Externaletcdtopology(外部ETCD)。https://kubernetes.cn/docs/setup/production-environment/tools/kubeadm/ha-topology/#external-etcd-topology堆叠ETCD:每个master节点上运行一个apiserver和etcd,etcd只与本节点apiserver通信。外部ETCD:etcd集群运行在... 查看详情
k8s高可用部署后续:slb
前一段时间写了使用keepalived+haproxy部署k8s高可用集群,核心思想是利用keepalived生成vip实现主备容灾,以及haproxy负载k8s-apiserver流量。k8s高可用部署:keepalived+haproxy这种方式是自己实现了负载均衡。本文将探讨在用户已有SLB的场景... 查看详情
kubespray安装高可用k8s集群
...ay快速安装高可用k8s集群Kubespray简介Kubespray(opensnewwindow)是Kubernetesincubator中的项目,目标是提供ProductionReadyKubernetes部署方案,该项目基础是通过AnsiblePlaybook来定义系统与Kubernetes集群部署的任务,具有以下几个特点:可以部署在AWS... 查看详情
k8s-高可用架构设计(代码片段)
docker的私有仓库harbor、容器化kubernetes部分组建、使用阿里云日志服务收集日志。部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题,所以本文档主要适合于那些有一定kubernetes基础,想通过一步步部署的方... 查看详情
k8s通过keepalive+nginx实现nginx-ingress-controller高可用(代码片段)
参考:https://github.com/kubernetes/ingress-nginxhttps://github.com/kubernetes/ingress-nginx/tree/main/deploy/static/provider/baremetal通过keepalive+nginx实现nginx-ingress-controller高可用给node节点增加标签kubectllabelnode k8s-01 kubernetes.io/ingress=nginxkubectllabe... 查看详情
k8s通过ingress-nginx高可用实现灰度发布
参考:https://github.com/kubernetes/ingress-nginxhttps://github.com/kubernetes/ingress-nginx/tree/main/deploy/static/provider/baremetal首先搭建 keepalive+nginx实现nginx-ingress-controller高可用具体过程请参考:K8s通过keepalive+nginx实现nginx-ingress-controller高可... 查看详情