使用client-go在命令空间test里面对pod进行操作

目录

一、获取使用restApi调用的token信息

二、client-go操作pod示例

1、获取到客户端

2、创建pod

3、获取test命令空间的所有pod

4、获取某个具体pod的详细信息

5、更新pod

6、删除pod

三、总结


官方参考地址:https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/

一、获取使用restApi调用的token信息


[root@k8s-master01 projects]# kubectl create token postman-sa
eyJhbGciOiJSUzI1NiIsImtpZCI6IkwzUWF1NHdyek9kZUl1NEJMWGFLV3NMenVkUmpxWTZfbzZlZktUTDZWeFkifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzMyNjE4OTY0LCJpYXQiOjE3MzI2MTUzNjQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwic2VydmljZWFjY291bnQiOnsibmFtZSI6InBvc3RtYW4tc2EiLCJ1aWQiOiJjZWNjOTVlOC1hMmM4LTRkZjYtYmY4Ny1lMDg1ZjU0YjI5ODcifX0sIm5iZiI6MTczMjYxNTM2NCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6cG9zdG1hbi1zYSJ9.qAs7SZrm90WTGHYCVT_XAZ2q_GS12jOmlM03dsr-pQINcHUCP0QoNS7rELMJZhZF2p5j7kImkHEQyEG0s0xQxrT8Gqy2-USq5YYW3HLW2VOCQYsNaR1ih3EucTgOuSVvVkqelBR3AI6PSTkV1H2q5rik-7BYr7xxyu9A05gl7Cgbg0ZtR9WfKglChpQ1cgFC7OBo0CO1F-mkVZlaXigdnIEQNhhvIO0o-mxrPNFlQ5IMI1LAtXOrKnxxja5XfmiiOh2YohTaMJPfW5CRNwDIvzbP6C8dRoK-sC_jfYS0uMn2epAdzPyXu8s_LNLUxxxAg-BZD6U3OqX_2mK4lKS0KQ

通过使用kubectl create token serviceaccountName来获取到服务账号对应的token信息,进而直接通过client-go来操作k8s集群。

二、client-go操作pod示例

1、获取到客户端

func getClient() *kubernetes.Clientset {
	// 假设你已经有了token
	token := "eyJhbGciOiJSUzI1NiIsImtpZCI6IkwzUWF1NHdyek9kZUl1NEJMWGFLV3NMenVkUmpxWTZfbzZlZktUTDZWeFkifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzMyNjE1NzMxLCJpYXQiOjE3MzI2MTIxMzEsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwic2VydmljZWFjY291bnQiOnsibmFtZSI6InBvc3RtYW4tc2EiLCJ1aWQiOiJjZWNjOTVlOC1hMmM4LTRkZjYtYmY4Ny1lMDg1ZjU0YjI5ODcifX0sIm5iZiI6MTczMjYxMjEzMSwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6cG9zdG1hbi1zYSJ9.o_4CGeouCp8OUv7wq_TlpdraoM_zo4TXxBKy-hBWK79KdnU5GttujAe1XX49Ib2Pj1ycGChZUKHYVtsjojKD5evsWjgzaULIJLJ8809OwGZGWbvVeTUaLf9Xoo9jOTuIRR98e3MwdbgeUypstvaQbdLmlPnlG7fs8Od9jfwQBRGttlsBTDqNG0o9QleJyk_hebanh1Z_eMQvUFdYSUc9RrQlSDSNvtAF_h6vhizdQeb_ePj1MPnZOPLUs9a4rbycJ5NtuWrLsDxpxlhrly_XDVUsvU9KqazaNG6Z8lIGgY09vQnDTht_-n0X9UJdQuf_u7BIS111wMHnqC50zDnoMA"

	// 创建配置
	config := &rest.Config{
		Host:        "https://192.168.188.101:6443",
		BearerToken: token,
		// 可能还需要设置其他字段,如TLSClientConfig等
		TLSClientConfig: rest.TLSClientConfig{
			Insecure: true, // 不要在生产环境中使用!
		},
	}

	// 创建客户端
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		// 处理错误
		log.Fatalf("Error to new client!")
	}
	return clientset
}

      参数说明:

       token为上面步骤获取到数据

      host地址为你k8s集群中apiServer的运行地址

