目录
需要注意k8s-apis向注册者广播事件, 需要使用双向通信
摘要:
operator中的controller是一个非常好的设计模式的淬炼对象, 本文对其中有意思的设计做一些记录.
设计思想:
一. 观察者模式
主要表现在informs与k8s-apis的交互上
- 第一步先使用list拿到所有的资源类型
- 第二步使用watch,向k8s-apis的etcd注册监听事件
- 第三步, 当k8s的etcd的资源有所变化, 则利用etcd的watch机制对注册者进行广播
需要注意k8s-apis向注册者广播事件, 需要使用双向通信
- 直接使用socket, 变体websocket. socket的双向通道是由两个单向通道组合而成
- 利用http的chrunk流传输功能, 持续不断的的响应
二. 状态器模式
主要为controller中对CRD资源的持续检测
- CRD资源在某一时刻只能存在一个特定的状态
- 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
}