kubernetes - 如何使用client-gokubernetes的客户端库获取服务下的pods?

标签 kubernetes

谁能告诉我如何使用client-go kubernetes的客户端库在服务下获取pod?

谢谢

最佳答案

就清晰度而言,我发现这个公认的答案有点缺乏。此代码在 1.10 下工作。在这个例子中,我的 svc 部署都有一个基于它前面的工件的受控名称,并且 pod 也利用了它。请注意,我是一名 Java 程序员,正在学习围棋,所以对于一些围棋爱好者来说可能有点太多 OO

package main

import (
    "os"
    "log"
    "path/filepath"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/kubernetes"
    typev1 "k8s.io/client-go/kubernetes/typed/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    corev1 "k8s.io/api/core/v1"
    "fmt"
    "strings"
    "errors"
    "k8s.io/apimachinery/pkg/labels"
)

func main(){
    kubeconfig := filepath.Join(
        os.Getenv("HOME"), ".kube", "config",
    )
    namespace:="FOO"
    k8sClient, err:= getClient(kubeconfig)
    if err!=nil{
        fmt.Fprintf(os.Stderr, "error: %v\n", err)
        os.Exit(1)
    }

    svc, err:=getServiceForDeployment("APP_NAME", namespace, k8sClient)
    if err!=nil{
        fmt.Fprintf(os.Stderr, "error: %v\n", err)
        os.Exit(2)
    }

    pods, err:=getPodsForSvc(svc, namespace, k8sClient)
    if err!=nil{
        fmt.Fprintf(os.Stderr, "error: %v\n", err)
        os.Exit(2)
    }
    
}

func getClient(configLocation string) (typev1.CoreV1Interface, error){
    kubeconfig := filepath.Clean(configLocation)
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        log.Fatal(err)
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, err
    }
    return clientset.CoreV1(), nil
}

func getServiceForDeployment(deployment string, namespace string, k8sClient typev1.CoreV1Interface) (*corev1.Service, error){
    listOptions := metav1.ListOptions{}
    svcs, err := k8sClient.Services(namespace).List(listOptions)
    if err != nil{
        log.Fatal(err)
    }
    for _, svc:=range svcs.Items{
        if strings.Contains(svc.Name, deployment){
            fmt.Fprintf(os.Stdout, "service name: %v\n", svc.Name)
            return &svc, nil
        }
    }
    return nil, errors.New("cannot find service for deployment")
}

func getPodsForSvc(svc *corev1.Service, namespace string, k8sClient typev1.CoreV1Interface) (*corev1.PodList, error){
    set := labels.Set(svc.Spec.Selector)
    listOptions:= metav1.ListOptions{LabelSelector: set.AsSelector().String()}
    pods, err:=  k8sClient.Pods(namespace).List(listOptions)
    for _,pod:= range pods.Items{
        fmt.Fprintf(os.Stdout, "pod name: %v\n", pod.Name)
    }
    return pods, err
}

关于kubernetes - 如何使用client-gokubernetes的客户端库获取服务下的pods?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41545123/

相关文章:

Kubernetes 动态 Pod 配置

jenkins - Kubernetes 对注解进行更改以强制更新部署

docker - 如何在Kubernetes下使用Fail2ban?

amazon-ec2 - Kubernetes 主节点未就绪状态

apache-spark - 如何使用 Kubernetes 在 spark 集群中调度作业

Kubernetes Ingress 服务无法加载静态文件

redis - Kubernetes集群中如何连接redis-ha集群?

kubernetes - 启用自动缩放后,GKE 不会从 0 缩放到/从 0

kubernetes - Kubernetes 上的 Traefik v2.0 自签名证书

kubernetes - 获取信息 Kubernetes 命名空间