谁能告诉我如何使用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/