kubernetes 如何 使用 go-client 访问 k8s 中 的 pod

nxowjjhe  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(2)|浏览(207)

我正在使用go-client来访问我的环境中的k8s资源。有API来获取/列出pod、命名空间等。
如何访问当前正在运行的Pod?

wb1gzix0

wb1gzix01#

您 可以 使用 窗格 字段 Expose Pod Information to Containers Through Environment Variables

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      ...
      ...
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: MY_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName
  restartPolicy: Never

中 的 每 一 个
然后 在 Go 语言 代码 中 查找 这些 env 变量 :

log.Printf("MY_POD_NAME: %q", os.Getenv("MY_POD_NAME"))

格式

pzfprimi

pzfprimi2#

Kubernetes client-go提供了用于访问Pod的API,CoreV 1包提供了用于获取所有Pod的API。请参阅文档https://pkg.go.dev/k8s.io/client-go/kubernetes/typed/core/v1#CoreV1Client.Pods
您可以通过名称空间、标签或查询轻松地过滤或获取Pod,
请参阅获取Namespace中所有窗格的示例代码。

config, err := clientcmd.BuildConfigFromFlags("", "PATH to cluster config yaml")
  clientset, err := kubernetes.NewForConfig(config)
  if err != nil {
     panic(err.Error())
  }
  // Get all pods in namespace
  pods, err := clientset.CoreV1().Pods("NANESPACE").List(context.TODO(), 
  metav1.ListOptions{})
  if err != nil {
          panic(err.Error())
  }

请参阅使用标签获取pod的示例代码:

labal := fmt.Sprintf("LABLE-NAME=%s", "SOME LABEL VALUE")
    ap1 := sm.clientset.CoreV1()
    pods, _ := ap1.Pods(namespace).List(context.Background(), 
         metav1.ListOptions{LabelSelector: labal})
    pods_num := len(pods.Items)
    fmt.Printf("Found the following number of Pods: %d\n", pods_num)
    for i, pod := range pods.Items {
        fmt.Printf("[%2d] %s, Phase: %s, Created: %s, HostIP: %s\n", i, 
              pod.GetName(), string(pod.Status.Phase), 
              pod.GetCreationTimestamp(), 
              string(pod.Status.HostIP))
     }

相关问题