猿问

如何在运行时从 Go 代码获取 pod 外部 IP

很简单的问题,如何获取当前运行代码的 Pod?


我需要它,因为出于某种原因,我需要直接 ping Pod 的代码,而不是使用我的常规端点(即负载均衡器)。


我当前的配置:


apiVersion: v1

kind: Service

metadata:

  name: web-socket-service-api

spec:

  ports:

    # Port that accepts gRPC and JSON/HTTP2 requests over HTTP.

    - port: 8080

      targetPort: 8080

      protocol: TCP

      name: grpc

    # Port that accepts gRPC and JSON/HTTP2 requests over HTTP.

    - port: 8081

      targetPort: 8081

      protocol: TCP

      name: rest

    # Port that accepts WebSockets.

    - port: 8082

      targetPort: 8082

      protocol: TCP

      name: websocket

  selector:

    app: web-socket-service-api

  type: LoadBalancer

---

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: web-socket-service-api

spec:

  replicas: 3

  template:

    metadata:

      labels:

        app: web-socket-service-api

    spec:

      containers:

        - name: web-socket-service-api

          image: gcr.io/[PROJECT]/web-socket-service-api:latest

          ports:

            - containerPort: 8080

            - containerPort: 8081

            - containerPort: 8082

我试过


/*

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

    "k8s.io/client-go/kubernetes"

    "k8s.io/client-go/rest"

*/


func GetContainerIP() string {


    // creates the in-cluster config

    config, err := rest.InClusterConfig()

    if err != nil {

        panic(err.Error())

    }

    // creates the clientset

    clientset, err := kubernetes.NewForConfig(config)

    if err != nil {

        panic(err.Error())

    }


    log.Println("checking pods")

    pods, err := clientset.CoreV1().Pods("default").List(metav1.ListOptions{})

    if err != nil {

        panic(err.Error())

    }


但我悲伤地得到了


恐慌:pods 被禁止:用户“system:serviceaccount:default:default”无法在命名空间“default”中的 API 组“”中列出资源“pods”


而且我找不到修复它的方法或任何有关它的教程..


精慕HU
浏览 279回答 4
4回答

跃然一笑

过了一会儿我找到了答案,但完全忘记将其发布在这里!请注意,如果你不在 Kubernetes 环境中,它会崩溃import (    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"    "k8s.io/client-go/kubernetes"    "k8s.io/client-go/rest"    "os"    "os/signal"    "time")//// Pod infos//func GetPodDetails() (IP string, name string) {    // creates the in-cluster config    config, err := rest.InClusterConfig()    if err != nil {        panic(err.Error())    }    // creates the clientset    clientset, err := kubernetes.NewForConfig(config)    if err != nil {        panic(err.Error())    }    IP = ""    for {        if IP != "" {            break        } else {            log.Printf("No IP for now.\n")        }        pods, err := clientset.CoreV1().Pods("default").List(metav1.ListOptions{})        if err != nil {            panic(err.Error())        }        for _, pod := range pods.Items {            pod, _ := clientset.CoreV1().Pods("default").Get(pod.Name, metav1.GetOptions{})            if pod.Name == os.Getenv("HOSTNAME") {                IP = pod.Status.PodIP            }        }        log.Printf("Waits...\n")        time.Sleep(1 * time.Second)    }    name = os.Getenv("HOSTNAME")    log.Printf("Trying os.Getenv(\"HOSTNAME/IP\"): [%s][%s]\n", name, IP)    return IP, name}

慕容3067478

为了使应用程序能够对 kubernetes 资源进行 API 调用,应用程序需要必要的 RBAC 权限。最佳实践是创建“pods”的“只读”角色并将其与新的服务帐户绑定。

慕工程0101907

pod, err := clientset.CoreV1().Pods("default").Get(context.TODO(), os.Getenv("HOSTNAME"), metav1.GetOptions{})podName := pod.NamepodIP := pod.Status.PodIPnode := pod.Spec.NodeName

倚天杖

执行此操作的命令是 $ kubectl describe pods 从那里您将能够看到所有 pod 的所有详细信息。如果您知道需要详细信息的特定 pod,只需在命令 ex 末尾添加标签名称即可;$ kubectl 描述 pod 。
随时随地看视频慕课网APP

相关分类

Go
我要回答