传统的 Kubernetes 交互方式

传统的 Kubernetes 交互方式众所周知,与 Kubernetes 交互的方式主要有以下几种:kubectl 命令行Kubectl 是官方提供的命令行工具,用于与 Kubernetes 集群进行交互。比如要获取 default 命名空间下的 Pods 信息,命令如下:

1
2
3
kubectl get po                                                                                                                                           
NAME READY STATUS RESTARTS AGE
ng-test-abcd-xyz 1/1 Running 0 13d

这种方式是用户最常使用的。

SDK

Kubernetes 官方还提供了客户端 SDK,让程序员可以通过编程接口与 Kubernetes 交互。由于 Kubernetes 是用 Go 语言编写的,因此最流行的 SDK 是 client-go。以下是通过 client-go 列出 default 命名空间下 Pods 的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main


import (
"context"
"fmt"
"log"


corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)


func main() {
// 加载kubeconfig文件以获取客户端配置
config, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
if err != nil {
log.Fatal(err)
}


// 创建Kubernetes客户端
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatal(err)
}


// 列出default命名空间下的Pods
pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
if err != nil {
log.Fatal(err)
}


// 遍历并打印Pod信息
for _, pod := range pods.Items {
fmt.Printf("Namespace: %v, Name: %v\n", pod.Namespace, pod.Name)
}
}

运行结果如下:

1
Namespace: default, Nmae: ng-test-abcd-xyz

GUI

如果觉得命令行不够直观,用户还可以使用 Kubernetes 官方的 Dashboard 或类似 Kuboard 这样的图形化界面进行操作。

前端 GUI 通过预设的 REST API 与后端服务器交互,后端服务器再通过 client-go 访问 Kubernetes,最终将结果返回前端展示在 GUI 上。无论使用哪种方式,核心都是通过访问 Kubernetes 的 API server 来实现的。举个例子,我们可以用 curl 命令直接与 Kubernetes API 交互:

1
2
curl -k -H "Authorization: Bearer xxxxxxxxxxxxxxxxxx" \                                                                                    
> https://<your k8s server ip>:<your k8s server port>/api/v1/namespaces/default/pods