深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
21376 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

25 | 深入解析声明式API(二):编写自定义控制器

张磊 2018-10-19

你好,我是张磊。今天我和你分享的主题是:深入解析声明式 API 之编写自定义控制器。

在上一篇文章中,我和你详细分享了 Kubernetes 中声明式 API 的实现原理,并且通过一个添加 Network 对象的实例,为你讲述了在 Kubernetes 里添加 API 资源的过程。

在今天的这篇文章中,我就继续和你一起完成剩下一半的工作,即:为 Network 这个自定义 API 对象编写一个自定义控制器(Custom Controller)。

正如我在上一篇文章结尾处提到的,“声明式 API”并不像“命令式 API”那样有着明显的执行逻辑。这就使得基于声明式 API 的业务功能实现,往往需要通过控制器模式来“监视”API 对象的变化(比如,创建或者删除 Network),然后以此来决定实际要执行的具体工作。

接下来,我就和你一起通过编写代码来实现这个过程。这个项目和上一篇文章里的代码是同一个项目,你可以从这个 GitHub 库里找到它们。我在代码里还加上了丰富的注释,你可以随时参考。

总得来说,编写自定义控制器代码的过程包括:编写 main 函数、编写自定义控制器的定义,以及编写控制器里的业务逻辑三个部分。

首先,我们来编写这 * 个自定义控制器的 main 函数。

© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • 142
    运维人员看起来越来越费力了😢
    2018-10-31
    2
    28
  • _CountingStars
    Informer 和控制循环分开是为了解耦,防止控制循环执行过慢把Informer 拖死

    作者回复: 是的

    2018-10-19
    12
  • kyleqian
    看了这两天的文章,感觉k8s的机制实在是太具有普适性了,可以基于它构建各种分布式业务平台。本质上它就是一个分布式对象管理平台。

    作者回复: 说对了。所以说把kubernetes跟swarm mesos各种paas等横向比较没啥实际意义

    2018-10-19
    10
  • 勤劳的小胖子-libo
    一般这种工作队列结构主要是为了匹配双方速度不一致,也为了decouple双方。比如典型生产者消费者问题

    作者回复: 对的

    2018-12-15
    7
  • 哈哼
    自定义的controler这么手动跑着,挂了咋办?,是不是应该准备好镜像,用Deployment跑起来?
    2019-03-03
    5
  • gogo
    请问老师,如果用deployment部署一个tag是latest的镜像,怎样进行滚动更新呢?set image的话tag不变,不能出发更新呢

    作者回复: 要用滚动更新就不要用latest tag,否则你准备怎么知道当前在用的是哪个版本的镜像?

    2018-10-19
    4
  • runner
    张老师,问个问题,我们公司的docker业务,容器总数上万个,部分容器依赖宿主机配置文件。现在我们想迁k8s 的话,能不改动这些容器,把他们加入pod管理起来么?如果上万容器都重新调度生成的话,这个改动太大了。

    作者回复: 给它们写yaml描述起来吧。

    2018-10-19
    2
  • Monokai
    处理完api对象的事件后就直接存储在etcd里了么?需不需要再和apiserver打交道?

    作者回复: 需要,所有对etcd的操作都要走apiserver

    2019-08-18
    1
  • solaris.lin
    请问,自定义控制器部署方案在生产场景中是怎么样的呢
    1 耦合在controller-manager中,通过manager来统一部署和高可用,但原生和自定义控制器代码耦合。
    2 独立部署,代码解耦了,但是后期维护成本变高了。
    2019-04-30
    1
  • xfan
    E0107 05:44:18.230692 35973 reflector.go:134] github.com/resouer/k8s-controller-custom-resource/pkg/client/informers/externalversions/factory.go:117: Failed to list *v1.Network: networks.samplecrd.k8s.io is forbidden: User "system:node:node01" cannot list resource "networks" in API group "samplecrd.k8s.io" at the cluster scope
    我在node1上面运行打包后的程序报这个错,使用的kubeconfig 不是 ~/.kube/config 而是请问/etc/kubernetes/kubelet.conf ,因为我没有那个config文件,请问报这个错误的原因是什么呢?
    2019-01-06
    1
  • jssfy
    请问这个控制器是跑在node节点上的?一般哪些控制器是跑在node上哪些是跑在master上呢

    作者回复: 无所谓,哪都行

    2018-11-25
    1
  • 如果一个master 管理的node非常多 通过ListAndWatch 会对master的性能有影响吧

    作者回复: 所以说kubernetes 当前规模是5000

    2018-11-08
    1
  • silver
    思考题:一个FIFO可能会support多个controller,所以controller层面的业务逻辑retry不能放在FIFO而是得有独立的retry queue。同时work queue可以用来实现backoff on error等业务逻辑,而这些逻辑不适合放在FIFO中
    2018-10-21
    1
  • hugeo
    厉害了,原来这才是k8s的精髓
    2018-10-20
    1
  • LQ
    日志跑到 Waiting for informer caches to sync 就 hang 住了,紧跟着的 Starting workers 一直没开始跑,这个是什么原因?
    2019-10-09
  • tuyu
    godep restore获取依赖获取不到k8s.io的相关包有伙伴解决了吗
    2019-10-05
  • 张老师,您好,请问可以补充一下code-generator的使用吗? 我自己根据搜到的一些资料https://itnext.io/how-to-generate-client-codes-for-kubernetes-custom-resource-definitions-crd-b4b9907769ba, 目前还是无法得到生成的listers informer等客户端代码。
    2019-09-23
  • sonald
    看起来自定义的控制器是独立运行的,而不能像一个API对象一样注册到master,并且部署到master上之类的?

    作者回复: 那个就变成aggregator api sever了?

    2019-05-21
  • 单朋荣
    张老师好,很感谢您的课程分享。另外,我想深入做些自定义组件的开发,您一路已经走过来了,想听下您的建议,顺便推荐书,万分感谢!
    2019-03-21
  • arlose
    请问张老师main函数里面的networkInformerFactory := informers.NewSharedInformerFactory(networkClient, time.Second*30)中second*30意思是每个30秒监听一次么?请问有没有详细的文档或者什么网址解释这些api函数的功能参数的呢?
    2019-03-07
收起评论
28
返回
顶部