代码之家  ›  专栏  ›  技术社区  ›  Emixam23

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

  •  0
  • Emixam23  · 技术社区  · 5 年前

    非常简单的问题,我如何才能得到我当前的围棋代码运行的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 ""
    }
    

    但我很难过

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

    而且我找不到一种方法来修复它,也找不到任何关于它的教程。。

    0 回复  |  直到 5 年前
        1
  •  3
  •   Emixam23    5 年前

    过了一会儿,我找到了答案,但完全忘了把它贴在这里!

    请注意,如果你不在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
    }
    
        2
  •  1
  •   Prashant    5 年前

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

    你可以在中找到所有细节 here

        3
  •  0
  •   chartsoo    4 年前
    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
    
        4
  •  -1
  •   Christian Bonhomme    5 年前

    这样做的命令是$kubectl descripe pods 从那里你可以看到你所有豆荚的所有细节。如果您知道需要哪个特定pod的详细信息,只需在命令ex;$kubectl描述豆荚。有关kubectl命令的完整列表,请查看此 link