暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Programming Kubernetes读书笔记-Chapter2

程序员的Cookbook 2020-12-29
763

Chapter2. Kubernetes API Basics

API Server

API Server在Kubernetes中是一个核心组件,集群中所有的组件都是通过API Server来和底层的分布式存储etcd进行交互的。API Server的主要指责有几下几点:

1.所有的组件通过API Server来解耦,通过API Server来产生事件和消费事件。2.负责对象的存储和读取,API Server最终还会和底层的etcd交互,将Kubernetes中的对象存储在etcd中。3.API Server负责给集群内部的组件做代理,例如对Kubernetes dashboard、strea logs、service ports、以及kubectl exec等

API Server提供了符合RESTful类型的接口,主要是用于处理HTTP请求去查询和操作Kubernetes的资源,不同的HTTP method所代表的语义不同:

1.Get
 获取到指定类型的资源,比如POD、或者是获取一个资源list,例如一个namespace下的所有POD
2.POST
 创建一个资源,比如service、deployment等
3.PUT
 更新一个已经存在的资源,比如改变一个POD中的容器镜像
4.PATCH
 部分更新存在的资源,更多细节见: Use a JSON merge patch to update a Deployment[1]
5.DELETE
 销毁一个资源

kubectl -n THENAMESPACE get pods 等同于 HTTP GET api/v1/namespaces/THENAMESPACE/pods的结果。

API Terminology

In Kubernetes programs, a kind directly corresponds with a Golang type.

1.Kind:

表示实体的类型,每一个对象都有一个Kind字段,kind主要有三类。

    1. 表示一个持久化的实体对象,比如Pod、Endpoints等
    2. 一个或多个kind实体,比如PodList、NodeLists等
    3. 特殊目的,比如binding、scale
    复制

    1.API Group: 一堆Kind的逻辑上所属集合2.Version: API group或者是对象的版本,一个group或对象可以存在多个版本。3.Resource: 通常小写、复数形式(pods) 用来识别一系列的HTTP endpoints路径,用来暴露对象的CRUD语义,例如: .../pods/nginx
     查看名为nginx的pod

    所有的Resource都是具有CRUD语义的,但是也存在一些Resource可以支持更多的action,比如.../pod/nginx/port-forward
    ,这个时候我们称之为Subresources
    。这需要通过自定义协议来替代RESET。例如exec是通过WebSockets
    来实现的。

    在Kubernetes中,每一个Kind是直接映射到一个Golang类型的。

    Resources和Kind是相互的,Resources指定HTTP endpoints,而Kind是这个endpoints返回对象的类型,也是etcd中持久化的对象。每一个对象都可以按照version v1来表示,也可以按照v1beta1来表示,可以返回不同的版本

    Resources
    是API group和version的一部分,三者被称之为GVR(GroupVersionResource),一个GVR
    唯一标示一个HTTP path。例如: /apis/batch/v1/namespaces/default/jobs
     通过GVR
    可以获取到类型为kind的对象,同理这个对象也是属于这个version和Group的。因此称之为GVK
    (GroupVersionKind)

    核心组zai api/v1,命名组zai apis/$name/$version,,为什么核心组不是/apis/core/v1呢? 这是因为历史原因导致的,API Group是核心组之后引入的。

    例如下面这个http paths,就可以映射到一个GVR
    ,通过GVR
    可以获取到类型为Kind的对象,也就间接的映射到了一个GVK

    GVK到GVR的映射在Kubernetes中被称之为REST Mapping
    。除了GVR描述的HTTP path外,还存在另外一种类型的HTTP path,比如/metrics
    logs
    healthz
    等 通过在HTTP path后面添加?watch=true
    就可以watch到请求的资源,具体细节见: watch modus[2]

    知道了HTTP path就可以通过curl访问API Server获取到资源,平时我们通过kubectl命令获取资源的方式内部其实也是通过访问HTTP path的方式来获取的,下面列举了两种通过HTTP path获取资源的方式。

      kubectl proxy --port=8080
      curl http://127.0.0.1:8080/apis/batch/v1





      kubectl get --raw /apis/batch/v1
      复制

      API Server如何处理请求

      1.首先HTTP request会被DefaultBuildHandlerChain
      注册的filters chain来处理(鉴权、admission、validation等)
      2.接着根据HTTP path走到分发器,通过分发器来路由到最终的handler3.每一个gvr都会注册一个handler

      Reference

      Use a JSON merge patch to update a Deployment[1]watch modus[2]


      文章转载自程序员的Cookbook,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论