当前位置: 首页 > 面试题库 >

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

孟杰
2023-03-14
问题内容

很简单的问题,我如何在当前go代码运行的地方获得Pod?

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

我当前的配置:

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”

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


问题答案:

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

请注意,如果您不在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
}


 类似资料:
  • 问题内容: 我想检查代码是否正在运行,以便可以进行一些配置。 有功能吗?喜欢: runtime.IsBeingTested() 问题答案: 只需指定您在test的中运行测试即可。例如,在pkg.go中: 在pkg_test.go中: 该技术不仅可以与s 一起使用,还可以与任何数据或函数一起使用。如果您的软件包中有一些变量(在您的情况下为配置变量),则可以在中将其覆盖。

  • 我有一个代码如下: 当我尝试运行代码时,我得到这样的消息: 我提到了这个链接,但不明白如何修改上面的代码,使其可行:例外:需要mockito,但没有调用,实际上与这个mock没有任何交互 有人能帮忙吗。 通过添加c.getResult(新的A(新的B()),新的F())解决了上述错误;在上面 我错过了什么?我一直在使用的课程:

  • 我对JavaScript文件中的API(Node.js中运行的npm模块)进行了以下调用,我希望在其中捕获所有错误,以便能够优雅地处理它们。但是,如果(例如)传递了一个错误的API-KEY或一个不存在的城市名称,则该API的内部代码中存在一个错误,该错误未被try/catch捕获: 相反,显示错误并停止执行: JavaScript中是否有一种方法可以像Java和C中那样捕获所有错误?

  • 问题内容: 我们有以下课程 和这个 现在,我需要在运行时知道is是否为 。由于这是jpa自动处理的,因此我无法获取此值。 我们正在调用一个带有as参数的方法,我想避免使用它来检查它是什么类型。如果我可以做些类似的事情会更酷 问题答案: 您可以将鉴别符映射为只读属性:

  • 我使用jsonschema生成器基于我的POJO生成JSON模式文件。目前,我正在通过一个在<code>gradle构建</code>步骤中运行的测试来完成这项工作。这工作正常,但感觉不对,因为我所做的并不是测试任何东西。 我还找到了这个答案,其中详细说明了如何在上运行它,但这也不理想,因为它会在每次应用程序出现时毫无意义地执行它,但在我构建时不会。 因此,有没有一种方法可以告诉gradle(在中

  • 问题内容: 我有一个程序是: 注意:nv0914是bash可执行文件,nv0914.challenge是文本文件。当我在终端中运行任何常规命令时,如果之后使用,请检查退出代码。现在,我想使用一个程序来做同样的事情,但是该程序只是提供输出。请帮帮我! 问题答案: Process.waitFor()返回一个返回退出代码的位置。如果您启动一个不相关的程序,则不会有先前的退出代码,这就是为什么它不返回任何