如何在运行时从Go代码获取Pod外部IP [英] How can I get pod external IP from Go code at runtime

查看:485
本文介绍了如何在运行时从Go代码获取Pod外部IP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个非常简单的问题,如何在当前go代码运行的地方找到Pod?

Pretty simple question, how can I get the Pod where my current go code is running?

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

I need it because for some reason, I need to ping directly the Pod's code instead of using my regular endpoint which would be the load balancer.

我当前的配置:

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:用户"system:serviceaccount:default:default"无法在名称空间"default"中的API组"中列出资源"pods"

panic: pods is forbidden: User "system:serviceaccount:default:default" cannot list resource "pods" in API group "" in the namespace "default"

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

And I couldn't find a way to fix it or any tutorial about it..

推荐答案

片刻之后我找到了答案,但完全忘记了将其发布在这里!

I found the answer after a moment, but totally forgot to post it over here!

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

Please note that it will crash if you ain't in a Kubernetes env

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
}

这篇关于如何在运行时从Go代码获取Pod外部IP的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