2、创建pod

func createPod(clientset *kubernetes.Clientset) {

	// 定义Pod
	pod := &v1.Pod{
		ObjectMeta: metav1.ObjectMeta{
			Name: "example-pod",
			//Namespace: "test",
		},
		Spec: v1.PodSpec{
			Containers: []v1.Container{
				{
					Name:  "example-container",
					Image: "nginx:1.15-alpine",
				},
			},
		},
	}
	// 创建Pod
	fmt.Println("Creating pod...")
	podsClient := clientset.CoreV1().Pods("test")
	result, err := podsClient.Create(context.TODO(), pod, metav1.CreateOptions{})
	if err != nil {
		panic(err.Error())
	}
	fmt.Printf("Namespace: %s, Name: %s, Status: %s\n", result.Namespace, result.Name, result.Status.Phase)
}

3、获取test命令空间的所有pod

func listPod(clientset *kubernetes.Clientset) {
	// 创建Pod
	fmt.Println("list pod...")
	podsClient := clientset.CoreV1().Pods("test")
	result, err := podsClient.List(context.TODO(), metav1.ListOptions{})
	if err != nil {
		panic(err.Error())
	}
	for _, pod := range result.Items {
		fmt.Printf("Namespace: %s, Name: %s, Status: %s\n", pod.Namespace, pod.Name, pod.Status.Phase)
	}
}

4、获取某个具体pod的详细信息

func getPodDetail(clientset *kubernetes.Clientset) *v1.Pod {
	// 创建Pod
	fmt.Println("list pod...")
	podsClient := clientset.CoreV1().Pods("test")
	pod, err := podsClient.Get(context.TODO(), "example-pod", metav1.GetOptions{})
	if err != nil {
		panic(err.Error())
	}
	fmt.Printf("Namespace: %s, Name: %s, Status: %s\n", pod.Namespace, pod.Name, pod.Status.Phase)
	return pod
}

5、更新pod

func updatePod(clientset *kubernetes.Clientset) {
	pod := getPodDetail(clientset)
	// Update Pod (e.g., add an annotation)
	pod.Annotations = map[string]string{
		"updated-by": "client-go",
	}
	// 创建Pod
	fmt.Println("list pod...")
	podsClient := clientset.CoreV1().Pods("test")
	updatedPod, err := podsClient.Update(context.TODO(), pod, metav1.UpdateOptions{})
	if err != nil {
		log.Fatalf("Error updating Pod: %v", err)
	}
	fmt.Printf("Updated Pod %q with annotation.\n", updatedPod.Name)
	fmt.Printf("Namespace: %s, Name: %s, Status: %s\n", pod.Namespace, pod.Name, pod.Status.Phase)
}

6、删除pod

func deletePod(clientset *kubernetes.Clientset) {
	// Delete Pod
	deletePolicy := metav1.DeletePropagationForeground
	podsClient := clientset.CoreV1().Pods("test")
	err := podsClient.Delete(context.TODO(), "example-pod", metav1.DeleteOptions{
		PropagationPolicy: &deletePolicy,
	})
	if err != nil {
		log.Fatalf("Error deleting Pod: %v", err)
	}
	fmt.Printf("Pod %q deleted.\n", "example-pod")

}

三、总结

本文详细介绍了如何通过client-go来对pod进行操作,并且具体演示了对pod的创建、获取列表、获取pod详情、更新pod、已经删除pod的操作。

