如何在运行时从Go代码获取pod外部IP
非常简单的问题,我如何才能得到我当前的go代码运行的Pod 我需要它,因为出于某种原因,我需要直接ping Pod的代码,而不是使用我的常规端点,即负载平衡器 我的当前配置:如何在运行时从Go代码获取pod外部IP,go,google-cloud-platform,google-kubernetes-engine,kubernetes-pod,Go,Google Cloud Platform,Google Kubernetes Engine,Kubernetes Pod,非常简单的问题,我如何才能得到我当前的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: 8
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被禁止:用户“系统:服务帐户:默认值:默认值”无法在命名空间“默认值”中列出API组“”中的资源“pods”
我找不到修复它的方法,也找不到关于它的任何教程。执行此操作的命令是$kubectl descripe pods
从那里你将能够看到所有吊舱的所有细节。如果您知道需要详细信息的具体pod,只需在命令ex;$kubectl描述豆荚。有关kubectl命令的完整列表,请查看此要使应用程序能够对kubernetes资源进行API调用,该应用程序需要必要的RBAC权限。最佳实践是创建“pods”的“只读”角色,并将其与新的服务帐户绑定
你可以在中找到所有详细信息。过了一会儿,我找到了答案,但完全忘了把它贴在这里 请注意,如果您不在Kubernetes环境中,它将崩溃
我认为你的应用程序“GetContainerIP”没有进行此呼叫的访问权限。只有默认命名空间中的kubectl具有该权限。我建议创建一个服务帐户,提供进行API调用以获取pods的角色,并使用应用程序中的服务帐户进行调用,这是RBAC问题。我尝试了您的解决方案,但在构建时我仍然卡住了<代码>错误:构建步骤3“gcr.io/cloud builders/kubectl”失败:退出状态1
错误完成步骤3
步骤3:服务器错误(禁止):创建“grpc服务.yaml”时出错:clusterrolebindings.rbac.authorization.k8s.io被禁止:用户xxxxxxxxx@cloudbuild.gserviceaccount.com“无法创建资源集群作用域中API组“rbac.authorization.k8s.io”中的“clusterrolebindings”:必需的“container.clusterrolebindings.create”权限。
我终于拥有了每个pod的IP,但我如何知道哪个是我的?ods,err:=clientset.CoreV1().pods(“默认”).List(metav1.ListOptions{})
whereclientset:=kubernetes.NewForConfig(config)
一旦它已经从GKE运行,是的,但我希望它是自动的,我需要在开始时使用我的IP地址(从main()函数)很抱歉,我没有理解你。但这不是一个不同的问题吗?事实上,你的回答让我向前迈进了一步,非常感谢,但正如问题所提到的,我想在运行时获取我的主机IP地址(pod IP)。如果我有3个相同服务的pod,每个pod都可以“打印”自己的pod IPSo,你可以从go main()运行一个shell命令function?@Christian Bonhome我想OP是想在go可执行文件中(即在运行时)查找此pod信息。您也不需要费力(且不安全)的操作将kubectl
凭证传递给pod的任务-这不是最佳做法。请您提供一些额外的信息,您的答案应该如何解决问题?
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
}
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