zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

2022-03-30 设计k8s的redis-operator中的controller的设计模式

Redisk8s设计模式 设计 2022 30 03 Controller
2023-09-27 14:25:42 时间

目录

摘要:

设计思想:

一. 观察者模式

主要表现在informs与k8s-apis的交互上

需要注意k8s-apis向注册者广播事件, 需要使用双向通信

二. 状态器模式

主要为controller中对CRD资源的持续检测

例如:


摘要:

operator中的controller是一个非常好的设计模式的淬炼对象, 本文对其中有意思的设计做一些记录.

设计思想:

一. 观察者模式

主要表现在informs与k8s-apis的交互上

  1. 第一步先使用list拿到所有的资源类型
  2. 第二步使用watch,向k8s-apis的etcd注册监听事件
  3. 第三步, 当k8s的etcd的资源有所变化, 则利用etcd的watch机制对注册者进行广播

需要注意k8s-apis向注册者广播事件, 需要使用双向通信

  1. 直接使用socket, 变体websocket. socket的双向通道是由两个单向通道组合而成
  2. 利用http的chrunk流传输功能, 持续不断的的响应

二. 状态器模式

主要为controller中对CRD资源的持续检测

  1. CRD资源在某一时刻只能存在一个特定的状态
  2. controller需要控制让CRD资源达到yaml文件描述的状态

例如:

需要在不同状态中控制行为

	switch instance.Status.InstanceStatus {
	case STATUS_ON_START:
		return r.ReconcileCheckSts(ctx, req, instance)
	case STATUS_IN_CHECK_DELETE:
		return r.ReconcileCheckDelete(ctx, req, instance)
	case STATUS_IN_PROCESS_DELETE:
		return r.ReconcileProcessDelete(ctx, req, instance)
	case STATUS_IN_CHECK_STS:
		return r.ReconcileCheckSts(ctx, req, instance)
	case STATUS_IN_CREATE_STS:
		return r.ReconcileInCreatekSts(ctx, req, instance)
	case STATUS_IN_CHECK_PODS:
		return r.ReconcileCheckPods(ctx, req, instance)
	case STATUS_IN_CHECK_SERVICE:
		return r.ReconcileCheckService(ctx, req, instance)
	case STATUS_IN_CREATE_SERVICE:
		return r.ReconcileInCreateService(ctx, req, instance)
	case STATUS_IN_CHECK_REDIS_HA:
		return r.ReconcileCheckRedisHA(ctx, req, instance)
	case STATUS_IN_CREATE_REDIS_HA:
		return r.ReconcileCheckRedisHA(ctx, req, instance)
	case STATUS_IN_FIX_REDIS_SERVER:
		return r.ReconcileCheckRedisHA(ctx, req, instance)
	case STATUS_IN_FORCE_REDO_POD:
		return r.ReconcileCheckRedisHA(ctx, req, instance)
	case STATUS_IN_CHECK_NORMAL:
		return r.ReconcileCheckNormal(ctx, req, instance)
	default:
		r.Logger.Info(fmt.Sprintf("ReconcileHandleStatus fail, unknow status: %d\n", instance.Status))
		return ctrl.Result{RequeueAfter: time.Second * TIME_INTERVAL_NORMAL}, nil
	}