在Golang项目里直接管理Kubernetes集群中的Pod和Service,最常用的方法是使用官方维护的client-go库。通过它提供的Clientset,我们可以用代码完成资源的增删改查,而不必依赖命令行工具。

初始化Client-go客户端
通常我们使用kubeconfig文件来构建配置对象,然后在集群外连接APIServer。如果在集群内运行,可以使用InClusterConfig。
package main
import (
"context"
"fmt"
"os"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
func newClientset() (*kubernetes.Clientset, error) {
// 从默认路径读取kubeconfig
kubeconfig := os.Getenv("KUBECONFIG")
if kubeconfig == "" {
kubeconfig = os.Getenv("HOME") + "/.kube/config"
}
cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, err
}
return kubernetes.NewForConfig(cfg)
}
使用Client-go操作Pod
创建Pod
我们可以构造一个corev1.Pod对象,并调用Clientset的Create方法。注意命名空间需要提前存在。
import (
corev1 "k8s.io/api/core/v1"
)
func createPod(clientset *kubernetes.Clientset) error {
pod := &corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "demo-pod",
Namespace: "default",
},
Spec: corev1.PodSpec{
Containers: []corev1.Container{
{
Name: "nginx",
Image: "nginx:1.25",
},
},
},
}
_, err := clientset.CoreV1().Pods("default").Create(context.TODO(), pod, metav1.CreateOptions{})
return err
}
查询Pod列表
通过List方法可以获取指定命名空间下的Pod,并结合字段选择器做过滤。
func listPods(clientset *kubernetes.Clientset) error {
pods, err := clientset.CoreV1().Pods("default").List(context.TODO(), metav1.ListOptions{})
if err != nil {
return err
}
for _, p := range pods.Items {
fmt.Printf("pod name: %s status: %sn", p.Name, p.Status.Phase)
}
return nil
}
使用Client-go操作Service
创建Service
Service用来暴露Pod访问入口。下面示例创建一个ClusterIP类型的Service,将80端口映射到Pod的80端口。
func createService(clientset *kubernetes.Clientset) error {
svc := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: "demo-svc",
Namespace: "default",
},
Spec: corev1.ServiceSpec{
Selector: map[string]string{
"app": "demo",
},
Ports: []corev1.ServicePort{
{
Port: 80,
TargetPort: intstr.FromInt(80),
},
},
},
}
_, err := clientset.CoreV1().Services("default").Create(context.TODO(), svc, metav1.CreateOptions{})
return err
}
获取Service信息
使用Get方法读取单个Service的ClusterIP和端口配置。
func getService(clientset *kubernetes.Clientset) error {
svc, err := clientset.CoreV1().Services("default").Get(context.TODO(), "demo-svc", metav1.GetOptions{})
if err != nil {
return err
}
fmt.Printf("service clusterIP: %sn", svc.Spec.ClusterIP)
return nil
}
常见注意事项
- 确保运行程序的机器有访问APIServer的权限,kubeconfig中的证书有效。
- 对资源做写操作时,建议加上错误处理和重试逻辑。
- 如果是在控制器中持续监听变化,可使用Informer而不是轮询List。
在代码里调用input()这类函数与HTML中的<input>标签无关,前者是普通函数调用,不要混淆。
通过上述方式,我们可以在Golang中稳定地管理Kubernetes的Pod和Service资源。client-go还支持Deployment、ConfigMap等更多类型,思路基本一致。
GolangClient-goKubernetes_Pod_Service修改时间:2026-07-25 22:30:16