kubernetes从诞生开始,就从众多容器调度方案脱颖而出,开源的策略加上社区的推动,如今的kubernetes已经成为了云原生应用基座的事实标准。作为当前使用最为广泛的容器编排工具,kubernetes拥有以下众多优势:
(1)自动化:Kubernetes可以自动处理容器的部署、弹性伸缩、负载均衡等任务,大大减少了运维的工作量;
(2)可伸缩性:Kubernetes支持水平扩展,可以根据需求自动调整应用程序的副本数量,并且能够处理大规模集群中的数千个节点;
(3)高可用性:Kubernetes提供了故障恢复和自愈能力,能够在节点出现故障时重新调度容器,并确保应用程序的高可用性;
(4)灵活性:Kubernetes支持多种容器运行时(如Docker),并且可以与其他技术(如Prometheus、Istio等)进行无缝集成,提供更加灵活的解决方案。
对于中小型公司而言,kubernetes基本可以满足应用容器编排的大多数需求,并且起到降本增效的作用。但是,随着信息技术的不断发展,“数字化”要求越来越高,数据量越来越大,加之“云化”思想的不断深入人心,“云原生”的规模也在不断地增长着。在此情况之下,各大云平台也逐渐出现在众人的视野之中。而在云平台之上,机器节点的数量动辄达到百万规模,但是
kubernetes官方表示单个kubernetes集群能稳定运行的机器节点规模在5K左右,超出规模之后kubernetes的存储系统、pod调度性能、容器请求路由性能等都会受到影响。另外在大规模集群管理上,也会存在很多其他问题,比如多集群管理、多租户、事件异常追踪等。
开源项目KubeWharf就是用来解决管理和使用大规模kubernetes集群面临的各种问题的,接下来和大家分享一下自己对KubeWharf的各个子项目的理解。
1.kubebrain
当k8s集群规模逐渐扩大的时候,k8s默认使用的分布式存储系统etcd是最容易出现性能瓶颈的地方之一,kubebrain项目就是用来解决etcd性能不足这个问题的。
kubebrain架构图如下所示:
底层的Kv Storage目前支持badger和TiKV,如果是较为正式的环境,推荐使用TiKV,存储服务本身具备高可用能力。
kubeBrain本身具有无状态、扩展性、高可用和水平扩展的能力,官方测试结果显示 KubeBrain on TiKV的读写性能是要高于ectd的,并且随着集群的扩展,和集群运行时间的积累,ectd的性能会有一定的减弱,而TiKV通过水平扩容,可以有效的降低性能的减弱,所以在大规模集群模式下,是可以选择kubebrain代替ectd的。
虽然kubebrain支持社区版api-server,但字节官方推荐使用定制的api-server,会有更好的性能表现。
2.kubezoo
kubernetes本身对租户概念的支持是比较差的,社区一般推荐使用namespace做项目隔离,通过权限控制让指定的用户访问指定的namespace,也即指定的用户只能管理指定的项目。此种做法虽然效率高,且方便管理,但是缺乏一定的灵活性,比如不同用户的namespace绝对不能相同,而理论上不同租户是应该可以执行相同操作的,比如创建相同的namespace。 KubeZoo 是轻量级的 Kubernetes 多租户项目,基于协议转换的核心理念在一个物理的 K8S 控制面上虚拟多个控制面, 通过在资源的 name/namespace 等字段上增加租户的唯一标识 ,解决不同租户的同名资源在同一个上游 Kubernetes 集群命名冲突的问题,也即不同租户在同一个k8s集群使用相同名称的namespace,给用户一种一个租户使用整个k8s集群的错觉,更符合产品多租户的概念。
kubezoo的设计概念图如下所示:
不同资源的协议转换:
Namespace Scope Resource
Kubernetes 大概有 40 多种 namespace scope 的资源,比如 deployment / statefulset / pod / configmap 等。 通过在每个资源的 namespace 字段关联租户 信息,从而实现 namespace scope 资源的多租户能力。
Cluster Scope Resource
Kubernetes 大概有 20 多种 cluster scope 的资源,比如 pv / namespace / storageclass 等等。通过在 name 关联租户信息, 从而实现 cluster scope 资源的多租户能力。
Custom Resource
Custom Resource Definition(CRD) 是一种特殊的 cluster scope 资源,其 name 由 group + plural 组成, 我们选择在 group 前缀关联租户信息。
如上几幅图所示,不同的租户在使用k8s集群的时候,都以为自己创建或使用的是一样的资源,但其实经过KubeZoo的协议转换,对k8s集群本身而言,是不同的资源。
另外KubeZoo具有无侵入性,对租户支持声明式的管理等优点,对用户和k8s集群而言,都非常的友好。
3.kubegateway
在面对海量大规模Kubernetes集群时,不同集群的kube-apiserver的流量管理也是一大难题, kube-gateway就是用来解决该问题, kube-gateway为大规模的kubernetes集群提供了稳定且灵活的流量治理方案。
重要名词解释:
名词 | 含义 |
---|---|
Upstream APIServer | 被 KubeGateway 代理的 APIServer 都被称为 Upstream APIServer |
Upstream Cluster | 相同的几个 APIServer 组成的 Group 被称为 Upstream Cluster |
Endpoint | 一个 Upstream APIServer 的地址,格式为 schema://host:port,比如 https://192.168.0.1:6443 |
impersonate | Kubernetes APIServer 提供的一种特殊机制,允许让某个用户模拟成另外一个用户来进行请求操作 |
架构设计和控制面架构设计:
如上两幅图所示,kube-gateway的设计思想是将不同k8s集群的kube-apiserver分成不同的群组进行管理,在架构设计上,kube-gateway分为两个层面,kube-gateway控制面和代理,控制面本身等同于一个完整kube-apiserver,拥有健全的 Authentication 和 Authorization,并提供了 对 proxy rules 等控制面资源的 CRUD 的操作。代理层则可以经过路由匹配模块,来判断请求应该转发到那些 upstream kube-apiserver,与此同时会对流量进行治理,并传给后端kube-apiserver HTTP2链接。
总的来说,kubegateway是多个k8s集群的kube-apiserver服务的网关,拥有高性能、负载均衡、配置实时生效、降低请求的TCP连接数等优点,既能管理流量还可以有效提高k8s集群性能。
4.kubeadmiral
当需要对多k8s集群,特别是在不同云上环境的k8s集群统一管理的时候,目前用的最多的方案是 Kubernetes Federation v2(联邦集群), Kubernetes Federation v2 提供了 FederatedDeployment, FederatedReplicaSet, FederatedSecret 等部分资源,还能调整资源的副本数。KubeAdmiral是加强版的Kubernetes Federation v2,拥有更强大的功能。也即kubeadmiral主要作用也是用来管理海量k8s集群的,主要是面对海量k8s集群时,统一创建Deployment、ReplicaSet、有状态Deployment等资源,并调度到指定k8s集群。
相比于Kubernetes Federation v2, KubeAdmiral有以下增强:
- 兼容原生 Kubernetes API;
- 提供更灵活的调度框架,支持丰富的调度分发策略;
- 差异化策略;
- 依赖调度/跟随调度;
- 提供状态收集的框架,提供更灵活的状态收集;
- 大规模实践下的功能和稳定性增强。
在以上优点的加持下,在面对海量k8s集群管理和资源调度时,KubeAdmiral表现力更好。
5.Kelemetry
了解分布式系统服务可观察性的小伙伴都知道,链路监控是服务可观察性不可或缺的一部分。k8s作为一个分布式系统,与传统的基于RPC服务相比,kubernetes的可解释性比较低,事件之间没有明确的因果关系,一个对象的变化还会影响另外一个对象,如果没有链路追踪,排查k8s系统的问题难度是很大的。kelemetry基于OpenTelemetry protocol,采集k8s集群中的 audit logs、 controller events、 custom sources data,存储在Jaeger storage中,并通过Jaeger UI展示。
设计架构图如下所示:
kelemetry相当于给k8s集群添加了全链路监控,k8s集群管理员可以随时查看资源的创建过程,当系统出现问题时,也可以通过查看Jaeger UI展示的数据快速定位问题所在,比如Deployment生成多少个Pod,哪个pod调度卡住了。
6.总结
在海量k8s集群管理方面,kubewharf像一个操作系统一样,控制着大规模集群的方方面面,为大规模云平台的构建提供了各种方案。由于时间关系,只是了解了kubewharf子项目的核心概念,并且只是在测试环境做了粗浅的实践,后续还会基于源码更深入的学习该项目,也相信该项目后续可以越来越好。