Kubernetes控制平面组件:高可用 APIServer
云原生学习路线导航页(持续更新中)
- kubernetes学习系列快捷链接
- Kubernetes架构原则和对象设计(一)
- Kubernetes架构原则和对象设计(二)
- Kubernetes架构原则和对象设计(三)
- Kubernetes控制平面组件:etcd(一)
- Kubernetes控制平面组件:etcd(二)
- Kubernetes控制平面组件:etcd常用配置参数
- Kubernetes控制平面组件:etcd高可用集群搭建
- Kubernetes控制平面组件:etcd高可用解决方案
- Kubernetes控制平面组件:Kubernetes如何使用etcd
- Kubernetes控制平面组件:API Server详解(一)
本文主要对kubernetes的控制面组件API Server 的高可用集群搭建进行介绍,涵盖API Server高可用搭建的注意事项,产线API Server最佳使用实践,以及API Server如何在内部进行负载均衡
- 希望大家多多 点赞 关注 评论 收藏,作者会更有动力继续编写技术文章
1.高可用的多副本API Server
1.1.什么是高可用?
- 所谓高可用,就是将应用部署为多个副本,然后通过负载均衡提供统一入口。
- 应用角度:多个副本,有部分发生异常时,依旧有正常副本能提供服务,保证服务一直在线。
- 用户角度:用户始终通过统一入口使用应用,不关心入口后面到底是哪个副本在处理请求,只要入口不变,后面的服务副本数量、服务行为就都不被感知
1.2.API Server如何配置高可用?
- 简单来说,API Server配置高可用主要分两步:
- 第一,启动多个实例
- 多个实例,需要使用同一个CA签发证书
- API Server本身是无状态的,方便多副本伸缩
- 第二,为多个副本配置负载均衡
- 根据不同厂商,可以采取不同手段。比如HA Proxy、硬件负载均衡F5等
- 第一,启动多个实例
1.3.产线上API Server最佳使用实践?
1.3.1.API Server启动方法
- 可以选择 二进制启动、静态Pod启动 等方法
- 不过更推荐使用 kubelet 拉起 静态Pod的方式
- kubelet 本身具有保证应用高可用的能力,应用死了 kubelet 会主动重启。
- 相比systemd,kubelet 多出了liveness探活等机制,探活失败也会重启pod
1.3.2.预留充足的CPU和内存资源
1.3.3.善用速率限制(RateLimit)
1.3.4.设置合适的缓存大小
- apiserver cache是个循环 range buffer,满了之后,新数据会覆盖最老的数据
1.3.5.客户端尽量使用长连接
- list的时候,即使通过labelFilter过滤,这个过滤动作也是在apiserver做的,尽量用watch代替list
- 如果使用 list(labelFilter过滤) + 没有设置resourceVersion,那么请求就会呗透传到etcd,apiserver首先会从etcd拉取全量数据,然后在apiserver中进行过滤,再返回数据,这个过程可能造成etcd、apiserver压力都很大
2.如何访问API Server
2.1.集群内部组件访问apiserver
2.1.1.default ns 下 svc kubernetes
- 在default ns下有个svc kubernetes,即为kube-apiserver的 svc,类型为ClusterIP,是所有集群内部组件 访问apiserver 的入口
- Kubernetes 的 DNS 服务(如 CoreDNS)会自动解析以下格式的域名:
<service-name>.<namespace>.svc.cluster.local
- 所以 svc kubernetes 的DNS域名为:
kubernetes.default.svc.cluster.local
- 可以验证一下,随便找一个pod,在pod内部解析下域名:
- curl一下这个域名解析出的ip,会发现请求其实是打到了apiserver,但是我没有添加证书,所以响应为401
2.1.2.注意事项
- 配置高可用集群,可以有对内、对外多个负载均衡访问入口,但是对于apiserver组件来说,最好有统一的访问入口,以防不同组件在不同负载均衡位置看到的apiserver状态不一致
- 假如有多个负载均衡入口,有的出了问题,就可能出现问题:不同组件在不同负载均衡位置看到的apiserver状态不一致。统一入口可以避免这种情况
- 这也是云原生带来的一些限制,系统太过于动态了,很多状态和配置都需要不停的监听,组件之间的相互配合如果出现一点问题,影响面都很广
2.2.集群外部访问apiserver
- 通过配置外部负载均衡器,用于外部访问apiserver。但是要保证负载均衡器的高可用性
3.API Server启动参数
- 完整启动参数详解:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-apiserver/
- apiserver pod启动参数示例