亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在運行時從 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 關注
  • 390 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號