为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
精慕HU 2023-08-07 15:16:06
很简单的问题,如何获取当前运行代码的 Pod?我需要它,因为出于某种原因,我需要直接 ping Pod 的代码,而不是使用我的常规端点(即负载均衡器)。我当前的配置:apiVersion: v1kind: Servicemetadata:  name: web-socket-service-apispec:  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/v1beta1kind: Deploymentmetadata:  name: web-socket-service-apispec:  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”而且我找不到修复它的方法或任何有关它的教程..
查看完整描述

4 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

过了一会儿我找到了答案,但完全忘记将其发布在这里!


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

}



查看完整回答
反对 回复 2023-08-07
?
慕容3067478

TA贡献1773条经验 获得超3个赞

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

查看完整回答
反对 回复 2023-08-07
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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


查看完整回答
反对 回复 2023-08-07
?
倚天杖

TA贡献1828条经验 获得超3个赞

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


查看完整回答
反对 回复 2023-08-07
  • 4 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信