go - 如何在运行时从 Go 代码获取 pod 外部 IP
问题描述
非常简单的问题,我怎样才能获得运行当前 go 代码的 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 ""
}
但我很遗憾地得到了
恐慌: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
}
推荐阅读
- haskell - 使用量化约束导出 Ord (forall a. Ord a => Ord (fa))
- oracle - PL/SQL ORA-00903: EXECUTE IMMEDIATE 期间表名无效
- java - 模块信息 javadoc:@moduleGraph
- javascript - 如何在for循环中将包含子字符串的值分成单独的数组
- c++ - 将一维数组写入CSV C++中的不同列?
- python - 将 tz naive datetime 转换为 tz 感知从 0 分钟到 58 分钟
- javascript - 向对象数组中的每个对象添加新元素
- javascript - JavaScript如何唯一标识一个网站
- kubernetes - OpenShift 3.11 - 错误 0/23 个节点可用:16 个节点与节点选择器不匹配,7 个节点没有用于请求的 pod 端口的空闲端口
- javascript - Express + Mongoose Rest 可扩展项目