使用client-go操作K8S

client-go简介

直观上看,用户可以使用kubectl、客户端库或者REST请求来访问K8S API。而实际上,无论是kubectl还是客户端库,都是封装了REST请求的工具。client-go作为一个客户端库,能够调用K8S API,实现对K8S集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作。
源码地址:kubernetes/client-go

通过REST访问K8S

《K8S入门篇》一文中使用kubectl对minikube进行管理,本节中直接使用REST请求来对minikube进行管理。参考Access Clusters Using the Kubernetes API,来测试一下。

kubectl处理API服务器的定位和身份验证。如果要使用curl或wget等http客户端或浏览器直接访问REST API,可以通过多种方式查找和验证API服务器:
(1)在代理模式下运行kubectl(推荐)。建议使用此方法,因为它使用存储的apiserver位置并使用自签名证书验证API服务器的标识。使用此方法无法进行中间人(MITM)攻击。
(2)直接向http客户端提供位置和凭据。这适用于被代理混淆的客户端代码。为了防止中间人攻击,需要将根证书导入浏览器。
使用Go或Python客户端库可以在代理模式下访问kubectl。

启动minikube,查看集群配置

1
2
minikube start
kubectl config view

kubectl代理模式

充当反向代理模式下运行kubectl,它处理定位API服务器和进行身份验证。

1
2
kubectl proxy --port=8080 &
curl http://localhost:8080/api/


此时使用浏览器进行访问,同样可以拿到数据。

grep/cut方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Check all possible clusters, as you .KUBECONFIG may have multiple contexts:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

# Select name of cluster you want to interact with from above output:
# export CLUSTER_NAME="some_server_name"
export CLUSTER_NAME="minikube"

# Point to the API server refering the cluster name
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")

# Gets the token value
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 -d)

# Explore the API with TOKEN
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

jsonpath方法

1
2
3
APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
TOKEN=$(kubectl get secret $(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode )
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

client-go操作K8S

client-go实际上是封装了REST请求的客户端库,能够简化我们的工作。

参考k8s-client-go项目,对k8s进行一些基本操作,包括连接k8s,创建更新deployment,查看deployment状态,查看pod状态等。
在使用该项目之前,需要获取k8s集群的配置信息:
kubectl config view
把配置信息拷贝一下,粘贴到项目中的admin.conf文件中即可。

此外,k8s-client-go项目依赖client-go,因此需要参考《Golang包管理工具》安装好依赖。

后记

本文中学习了client-go的安装方法,然后借助k8s-client-go项目学习了client-go的基本用法。接下来,使用client-go实现在K8S集群中发布项目,go!go!go!

0%