文章目录
client-go源码结构及说明
源码目录结构及说明:
源码目录 | 说明 |
---|---|
discovery | 提供DiscoveryClient发现客户端 |
dynamic | 提供DynamicClient动态客户端 |
informers | 每种kubernetes资源的动态实现 |
kubernetes | 提供ClientSet客户端 |
listers | 为每一个kubernetes资源提供Lister功能,该功能对Get和List请求提供只读的缓存数据 |
plugin | 提供OpenStack、GCP和Azure等云服务商授权插件 |
rest | 提供RESTClient客户端,对Kuberntes API Server执行RESTful操作 |
scale | 提供ScaleClient客户端,用于扩容或缩容Deployment、ReplicaSet、Replication Controller等资源对象 |
tools | 提供常用工具,例如Sharedinformer、Reflector、DealtFIFO及Indexers。提供Client查询和缓存机制,以减少向kube-apiserver发起的请求数等 |
transport | 提供安全的TCP连接,支持Http Stream,某些操作需要在客户端和容器之间传输二进制流,例如exec、attach等操作。该功能由内部的spdy包提供支持 |
util | 提供常用方法,例如WorkQueue工作队列、Certificate证书管理 |
kubeconfig配置管理
kubeconfig可用于管理访问kube-apiserver的配置信息,也支持多集群的配置管理,可在不同环境下管理不同kube-apiserver集群配置。kubernetes的其他组件都是用kubeconfig配置信息来连接kube-apiserver组件。kubeconfig存储了集群、用户、命名空间和身份验证等信息,默认kubeconfig存放在$HOME/.kube/config
路径下。kubeconfig的配置信息如下:
简单点的
apiVersion: v1
kind: Config
clusters:
- cluster:
proxy-url: http://proxy.example.org:3128
server: https://k8s.example.org/k8s/clusters/c-xxyyzz
name: development
users:
- name: developer
contexts:
- context:
name: development
kubeconfig配置信息分为3部分,分别为:
- clusters:定义kubernetes集群信息,例如kube-apiserver的服务地址及集群的证书信息
- users:定义kubernetes集群用户身份验证的客户端凭据,例如client-certificate、client-key、token及username/password等。
- context:定义kuberntes集群用户信息和命名空间等,用于将请求发送到指定的集群
简单点说,clusters (集群),users(用户),context(上下文)
完整的kubeconfig
以minikube搭建的k8s集群为例
apiVersion: v1
clusters:
- cluster:
certificate-authority: /home/zzyy/.minikube/ca.crt
extensions:
- extension:
last-update: Wed, 22 Jun 2024 21:55:00 CST
provider: minikube.sigs.k8s.io
version: v1.33.1
name: cluster_info
server: https://192.168.49.2:8443
name: minikube
contexts:
- context:
cluster: minikube
extensions:
- extension:
last-update: Wed, 22 Jun 2024 21:55:00 CST
provider: minikube.sigs.k8s.io
version: v1.33.1
name: context_info
namespace: default
user: minikube
name: minikube
current-context: minikube
kind: Config
preferences: {
}
users:
- name: minikube
user:
client-certificate: /home/zzyy/.minikube/profiles/minikube/client.crt
client-key: /home/zzyy/.minikube/profiles/minikube/client.key
四种Kubernetes APIServer 交互的客户端
Client-Go 共提供了 4 种与 Kubernetes APIServer 交互的客户端。分别是 RESTClient、DiscoveryClient、ClientSet、DynamicClient。
- RESTClient:最基础的客户端,主要是对 HTTP 请求进行了封装,支持 Json 和 Protobuf 格式的数据。
- DiscoveryClient:发现客户端,负责发现 APIServer 支持的资源组、资源版本和资源信息的。
- ClientSet:负责操作 Kubernetes 内置的资源对象,例如:Pod、Service等。
- DynamicClient:动态客户端,可以对任意的 Kubernetes 资源对象进行通用操作,包括 CRD。
RESTClient
RESTClient是最基础的客户端,其他的ClientSet、DynamicClient及DiscoveryClient都是基于RESTClient实现的。RESTClient对HTTP Request进行了封装,实现了RESTful风格的API。
package main
import (
"context"
"flag"
"fmt"
"path/filepath"
_ "time"
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
_ "k8s.io/apimachinery/pkg/api/errors"
_ "k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
func main() {
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
// 把用户传递的命令行参数解析为对应变量的值
flag.Parse()
// use the current context in kubeconfig 在kubeconfig中使用当前上下文
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// 使用 RESTClient 需要开发者自行设置资源 URL
// pod 资源没有 group,在核心组,所以前缀是 api
config.APIPath = "api"
// 设置 corev1 groupVersion
config.GroupVersion = &corev1.SchemeGroupVersion
// 设置解析器,用于用于解析 scheme
config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
// 初始化 RESTClient
restClient, err := rest.