Kubefed:

Kubefed主要由三个组件组成:
Kubefed admission webhook:提供了准入控制,作用在CR的创建过程的校验阶段
Kubefed controller-manager:kubefed控制平面,处理自定义资源以及协调不同集群间的资源状态
Kubfedctl:二进制管理工具,实现用户和kubefed的交互,比如集群注册、资源注册等。
需求:支持联邦集群管理、联邦成员管理、租户绑定联邦集群。
技术方案:Kubfedctl v2版本对v1版本架构进行了优化,使用CRD+operator的方式定义一系列自定义联邦资源,并通过自定义controller实现跨集群资源协调能力。
openshift+ACM:
在openshift4.10上,装ACM组件以后,如何通过zero touch provision的方式,来部署一个单节点openshift4.10的集群(SNO),在部署的过程中,我们模拟离线的网络环境,并且禁止DHCP,只用静态IP。

Karmada:

Clusternet
Clusternet ( Cluster Internet ) 是腾讯云开源的兼具多集群管理和跨集群应用编排的云原生项目,让管控多集群就像上网一样简单。

多集群治理经验:

手写operator:
kind新建本地集群:
本地搭建k8s环境,通过kind安装单节点集群。
1 其中集群的创建时间和你的网络环境以及机器的性能有关系,kind 会去 docker hub 上拉取 kindest/node 镜像,这个镜像大概有 400M 的大小。
Windows子系统(WSL2)中安装kind并创建k8s集群 - 悠悠明月 - 博客园 (cnblogs.com)

手写operator:
需求:为每个pod创建一个唯一的value的标签。
operator原理:
1.0版本通过MutatingAdmissionWebhook实现;
2.0 我们需要观察Kubernetes API中任何Pod的变化,并添加我们想要的标签。
利用operator sdk实现一个控制器:控制器是一个协调循环,它从Kubernetes API中读取期望的资源状态,并采取行动使集群的实际状态达到期望状态。
通过sdk初始化了一个文件,controllers/pod_controller.go解析。
operator-sdk create api --group=core --version=v1 --kind=Pod --controller=true --resource=false
该文件包含了PodReconciler类型,该类型包含两个方法:
Reconcile函数:
SetupWithManager函数:operator会在启动时执行SetupWithManager函数,SetupWithManager函数用于生命监听资源类型,因为我们只想要监听Pod资源变化,所以监听资源这部分代码不动。
实现Reconcile函数:
通过入参ctrl.Request中的Pod名称与命名空间字段,请求k8s api获取Pod对象
如果Pod拥有add-pod-name-label注解,给这个Pod添加一个pod-name标签
将上一步Pod的变更回写k8s中
iferr:=r.Update(ctx,&pod);err!=nil{ifapierrors.IsConflict(err){// The Pod has been updated since we read it.// Requeue the Pod to try to reconciliate again.returnctrl.Result{Requeue:true},nil}ifapierrors.IsNotFound(err){// The Pod has been deleted since we read it.// Requeue the Pod to try to reconciliate again.returnctrl.Result{Requeue:true},nil}log.Error(err,"unable to update Pod")returnctrl.Result{},err}
运行operator:
通过shell运行operator:
weiliang@DESKTOP-O8QG6I5:/mnt/d/github/label-operator$ pwd/mnt/d/github/label-operator
查看pod:
weiliang@DESKTOP-O8QG6I5:/mnt/d/github/label-operator$ kubectl get pod
NAME READY STATUS RESTARTS AGE
my-nginx 1/1 Running 0 78s
在operator运行窗口可以看到:
2021-09-24T11:52:10.588+0800INFOcontroller-runtime.manager.controller.pod no updaterequired{"reconciler group":"","reconciler kind":"Pod","name":"my-nginx", "namespace": "default"}2021-09-24T11:52:10.597+0800INFOcontroller-runtime.manager.controller.pod no updaterequired{"reconciler group":"","reconciler kind":"Pod","name":"my-nginx", "namespace": "default"}2021-09-24T11:52:10.630+0800INFOcontroller-runtime.manager.controller.pod no updaterequired{"reconciler group":"","reconciler kind":"Pod","name":"my-nginx", "namespace": "default"}
istio本地安装:
istioctl install:
控制面:sofamesh增强了pilot等功能。智能路由(如A/B测试、金丝雀部署)、流量管理(超时、重试、熔断)功能。
istio-proxy,这个Envoy的扩展,就是在Envoy基础上,增加了一些Filter,然后通过这些个Filter在利用Mixer Client和 Mixer Server进行通信,这样就可以在proxy代理中:熔断,限流。参考:五千字长文详解Istio实践之熔断和限流工作原理 - 腾讯云开发者社区-腾讯云 (tencent.com)
数据面:mosn重写enovy;它提供了很多内置功能,如动态负载服务发现、负载均衡、TLS终止、HTTP/2 & gRPC流量代理、熔断、健康检查等功能。
流量劫持功能:默认采用拦截模式。REDIRECT:使用iptables的REDIRECT目标来拦截入站请求,转给Envoy,从Linux2.6.15的内核版本后,iptables开始支持状态跟踪(conntrack),该功能依赖于netfilter的内核模块nf_conntrack。此后,iptables可以根据包的状态进行二次的过滤拦截和状态跟踪。它也是state/ctstate和nat的主要依赖模块。
问题及解决方案:目前 Istio 使用 iptables 实现透明劫持,由于需要借助于 conntrack 模块实现连接跟踪,在连接数较多的情况下,会造成较大的消耗,同时可能会造成 track 表满的情况,为了避免这个问题,业内有 ebpf 的加速方案,报文可以不过内核协议栈进行加速穿越。

