东行天下

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 

 

一、声明式API的工作原理

在 Kubernetes 项目中,一个 API 对象在 Etcd 里的完整资源路径,是由:Group(API 组)、Version(API 版本)和 Resource(API 资源类型)三个部分组成的。

 Kubernetes对API对象的解析

1 apiVersion: batch/v2alpha1
2 kind: CronJob
3 ...
复制代码
  • 首先,会解析API对象的组。对于 Kubernetes 里的核心 API 对象,比如:Pod、Node 等,是不需要 Group 的(即:它们的 Group 是“”)。所以,对于这些 API 对象来说,Kubernetes 会直接在 /api 这个层级进行下一步的匹配过程。

而对于 CronJob 等非核心 API 对象来说,Kubernetes 就必须在 /apis 这个层级里查找它对应的 Group,进而根据“batch”这个 Group 的名字,找到 /apis/batch。

不难发现,这些 API Group 的分类是以对象功能为依据的,比如 Job 和 CronJob 就都属于“batch” (离线业务)这个 Group。

  • 然后,Kubernetes 会进一步匹配到 API 对象的版本号。对于 CronJob 这个 API 对象来说,Kubernetes 在 batch 这个 Group 下,匹配到的版本号就是 v2alpha1。在 Kubernetes 中,同一种 API 对象可以有多个版本,这正是 Kubernetes 进行 API 版本化管理的重要手段。这样,比如在 CronJob 的开发过程中,对于会影响到用户的变更就可以通过升级新版本来处理,从而保证了向后兼容。
  • 最后,Kubernetes 会匹配 API 对象的资源类型。在前面匹配到正确的版本之后,Kubernetes 就知道,我要创建的原来是一个 /apis/batch/v2alpha1 下的 CronJob 对象
复制代码

 创建这个 CronJob 对象的过程

首先,当我们发起了创建 CronJob 的 POST 请求之后,我们编写的 YAML 的信息就被提交给了 APIServer

而 APIServer 的第一个功能,就是过滤这个请求,并完成一些前置性的工作,比如授权、超时处理、审计等

然后,请求会进入 MUX 和 Routes 流程。如果你编写过 Web Server 的话就会知道,MUX 和 Routes 是 APIServer 完成 URL 和 Handler 绑定的场所。而 APIServer 的 Handler 要做的事情,就是按照我刚刚介绍的匹配过程,找到对应的 CronJob 类型定义

接着,APIServer 最重要的职责就来了:根据这个 CronJob 类型定义,使用用户提交的 YAML 文件里的字段,创建一个 CronJob 对象。在这个过程中,APIServer 会进行一个 Convert 工作,即:把用户提交的 YAML 文件,转换成一个叫作 Super Version 的对象,它正是该 API 资源类型所有版本的字段全集。这样用户提交的不同版本的 YAML 文件,就都可以用这个 Super Version 对象来进行处理了。

接下来,APIServer 会先后进行 Admission() 和 Validation() 操作。比如,我在上一篇文章中提到的 Admission Controller 和 Initializer,就都属于 Admission 的内容.而 Validation,则负责验证这个对象里的各个字段是否合法。这个被验证过的 API 对象,都保存在了 APIServer 里一个叫作 Registry 的数据结构中。也就是说,只要一个 API 对象的定义能在 Registry 里查到,它就是一个有效的 Kubernetes API 对象

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

由于同时要兼顾性能、API 完备性、版本化、向后兼容等很多工程化指标,所以 Kubernetes 团队在 APIServer 项目里大量使用了 Go 语言的代码生成功能,来自动化诸如 Convert、DeepCopy 等与 API 资源相关的操作。这部分自动生成的代码,曾一度占到 Kubernetes 项目总代码的 20%~30%

这也是为何,在过去很长一段时间里,在这样一个极其“复杂”的 APIServer 中,添加一个 Kubernetes 风格的 API 资源类型,是一个非常困难的工作

不过,在 Kubernetes v1.7 之后,这个工作就变得轻松得多了。这,当然得益于一个全新的 API 插件机制:CRD

二、生成API对象

YAML 文件,是 Kubernetes 声明式 API 所必须具备的一个要素

复制代码
 1 # pod的最基础的yaml文件最少需要以下的几个参数
 2 apiVersion: v1 # API版本号,注意:具有多个,不同的对象可能会使用不同API
 3 kind: Pod  # 对象类型,pod
 4 metadata:  # 元数据
 5   name: string # POD名称
 6   namespace: string # 所属的命名空间
 7 spec: # specification of the resource content(资源内容的规范)
 8   containers: # 容器列表
 9     - name: string # 容器名称
10       image: string # 容器镜像
复制代码

使用命令生成一个简单的yaml文件。创建一个deployment对象

1 kubectl create deployment countgame --image=192.168.137.110:5000/countgame:0.91 --dry-run -o yaml  > deploy.yaml
2 注:
3 1. -–dry-run表示测试不在k8s运行(不会具体执行该命令)
4 2. -o yaml 生成yaml格式
5 3. 最后面的 “> deploy.yaml” 表示将生成yaml内容输出到deploy.yaml文件

注:因为上面的Deploymnent的yaml没有指定命名空间,所以创建的pod在默认的命名空间,这里不需要指定命名空间,如果指定可以再加上 kubectl -n default get pods

查看pod有没有运行成功,日志查看

kubectl logs +pod的name

查看pod的IP地址

kubectl describe pod pod-name

进入容器执行命令

kubectl exec countgame-8694fcf45d-g77kf -- curl -s http://10.122.104.12:8082/countgame/user/toGame

 

posted on   东行天下  阅读(406)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
 
点击右上角即可分享
微信分享提示