很简单的问题,我如何在当前go代码运行的地方获得Pod?
我需要它是因为出于某种原因,我需要直接对Pod的代码执行ping操作,而不是使用我的常规端点(即负载平衡器)。
我当前的配置:
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
}
问题内容: 我想检查代码是否正在运行,以便可以进行一些配置。 有功能吗?喜欢: runtime.IsBeingTested() 问题答案: 只需指定您在test的中运行测试即可。例如,在pkg.go中: 在pkg_test.go中: 该技术不仅可以与s 一起使用,还可以与任何数据或函数一起使用。如果您的软件包中有一些变量(在您的情况下为配置变量),则可以在中将其覆盖。
我有一个代码如下: 当我尝试运行代码时,我得到这样的消息: 我提到了这个链接,但不明白如何修改上面的代码,使其可行:例外:需要mockito,但没有调用,实际上与这个mock没有任何交互 有人能帮忙吗。 通过添加c.getResult(新的A(新的B()),新的F())解决了上述错误;在上面 我错过了什么?我一直在使用的课程:
我对JavaScript文件中的API(Node.js中运行的npm模块)进行了以下调用,我希望在其中捕获所有错误,以便能够优雅地处理它们。但是,如果(例如)传递了一个错误的API-KEY或一个不存在的城市名称,则该API的内部代码中存在一个错误,该错误未被try/catch捕获: 相反,显示错误并停止执行: JavaScript中是否有一种方法可以像Java和C中那样捕获所有错误?
我使用jsonschema生成器基于我的POJO生成JSON模式文件。目前,我正在通过一个在<code>gradle构建</code>步骤中运行的测试来完成这项工作。这工作正常,但感觉不对,因为我所做的并不是测试任何东西。 我还找到了这个答案,其中详细说明了如何在上运行它,但这也不理想,因为它会在每次应用程序出现时毫无意义地执行它,但在我构建时不会。 因此,有没有一种方法可以告诉gradle(在中
问题内容: 我们有以下课程 和这个 现在,我需要在运行时知道is是否为 。由于这是jpa自动处理的,因此我无法获取此值。 我们正在调用一个带有as参数的方法,我想避免使用它来检查它是什么类型。如果我可以做些类似的事情会更酷 问题答案: 您可以将鉴别符映射为只读属性:
问题内容: 我有一个程序是: 注意:nv0914是bash可执行文件,nv0914.challenge是文本文件。当我在终端中运行任何常规命令时,如果之后使用,请检查退出代码。现在,我想使用一个程序来做同样的事情,但是该程序只是提供输出。请帮帮我! 问题答案: Process.waitFor()返回一个返回退出代码的位置。如果您启动一个不相关的程序,则不会有先前的退出代码,这就是为什么它不返回任何