<think>好的,我现在需要帮助用户找到关于如何使用client-go的RESTClient进行代码实现的示例或指南。首先,我需要回忆一下client-go的相关知识,特别是RESTClient的部分。 根据用户提供的引用内容,引用[3]提到Clientset的使用示例,但用户需要的是RESTClient的具体实现。RESTClientclient-go中最基础的客户端,提供了对Kubernetes API的RESTful请求的封装。通常,RESTClient需要手动配置,包括设置基础URL、版本、编解码器等。 接下来,我需要检查现有的引用是否有相关内容。引用[1]提到学习client-go库是必须的,引用[2]是关于Deployment的配置,引用[4]解释了informer和indexer的工作机制,这些可能和RESTClient直接关联不大。因此,可能需要依靠我的知识库来补充。 步骤一:确认RESTClient的基本用法。用户需要创建一个RESTClient实例,然后使用它发送GET、POST等请求。需要配置正确的API路径和组版本。 步骤二:编写示例代码。例如,如何创建一个RESTClient,如何构造请求,处理响应。代码中可能需要导入必要的包,比如"k8s.io/client-go/rest","k8s.io/client-go/transport"等。 步骤三:考虑权限配置,比如ServiceAccount和RBAC,这在引用[2]中提到了serviceAccountName的设置,所以需要提醒用户确保正确的权限,避免权限问题导致请求失败。 步骤四:验证示例的正确性。比如,使用RESTClient获取Pod列表,需要指定资源路径为/api/v1/namespaces/{namespace}/pods,并处理返回的结果。 步骤五:补充注意事项,比如错误处理、长连接管理、版本兼容性。引用[1]提到client-go与Kubernetes版本的对应关系,需要提醒用户注意版本匹配。 可能还需要考虑是否需要使用Informer或其他高级功能,但用户明确要求RESTClient,所以应专注于基础REST请求的实现。 最后,生成相关问题,帮助用户深入理解,比如与其他客户端的区别、配置认证、错误处理等。</think>### 如何使用 client-go 的 RESTClient 实现代码 #### 1. RESTClient 基础配置 RESTClientclient-go 中最底层的客户端实现,需要手动配置 API 路径和编解码器。以下是创建 RESTClient 的示例: ```go package main import ( "fmt" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) func main() { // 1. 加载 kubeconfig 文件 kubeconfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( clientcmd.NewDefaultClientConfigLoadingRules(), &clientcmd.ConfigOverrides{}, ) restConfig, err := kubeconfig.ClientConfig() if err != nil { panic(err) } // 2. 配置 RESTClient 参数 restConfig.ContentConfig = rest.ContentConfig{ GroupVersion: &v1.SchemeGroupVersion, // 指定 API 版本 NegotiatedSerializer: scheme.Codecs, // 编解码器 } // 3. 创建 RESTClient 实例 restClient, err := rest.RESTClientFor(restConfig) if err != nil { panic(err) } // 示例:获取 default 命名空间Pod 列表 result := &v1.PodList{} err = restClient.Get(). Namespace("default"). Resource("pods"). VersionedParams(&metav1.ListOptions{}, scheme.ParameterCodec). Do(context.TODO()). Into(result) if err != nil { panic(err) } for _, pod := range result.Items { fmt.Printf("Pod: %s\n", pod.Name) } } ``` #### 2. 核心参数说明 - **GroupVersion**:指定资源所属的 API 组和版本,如 `apps/v1` - **NegotiatedSerializer**:用于序列化和反序列化数据,通常使用 `scheme.Codecs` - **HTTP 客户端配置**:超时、TLS 证书等通过 `rest.Config` 设置[^3] #### 3. 权限配置要点 需在 Kubernetes 集群中配置 RBAC 权限(参考引用[2]): ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: restclient-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] ``` #### 4. 高级用法示例:创建自定义资源 ```go type MyResource struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec MySpec `json:"spec"` } // 发送 POST 请求创建资源 err = restClient.Post(). Namespace("default"). Resource("myresources"). Body(&MyResource{ ObjectMeta: metav1.ObjectMeta{Name: "demo"}, Spec: MySpec{Data: "test"}, }). Do(context.TODO()). Error() ``` #### 5. 注意事项 1. **版本兼容性**:需确保 client-go 版本与 Kubernetes 集群版本匹配[^1] 2. **长连接管理**:建议使用 `rest.DefaultRetryOnError` 处理连接中断 3. **性能优化**:对高频操作建议使用 Informer 机制[^4] 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值