k8s自定义controller三部曲之三:编写controller代码

}

glog.Info(“worker已经启动”)

<-stopCh

glog.Info(“worker已经结束”)

return nil

}

func (c *Controller) runWorker() {

for c.processNextWorkItem() {

}

}

// 取数据处理

func (c *Controller) processNextWorkItem() bool {

obj, shutdown := c.workqueue.Get()

if shutdown {

return false

}

// We wrap this block in a func so we can defer c.workqueue.Done.

err := func(obj interface{}) error {

defer c.workqueue.Done(obj)

var key string

var ok bool

if key, ok = obj.(string); !ok {

c.workqueue.Forget(obj)

runtime.HandleError(fmt.Errorf(“expected string in workqueue but got %#v”, obj))

return nil

}

// 在syncHandler中处理业务

if err := c.syncHandler(key); err != nil {

return fmt.Errorf(“error syncing ‘%s’: %s”, key, err.Error())

}

c.workqueue.Forget(obj)

glog.Infof(“Successfully synced ‘%s’”, key)

return nil

}(obj)

if err != nil {

runtime.HandleError(err)

return true

}

return true

}

// 处理

func (c *Controller) syncHandler(key string) error {

// Convert the namespace/name string into a distinct namespace and name

namespace, name, err := cache.SplitMetaNamespaceKey(key)

if err != nil {

runtime.HandleError(fmt.Errorf(“invalid resource key: %s”, key))

return nil

}

// 从缓存中取对象

student, err := c.studentsLister.Students(namespace).Get(name)

if err != nil {

// 如果Student对象被删除了,就会走到这里,所以应该在这里加入执行

if errors.IsNotFound(err) {

glog.Infof(“Student对象被删除,请在这里执行实际的删除业务: %s/%s …”, namespace, name)

return nil

}

runtime.HandleError(fmt.Errorf(“failed to list student by: %s/%s”, namespace, name))

return err

}

glog.Infof(“这里是student对象的期望状态: %#v …”, student)

glog.Infof(“实际状态是从业务层面得到的,此处应该去的实际状态,与期望状态做对比,并根据差异做出响应(新增或者删除)”)

c.recorder.Event(student, corev1.EventTypeN

k8s自定义controller的健康检查可以通过在controller的Pod中运行一个HTTP服务,然后在Pod的定义中添加livenessProbe和readinessProbe来实现。 下面是一个简单的示例,假设我们要实现一个名为"my-controller"的controller,并且它的Pod中运行一个HTTP服务,监听端口为8080。 ```yaml apiVersion: v1 kind: Pod metadata: name: my-controller spec: containers: - name: my-controller image: my-controller-image ports: - name: http containerPort: 8080 livenessProbe: # livenessProbe用于检查Pod是否健康 httpGet: path: /healthz port: http initialDelaySeconds: 10 # 初始等待10秒再检查 periodSeconds: 5 # 每5秒检查一次 readinessProbe: # readinessProbe用于检查Pod是否准备好接收流量 httpGet: path: /ready port: http initialDelaySeconds: 5 # 初始等待5秒再检查 periodSeconds: 3 # 每3秒检查一次 ``` 上述示例中,我们在Pod的定义中添加了livenessProbe和readinessProbe。它们都使用了httpGet作为检查方式,并且分别检查了/healthz和/ready这两个路径。这两个路径需要在my-controller的HTTP服务中实现,例如: ```go http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }) http.HandleFunc("/ready", func(w http.ResponseWriter, r *http.Request) { if isReady { w.WriteHeader(http.StatusOK) } else { w.WriteHeader(http.StatusServiceUnavailable) } }) ``` 上述示例中,/healthz路径返回200 OK,表示Pod健康;/ready路径则根据isReady变量的值返回200 OK或503 Service Unavailable,表示Pod是否准备好接收流量。 当Pod的livenessProbe或readinessProbe检测到失败时,k8s会自动重启Pod或停止将流量转发到该Pod。这样就可以保证controller的健康和稳定运行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值