一、概述
访问K8S集群出了使用客户端工具kubectl,还可以通过编写代码的方式来访问,其中需要使用官方提供的客户端依赖库client-go。
通过client-go访问API Server首先就是需要认证。下面我们将通过client-go来编写一个示例小程序,完成认证后查询出默认命名空间default下的Pod,并打印出Pod的名字信息。
二、编码实现
1. 准备目录
mkdir in-cluster
cd in-cluster
touch main.go
代码逻辑将在main.go实现。
2. 代码实现
package main
import (
"context"
"log"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
func main() {
// 获取认证信息
config, err := rest.InClusterConfig()
if err != nil {
log.Fatal(err)
}
// 创建客户端
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatal(err)
}
for {
// 查询default命名空间下的所有Pod
pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
if err != nil {
log.Fatal(err)
}
log.Printf("There are %d pods in cluster\n", len(pods.Items))
for i, pod := range pods.Items {
log.Printf("%d ---> %s/%s", i, pod.Namespace, pod.Name)
}
// 每10s查询一次
<-time.Tick(10*time.Second)
}
}
在K8S中,创建Pod时会自动把ServiceAccount token信息挂载到容器内的固定目录下,目录为/var/run/secrets/kubernetes.io/serviceaccount,因此使用InClusterConfig()方法获取配置,实际就是读取这个目录下的token和ca.crt两个文件。
三、部署运行
1. 编译代码
GOOS=linux go build -o in-cluster main.go
2. 准备Dockerfile
vim Dockerfile
# 加入一下内容
FROM busybox
COPY ./in-cluster /app/in-cluster
ENTRYPOINT /app/in-cluster
3. 打包镜像
docker build -t in-cluster:v1 .
4. 创建ClusterRoleBindling
kubectl create clusterrolebinding default-view --clusterrole=view --serviceaccount=default:default
5. 启动Pod
kubectl run -i in-cluster --image=in-cluster:v1
6. 查看结果
四、总结
本章简单介绍了如何使用client-go通过集群内认证的方式访问K8S集群,从上面结果来看,我们最终从default命名空间下查到了所有的Pod。
本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对Go云原生课程感兴趣的读者,可以点击链接,详细查看详细的服务: https://ke.qq.com/course/422970?flowToken=1043281#term_id=100504894