kubernetes源码剖析之client-go(一)


  刚入k8s和go的坑,碰巧看到社区的源码研习活动,赶紧加入开始学习阅读clinet-go(client-go源码地址)
  Kubernetes中使用client-go作为Go语言的官方编程式交互客户端库,提供对api server服务的交互访问。对于k8s的二次开发,熟练掌握client-go是十分必要的。


client-go源码结构

cubix@DESKTOP-H2868FG MINGW64 /d/coding/go/src/k8s.io/client-go (14)
$ tree -L 1
.
|-- CHANGELOG.md
|-- CONTRIBUTING.md
|-- Godeps
|-- INSTALL.md
|-- LICENSE
|-- OWNERS
|-- README.md
|-- SECURITY_CONTACTS
|-- code-of-conduct.md
|-- discovery  # 提供DiscoveryClient发现客户端
|-- dynamic # 提供DynamicClient动态客户端
|-- examples
|-- go.mod
|-- go.sum
|-- informers # 每种kubernetes资源的Informer实现
|-- kubernetes # 提供ClientSet客户端
|-- kubernetes_test
|-- listers # 为每一个kubernetes资源提供Lister功能,该功能对Get和List请求提供只读的缓存数据
|-- metadata
|-- pkg
|-- plugin # 提供OpenStack、GCP和Azure等云服务商授权插件
|-- rest # 提供RESTClient客户端,对Kuberntes API Server执行RESTful操作
|-- restmapper
|-- scale # 提供ScaleClient客户端,用于扩容或缩容Deployment、ReplicaSet、Replication Controller等资源对象
|-- testing
|-- third_party
|-- tools # 提供常用工具,例如Sharedinformer、Reflector、DealtFIFO及Indexers。提供Client查询和缓存机制,以减少向kube-apiserver发起的请求数等
|-- transport # 提供安全的TCP连接,支持Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如exec、attach等操作。该功能由内部的spdy包提供支持
`-- util # 提供常用方法,例如WorkQueue工作队列、Certificate证书管理

19 directories, 10 files

Client客户端对象

  client-go支持4中client客户端对象与api server交互的访问方式, Client对象通过kubeconfig配置信息连接到指定的Kubernetes API Server

  • RESTClient
  • ClientSet
  • DynamicClient
  • DiscoveryClient

RESTClient

  RESTClient是最基础的客户端,对HTTP Request进行了封装,实现了RESTful风格的API,其他的三个client都是基于RESTClient实现的。

ClientSet

  ClientSet在RESTClient的基础上封装了对Resource和Version的管理方法,每一个Resource和Version都以函数的方式暴露给开发者。ClientSet只能够处理Kubernetes内置资源,不能直接访问CRD自定义资源。ClientSet是通过client-gen代码生成器自动生成的。

DynamicClient

  DynamicClient和ClientSet最大的区别在于,DynamicClient能够访问Kubernetes中的所有资源对象,包含Kubernetes内置资源和CRD自定义资源。

DiscoveryClient

  用于发现kube-apiserver所支持的资源组(Group),资源版本(Versions),资源信息(Resources)

kubeconfig配置管理

  kubeconfig用于管理访问kube-apiserver的配置信息,kubeconfig中存储了集群、用户名、命名空间、身份验证等信息。kubernetes的其他组件都使用kubeconfig配置信息来连接kube-apiserver组件。 例如当使用kubectl时,会默认加载kubeconfig配置信息。

kubeconfig配置信息组成

  • clusters
    定义kubernetes集群信息,例如apiserver的服务地址和集群的证书等
  • users
    定义kubernetes集群的用户身份验证的客户端凭据,如client-certificate、client-key、token和username/password等
  • contexts
    定义kubernetes集群用户信息和命名空间等,用于将请求发送到指定的集群
package main

import (

    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    config, err := clientcmd.BuildConfigFromFlags("", "D:\\kube\\config")
    if err != nil {
        panic(err)
    }
    ...
}

 上面代码中client-go读取kubeconfig配置信息,实例化rest.Config对象。其中kubeconfig最核心的功能是管理多个访问kube-apiserver集群的配置信息,将多个配置信息合并成一份,合并的过程中会解决多个配置文件字段冲突的问题。