高可用的K8S集群部署方案
涉及到的内容
- LVS
- HAProxy
- Harbor
- etcd
- Kubernetes (Master Worker)
整体拓补图
以上是最小生产可用的整体拓补图(相关节点根据需要进行增加,但不能减少)
按功能组划分
- SLB
- LVS
- HAProxy
- etcd
- K8S Node (Master / Worker)
SLB
LVS 、HAProxy 被规划为基础层,主要提供了一个高可用的7层负载均衡器。
由LVS keepalived 提供一个高可用的VIP(虚拟IP)。
这个VIP DR模式转发到后端的HAProxy服务器。
HAProxy反代了K8S Master服务器,提供了K8S Master API的高可用和负载均衡能力。
可以使用Nginx代替HAProxy吗?
是可以的,这边使用HAproxy是因为k8s文档中出现了HAproxy,且后续可能会有4层反代的要求,从而使用了HAProxy。
可以直接从LVS转发到Master吗?
理论上可行,我没有试验。
如果不缺两台机器推荐还是架设一层具有7层代理能力的服务。
k8s apiserver、harbor、etcd都是以HTTP的方式提供的api,如果有7层代理能力的服务后续会更容易维护和扩展。
推荐配置
用途 | 数量 | CPU | 内存 |
---|---|---|---|
Keepalive | 2 | 4 | 4GB |
HAProxy | 2 | 4 | 4GB |
etcd
etcd是一个采用了raft算法的分布式键值存储系统。
这不是k8s专属的是一个独立的分布式系统,具体的介绍大家可以参考官网,这边不多做介绍。
我们采用了 static pod的方式部署了etcd集群。
失败容忍度
最小可用节点数:(n/2)+1,下面是一个参考表格,其中加粗的是推荐的节点数量:
| 总数 | 最少存活 | 失败容忍 |
| :--: | :--: | :--: |
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 3 | 2 | 1 |
| 4 | 3 | 1 |
| 5 | 3 | 2 |
| 6 | 4 | 2 |
| 7 | 4 | 3 |
| 8 | 5 | 3 |
| 9 | 5 | 4 |
推荐配置
括号内是官方推荐的配置
用途 | 数量 | CPU | 内存 |
---|---|---|---|
etcd | 3 | 4 (8~16) | 8GB (16GB~64GB) |
官网:
https://etcd.io/
官方硬件建议:
https://etcd.io/docs/v3.3.12/op-guide/hardware/
Static Pod部署文档:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/
Kubernetes集群
kubernetes集群主要有两种类型的节点:Master和Worker。
Master则是集群领导。
Worker是工作者节点。
可以看出这边主要的工作在Master节点,Worker节点根据具体需求随意增减就好了。
Master节点的高可用拓补官方给出了两种方案。
- Stacked etcd topology(堆叠etcd)
- External etcd topology(外部etcd)
可以看出最主要的区别在于etcd的部署方式。
第一种方案是所有k8s Master节点都运行一个etcd在本机组成一个etcd集群。
第二种方案则是使用外部的etcd集群(额外搭建etcd集群)。
我们采用的是第二种,外部etcd,拓补图如下:
如果采用堆叠的etcd拓补图则是:
这边大家可以根据具体的情况选择,推荐使用第二种,外部的etcd。
参考来源:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
Master节点的组件
- apiserver
- controller-manager
- scheduler
一个master节点主要含有上面3个组件 ( 像cloud-controller-manager这边就不多做说明了,正常不会用到 )
apiserver: 一个api服务器,所有外部与k8s集群的交互都需要经过它。(可水平扩展)
controller-manager: 执行控制器逻辑(循环通过apiserver监控集群状态做出相应的处理)(一个master集群中只会有一个节点处于激活状态)
scheduler: 将pod调度到具体的节点上(一个master集群中只会有一个节点处于激活状态)
可以看到除了apiserver外都只允许一个 实例处于激活状态(类HBase)运行于其它节点上的实例属于待命状态,只有当激活状态的实例不可用时才会尝试将自己设为激活状态。
这边牵扯到了领导选举(zookeeper、consul等分布式集群系统也是需要领导选举)
Master高可用需要几个节点?失败容忍度是多少?
k8s依赖etcd所以不存在数据一致性的问题(把数据一致性压到了etcd上),所以k8s master不需要采取投票的机制来进行选举,而只需节点健康就可以成为leader。
所以这边master并不要求奇数,偶数也是可以的。
那么master高可用至少需要2个节点,失败容忍度是(n/0)+1,也就是只要有一个是健康的k8s master集群就属于可用状态。(这边需要注意的是master依赖etcd,如果etcd不可用那么master也将不可用)
Master组件说明:
https://kubernetes.io/docs/concepts/overview/components/
部署文档:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
硬件配置
用途 | 数量 | CPU | 内存 |
---|---|---|---|
Master | 3 | 4 | 8GB |
高可用验证
至此生产可用的k8s集群已“搭建完成”。为什么打引号?因为还没有进行测试和验证,下面给出我列出的验证清单
还有涉及的BGP相关的验证不在此次文章内容中,后续会为大家说明。
写在最后
还有一点需要注意的是物理机的可用性,如果这些虚拟机全部在一台物理机上那么还是存在“单点问题”。这边建议至少3台物理机以上。
为什么需要3台物理机以上?
主要是考虑到了etcd的问题,如果只有两台物理机部署了5个etcd节点,那么部署了3个etcd的那台物理机故障了,则不满足etcd失败容忍度而导致etcd集群宕机,从而导致k8s集群宕机。
高可用的K8S集群部署方案的更多相关文章
- Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记
目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...
- [ Openstack ] Openstack-Mitaka 高可用之 Rabbitmq-server 集群部署
目录 Openstack-Mitaka 高可用之 概述 Openstack-Mitaka 高可用之 环境初始化 Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...
- [ Openstack ] Openstack-Mitaka 高可用之 Mariadb-Galera集群部署
目录 Openstack-Mitaka 高可用之 概述 Openstack-Mitaka 高可用之 环境初始化 Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...
- kubernetes教程第一章-kubeadm高可用安装k8s集群
目录 Kubeadm高可用安装k8s集群 kubeadm高可用安装1.18基本说明 k8s高可用架构解析 kubeadm基本环境配置 kubeadm基本组件安装 kubeadm集群初始化 高可用Mas ...
- K8S 使用Kubeadm搭建高可用Kubernetes(K8S)集群 - 证书有效期100年
1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...
- 使用kubeadm进行单master(single master)和高可用(HA)kubernetes集群部署
kubeadm部署k8s 使用kubeadm进行k8s的部署主要分为以下几个步骤: 环境预装: 主要安装docker.kubeadm等相关工具. 集群部署: 集群部署分为single master(单 ...
- Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x
@ 目录 1. 安装说明 2. 节点规划 3. 基本配置 4. 内核配置 5. 基本组件安装 6. 高可用组件安装 7. 集群初始化 8. 高可用Master 9. 添加Node节点 10. Cali ...
- Kubernetes全栈架构师(Kubeadm高可用安装k8s集群)--学习笔记
目录 k8s高可用架构解析 Kubeadm基本环境配置 Kubeadm系统及内核升级 Kubeadm基本组件安装 Kubeadm高可用组件安装 Kubeadm集群初始化 高可用Master及Token ...
- Kubernetes全栈架构师(二进制高可用安装k8s集群扩展篇)--学习笔记
目录 二进制Metrics&Dashboard安装 二进制高可用集群可用性验证 生产环境k8s集群关键性配置 Bootstrapping: Kubelet启动过程 Bootstrapping: ...
随机推荐
- 基于http(s)协议的模板化爬虫设计
声明:本文为原创,转载请注明出处 本文总共三章,前面两章废话吐槽比较多,想看结果的话,直接看第三章(后续会更新,最近忙着毕设呢,毕设也是我自己做的,关于射频卡的,有时间我也放上来,哈哈). 一,系统总 ...
- CSS3: @font-face 介绍与使用
@font-face 是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有 ...
- c# http Post Get 方法
/// <summary> /// get方式访问webapi /// </summary> /// <param name="url">< ...
- 从原理层面掌握@ModelAttribute的使用(使用篇)【一起学Spring MVC】
每篇一句 每个人都应该想清楚这个问题:你是祖师爷赏饭吃的,还是靠老天爷赏饭吃的 前言 上篇文章 描绘了@ModelAttribute的核心原理,这篇聚焦在场景使用上,演示@ModelAttribute ...
- 6.PHP操作MySQL的步骤
第一步:PHP连接MySQL服务器 第三步:设置MySQL请求或返回数据的字符集 第四步:执行各种SQL语句 l 查询SQL语句:mysql_query(“SELECT * FROM 007_news ...
- PHP 数组转字符串后仍保留数组格式
写此方法的目的是,我想把一个PHP数组配置文件读进程序,添加些配置,然后在写入文件: var_export 方法会把原来的配置打乱(比如数组序号我没有加,他自动给我加上 0,1,2,3...),而且格 ...
- Linux与Unix到底有什么不同?
来自:开源中国 原文:Linux vs. Unix: What's the difference? 链接: https://opensource.com/article/18/5/difference ...
- js作用域链和预编译
js引擎运行分为两步,预解析 代码执行 (1)预解析: js引擎会拿js里面所有的var还有 function 提升到当前作用域的最前面 (2)代码执行:按照代码书写的顺序从上往下执行 预解析分为:变 ...
- 携程PMO--如何召开卓有成效的回顾会
话题介绍 回顾会提供团队反思迭代过程并提出改进措施的机会.回顾会是团队成员共同进行的协作活动,让团队成员跟进并落实改进措施,使团队在下一个冲刺中更高效,这是相当重要的. 我们给出了回顾会的 ...
- MySQL数据库的安装和配置
MySQL数据库介绍 什么是数据库DB? DB的全称是database,即数据库的意思.数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进 ...