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

如何在运行时从Go代码获取pod外部IP,go,google-cloud-platform,google-kubernetes-engine,kubernetes-pod,Go,Google Cloud Platform,Google Kubernetes Engine,Kubernetes Pod,非常简单的问题,我如何才能得到我当前的go代码运行的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: 8

非常简单的问题,我如何才能得到我当前的go代码运行的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())
    }
    b, _ := json.Marshal(pods)
    log.Println(string(b))

    for _, pod := range pods.Items {
        log.Println(pod.Name, pod.Status)
        pod, err := clientset.CoreV1().Pods("default").Get(pod.Name, metav1.GetOptions{})
        if err != nil {
            panic(err.Error())
        }
        log.Println(pod.Status)
    }
    log.Println("checked pods")

    return ""
}
但我很难过

恐慌:pods被禁止:用户“系统:服务帐户:默认值:默认值”无法在命名空间“默认值”中列出API组“”中的资源“pods”


我找不到修复它的方法,也找不到关于它的任何教程。

执行此操作的命令是$kubectl descripe pods
从那里你将能够看到所有吊舱的所有细节。如果您知道需要详细信息的具体pod,只需在命令ex;$kubectl描述豆荚。有关kubectl命令的完整列表,请查看此

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


你可以在

中找到所有详细信息。过了一会儿,我找到了答案,但完全忘了把它贴在这里

请注意,如果您不在Kubernetes环境中,它将崩溃


我认为你的应用程序“GetContainerIP”没有进行此呼叫的访问权限。只有默认命名空间中的kubectl具有该权限。我建议创建一个服务帐户,提供进行API调用以获取pods的角色,并使用应用程序中的服务帐户进行调用,这是RBAC问题。我尝试了您的解决方案,但在构建时我仍然卡住了<代码>错误:构建步骤3“gcr.io/cloud builders/kubectl”失败:退出状态1
错误完成步骤3
步骤3:服务器错误(禁止):创建“grpc服务.yaml”时出错:clusterrolebindings.rbac.authorization.k8s.io被禁止:用户xxxxxxxxx@cloudbuild.gserviceaccount.com“无法创建资源集群作用域中API组“rbac.authorization.k8s.io”中的“clusterrolebindings”:必需的“container.clusterrolebindings.create”权限。
我终于拥有了每个pod的IP,但我如何知道哪个是我的?
ods,err:=clientset.CoreV1().pods(“默认”).List(metav1.ListOptions{})
where
clientset:=kubernetes.NewForConfig(config)
一旦它已经从GKE运行,是的,但我希望它是自动的,我需要在开始时使用我的IP地址(从main()函数)很抱歉,我没有理解你。但这不是一个不同的问题吗?事实上,你的回答让我向前迈进了一步,非常感谢,但正如问题所提到的,我想在运行时获取我的主机IP地址(pod IP)。如果我有3个相同服务的pod,每个pod都可以“打印”自己的pod IPSo,你可以从go main()运行一个shell命令function?@Christian Bonhome我想OP是想在go可执行文件中(即在运行时)查找此pod信息。您也不需要费力(且不安全)的操作将
kubectl
凭证传递给pod的任务-这不是最佳做法。请您提供一些额外的信息,您的答案应该如何解决问题?
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
}
pod, err := clientset.CoreV1().Pods("default").Get(context.TODO(), os.Getenv("HOSTNAME"), metav1.GetOptions{})

podName := pod.Name
podIP := pod.Status.PodIP
node := pod.Spec.NodeName