11

K8s | API对象的奥秘!

 3 years ago
source link: https://jiac3366.github.io/2021/11/17/Kubernetes/API%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%A5%A5%E7%A7%98%EF%BC%81/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

+c编程手记

Guangzhou, China
  • K8s是如何对 Resource、Group 和 Version 进行解析,从而找到 对象的定义呢

  • 1、会匹配 API 对象的组
    核心 API 对象,比如:Pod、Node 等, Group 是“”(不需要Group)会直接在 /api 这个层级进行下一步的匹配过程

  • 2、匹配到 API 对象的版本号
    同一种 API 对象可以有多个版本,这正是 Kubernetes 进行 API 版本化管理的重要手段。
    比如在 CronJob 的开发过程中,对于会影响到用户的变更就可以通过升级新版本来处理,从而保证了向后兼容

  • 3、Kubernetes 会匹配 API 对象的资源类型

  • APIserver交互流程

    • 1、授权、超时处理、审计

    • 2、MUX 和 Routes 流程
      APIServer 完成 URL 和 Handler 绑定的场所

    • 3、APIServer 进行Convert 工作,把用户提交的 YAML 文件,转换成一个叫作 Super Version 的对象,它正是该 API 资源类型所有版本的字段全集。
      这样用户提交的不同版本的 YAML 文件,就都可以用这个 Super Version 对象来进行处理

    • 4、 Admission() 和 Validation() 操作

      • 上节提到的的 Admission Controller 和 Initialize

      • Validation,则验证这个对象里的各个字段是否合法
        只要一个 API 对象的定义能在 Registry 里查到,它就是一个有效的 Kubernetes API 对象

    • 5、APIServer 会把验证过的 API 对象转换成用户最初提交的版本,进行序列化操作,并调用 Etcd 的 API 保存

  • 自定义CRD

    • 通俗说:为了让k8s认识这个对象

      • register.go

      pkg/apis/samplecrd/register.go

      • 放置后面要用到的全局变量

      • doc.go 起到的是全局的代码生成控制的作用 被称为 Global Tags
        pkg/apis/samplecrd/doc.go,
        +k8s:deepcopy-gen=package 意思是,请为整个 v1 包里的所有类型定义自动生成 DeepCopy 方法;
        而+groupName=samplecrd.k8s.io,则定义了这个包对应的 API组的名字。

      • types.go

      pkg/apis/samplecrd/types.go
      ​由于 Global Tags,不需要再显式地加上 +k8s:deepcopy-gen=true 了

      • TypeMeta

      • ObjectMeta

        • Gateway

      • register.go——addKnownTypes()

        pkg/apis/samplecrd/v1/register.go

        • 让客户端也能“知道CRD, APIServer 会自动帮我们完成在服务器端的注册
      • 代码生成工具为资源类型生成clientset、informer 和 lister(详看PDF)img

      • 把其中的资源类型、GroupName 和 Version 替换成你自己的定义

    • 总结自定义对象工作分2部分:

      • 自定义资源类型的 API 描述
        组Group、版本(Version)、资源类型(Resource)

      • 自定义资源类型的对象描述
        Spec、Status

  • tip:用 kubebuild 自动生成项目框架,添加自己的 CRD 并实现 controller 即可img


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK