对于kubernetes中不存在的资源类型,我们可以通过自定义资源的方式进行扩展,首先创建customresourcedefinition对象定义资源及其schema,然后就可以创建自定义的资源了,但是此时定义的资源是不具备生命周期的,无法在创建或销毁的过程中自动执行一些操作,例如replicaSet可以自动根据pod的数量来进行failover,如果我们也要实现这种自动控制此时就需要编写对应的controller, controller需要一个infromer来监听创建删除等事件,并执行预先定义的回调函数,代码使用自定义的资源需要通过codegen自动生成其client-go api, 如果资源的变化需要反应在k8s event对象上(这样我们通过kubectl describe 就可以看到发生了什么)还需要利用eventRecorder来产生event.

下面是一些具体的参考资料,我就不重复造轮子了.

CustomResourceDefinition(CRD)

Extend the Kubernetes API with CustomResourceDefinitions    

Advanced topic:

  • Finalizers: 用于controller删除过程,防止hard delete,可以在删除的过程中执行一些必要的操作
  • Validation: 相当于filed的schema
  • Subresources: v1.10中处于alpha版本,定义了status,scale status subresource
  • Categories: 定义group,例如kubectl get all时是否显示

从kubernetes1.8中开始,在创建资源的时候如果指定了ower reference对象,则删除父对象的时候其子对象也会自动删除,所以对于有relationship的资源需要设置这个字段

informer

Kubernetes Informer 详解 基本用法和实现简单介绍

work queue example demo, work queue和index的基本使用方法

可以在informer中EventHandler中添加一个filter

update失败的时候,需要retry, k8s 有 OptimisticConcurrency 机制,如果有两个 client 都在 update 同一个,会 fail。所以写代码时一般会把 update 写到 loop 里,直到 api-server 返回 200,ok 时才确定 update 成功。

controller

sample-controller 完整的官方demo,注释很详细

使用 client-go 控制原生及拓展的 Kubernetes API 从client-go使用到Controller的编写,全覆盖,由google大佬所写

Writing Controllers写controller的注意事项,在上面的sample-controller中会有一些工程实践

A Deep Dive Into Kubernetes Controllers 很详细的controller的实现步骤,推荐

controller中的event recorder相关

Kubernetes Events介绍 上中下

event有个过期时间,默认时间是1h, 所以如果需要一直显示给用户的话要不断用recorder来记录,event是独立存在的一种资源,当describe 其他资源的时候会从其中获取对应的event,

codegen生成client-go api

Kubernetes Deep Dive: Code Generation for CustomResources codegen的使用方式

Extend Kubernetes 1.7 with Custom Resources 这是一个不用code-gen实现的controller

最后发现一篇相似的博文开发operator扩展kubernetes 调研整理,内容有些重复,哈哈

kubernetes controller 实现的更多相关文章

  1. Kubernetes Controller执行框架解析

    毫无疑问,声明式API以及Controller机制是Kubernetes设计理念的基础.Controller不断从API Server同步资源对象的期望状态并且在资源对象的期望状态和实际运行状态之间进 ...

  2. Kubernetes Controller详解

    运行容器化应用是Kubernetes最重要的核心功能.为满足不同的业务需要,Kubernetes提供了多种Controller,主要包括Deployment.DaemonSet.Job.CronJob ...

  3. 编写一个kubernetes controller

    Overview 根据Kuberneter文档对Controller的描述,Controller在kubernetes中是负责协调的组件,根据设计模式可知,controller会不断的你的对象(如Po ...

  4. Kubernetes Controller Manager

    Controller Manager 作为集群内部的管理控制中心,负责集群内的Node.Pod副本.Service Endpoint.NameSpace.ServiceAccount.Resource ...

  5. kubernetes多节点部署解析

    注:以下操作均基于centos7系统. 安装ansible ansilbe可以通过yum或者pip安装,由于kubernetes-ansible用到了密码,故而还需要安装sshpass: pip in ...

  6. 无网络centos7中部署kubernetes

    本文提供的kubernetes1.1实际为kubernetes0.8,最新kubernetes部署方式见下一篇文章:centos下kubernetes+flannel部署. 一.部署环境信息: 1)m ...

  7. kubernetes多节点部署的决心

    注:以下操作均基于centos7系统. 安装ansible ansilbe能够通过yum或者pip安装,因为kubernetes-ansible用到了密码.故而还须要安装sshpass: pip in ...

  8. Ubuntu上手动安装Kubernetes

    背景 两台Ubuntu16.04服务器:ip分别为192.168.56.160和192.168.56.161.. Kubernetes版本:1.5.5 Docker版本:1.12.6 etcd版本:2 ...

  9. Kubernetes 设计概要

    英文原文:Kubernetes Design Overview Overview Kubernetes builds on top of Docker to construct a clustered ...

随机推荐

  1. C语言操作符/表达式及其作用总结

    一.算术操作符:+ - * / % 1. 除了 %操作符之外,其他的 几个操作符可以作 用于整数和浮点数. 2. 对于"/"操作符如果两个操作数都为整数,执行整数除法.而只要有浮点 ...

  2. C#/AutoCAD 2018/ObjectArx/二次开发添加删除实体的工具函数(四)

    1.添加删除实体 C# ObjectARX二次开发添加删除实体是非常容易主要代码如下: 添加实体: objId = btr.AppendEntity(entity); trans.AddNewlyCr ...

  3. 【R语言系列】作图入门示例一

    假设有如下数据,我们使用plot函数作图 月龄 体重 月龄 体重  1 4.4 9 7.3 3 5.3 3 6.0 5 7.2 9 10.4 2 5.2 12 10.2 11 8.5 3 6.1 R语 ...

  4. Beta冲刺NO.3

    Beta冲刺 第三天 1. 昨天的困难 1.昨天的困难主要集中在对Ajax的使用上,不熟悉这种语法,所以也就浪费了时间,导致昨天的批量删除没有完全完成. 2.由于之前的网页构造style很乱,导致修改 ...

  5. maven(二)创建工程

    创建动态Web工程打war包 ​ File→new→Maven Project→勾上create a simple project→然后next> ​ 然后会报一下的错 ​ 解决 ​ 创建jav ...

  6. $(function(){})和window.onload的区别

    (1)$(function(){}):DOM节点创建 完成才执行 (2)window.onload:页面所有资源(JS/CSS)加载完成才执行

  7. node express将请求重定向为https

    项目开发时,由于服务器只接受https请求(运维说了算...),所以在生产环境时,要把所有http请求全都重定向为https,具体操作是在app.js文件里加入以下代码: var express = ...

  8. SpringBoot应用的监控与管理

    spring-boot-starter-actuator模块 /health /autoconfig /beans /configprops:应用配置属性信息 /env:环境属性,如:环境变量.jvm ...

  9. GIT入门笔记(18)- 标签创建和管理

    git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id: git tag -a <tagname> -m "blablabla ...

  10. LDAP是什么

    LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.LDAP目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的 ...