我正在尝试使用 prometheus 客户端库在 golang 中获取一些自定义应用程序指标,以显示在 Prometheus 中。
我有以下工作:
我有一个 go 应用程序,它在 localhost:8080/metrics 上公开指标,如本文所述:
https://godoc.org/github.com/prometheus/client_golang/prometheus
我有一个 kubernates minikube 正在运行,它使用本文中的操作符运行 Prometheus、Grafana 和 AlertManager:
https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus
我为我的 go 应用程序创建了一个 docker 映像,当我运行它并转到 localhost:8080/metrics 时,我可以看到浏览器中显示的 prometheus 指标。
我使用以下 pod.yaml 将我的 docker 映像部署到 k8s 中的 pod
Run Code Online (Sandbox Code Playgroud)apiVersion: v1 kind: Pod metadata: name: my-app-pod labels: zone: prod version: v1 annotations: prometheus.io/scrape: 'true' prometheus.io/port: '8080' spec: containers: - name: my-container image: name/my-app:latest imagePullPolicy: IfNotPresent ports: - containerPort: 8080
kubectl exec -it my-app-pod -- /bin/bash
然后在“localhost:8080/metrics”上执行 wget,我可以看到我的指标
到目前为止一切顺利,这是我撞墙的地方。我可以让多个 …
go kubernetes prometheus kubernetes-go-client prometheus-operator
我可以想到的一种方法是设置一个环境,该环境在定义Pod时应使用Pod的命名空间。
动态获取名称空间而不需要更改Pod会更好,因为它减轻了构造Pod的负担。
那么有没有办法在Pod中获取当前的名称空间?
在kubernetes客户去API(或其他图书馆使用它),是有一个实用功能的转换k8s.io/apimachinery/pkg/apis/meta/v1/LabelSelector为字符串,以填补该领域LabelSelector的k8s.io/apimachinery/pkg/apis/meta/v1/ListOptions?
我client-go挖掘了代码,但我找不到这样的功能。
的LabelSelector.Marshall()也不LabelSelector.String()给我说(毫不奇怪,因为这不是他们的目的,但我想也无妨)。
我有类似的规范描述k8s.io/api/extensions/v1beta1/Deployment,并想使用它的一组选择器标签(即Selector字段)来查询它的 pod 使用
options := metav1.ListOptions{
LabelSelector: <stringified labels>,
}
podList, err := clientset.CoreV1().Pods(<namespace>).List(options)
Run Code Online (Sandbox Code Playgroud) 我想使用 Kubernetes Go 客户端在集群中执行各种操作。我正在加载kubeconfig包含多个集群和上下文的本地。默认上下文是prod,我要覆盖的配置值之一是CurrentContext
clientConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
&clientcmd.ClientConfigLoadingRules{ExplicitPath: "/Users/me/.kube/config"},
&clientcmd.ConfigOverrides{
CurrentContext: "stage",
})
rawConfig, _ := clientConfig.RawConfig()
log.Printf(rawConfig.CurrentContext) // outputs "prod" instead of "stage"
Run Code Online (Sandbox Code Playgroud)
当我检查 RawConfig()当前上下文时,仍然是“prod”而不是“stage”。为什么配置覆盖不起作用?
AuthInfo 等的覆盖如何工作?覆盖只接受一个,AuthInfo而配置包含一个映射AuthInfo。
GitHub 相关问题https://github.com/kubernetes/client-go/issues/735
我的 CRD 很少,但我不确定如何查询 kube-apiserver 以获取 CR 列表。任何人都可以提供任何示例代码吗?
go kubernetes kubernetes-go-client kubernetes-custom-resources kubernetes-apiserver
我们有以下类型,它是通用资源列表,该结构有 4 个通用参数(全部与对象列表指针类型相关),但我找不到减少它的方法。
import(
...
"sigs.k8s.io/controller-runtime/pkg/client"
)
type GenResourceLister[OBJ any, OBJPTR interface {
client.Object
*OBJ
}, LIST interface {
GetItems() []OBJ
}, LISTPTR interface {
client.ObjectList
*LIST
}] struct{}
Run Code Online (Sandbox Code Playgroud)
以下函数有 2 个泛型参数,其中一个是切片参数的元素类型,但我认为另一个(其指针类型)会阻止类型推断,因此必须在每次调用时指定参数。我找不到摆脱它们的方法。
// itemsToObjectList converts a list of objects whose pointer
// type implements client.Object to a list of client.Object
func itemsToObjectList[T any, TPTR interface {
client.Object
*T
}](items []T) []client.Object {
objs := make([]client.Object, 0, len(items))
for _, resource := range items {
resource := resource …Run Code Online (Sandbox Code Playgroud) Spec: v1.PodSpec{
Containers: []v1.Container{
v1.Container{
Name: podName,
Image: deploymentName,
ImagePullPolicy: "IfNotPresent",
Ports: []v1.ContainerPort{},
Env: []v1.EnvVar{
v1.EnvVar{
Name: "RASA_NLU_CONFIG",
Value: os.Getenv("RASA_NLU_CONFIG"),
},
v1.EnvVar{
Name: "RASA_NLU_DATA",
Value: os.Getenv("RASA_NLU_DATA"),
},
},
Resources: v1.ResourceRequirements{},
},
},
RestartPolicy: v1.RestartPolicyOnFailure,
},
Run Code Online (Sandbox Code Playgroud)
我想提供相应的资源限制,例如:
Run Code Online (Sandbox Code Playgroud)resources: limits: cpu: "1" requests: cpu: "0.5" args: - -cpus - "2"
我该怎么做。我尝试添加Limits及其映射键值对,但这似乎是一个嵌套的结构。关于如何在kube client go中提供资源似乎没有任何示例。
我有一个演示 golang 程序来列出没有特定标签的 Pod。我想修改它,以便它还可以为每个 pod 添加标签。
(我使用的是 AWS 托管的 Kubernetes 服务 EKS,因此有一些特定于 EKS 的样板代码)
package main
import (
"fmt"
eksauth "github.com/chankh/eksutil/pkg/auth"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func main() {
cfg := &eksauth.ClusterConfig{ClusterName: "my_cluster_name"}
clientset, _ := eksauth.NewAuthClient(cfg)
api := clientset.CoreV1()
// Get all pods from all namespaces without the "sent_alert_emailed" label.
pods, _ := api.Pods("").List(metav1.ListOptions{LabelSelector: "!sent_alert_emailed"})
for i, pod := range pods.Items {
fmt.Println(fmt.Sprintf("[%2d] %s, Phase: %s, Created: %s, HostIP: %s", i, pod.GetName(), string(pod.Status.Phase), pod.GetCreationTimestamp(), string(pod.Status.HostIP)))
// Here I want to add …Run Code Online (Sandbox Code Playgroud) 我正在尝试连接到托管在 上的本地 Kubernetes 集群minikube,这是相同的代码,现在当我这样做时go run minikube.go,它给了我一个错误说:
../../../pkg/mod/k8s.io/client-go@v11.0.0+incompatible/kubernetes/scheme/register.go:26:2: module k8s.io/api@latest found (v0.19.0), but does not contain package k8s.io/api/auditregistration/v1alpha1`.
Run Code Online (Sandbox Code Playgroud)
现在,我尝试使用手动安装该软件包,go get然后我发现该软件包不存在。我怎样才能让它工作并解决这个问题?我的go.mod 文件,以防有人想看。
经过一番搜索后,我无法找到使用任何策略在 Patch 上执行的 golang Kube 客户端示例……我正在寻找执行此操作的 golang 示例:
kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'
Run Code Online (Sandbox Code Playgroud)
我正在使用https://github.com/kubernetes/client-go v2.0.0
谁能给我举个例子?谢谢。
kubernetes ×8
go ×7
generics ×1
go-modules ×1
go-packages ×1
kubernetes-custom-resources ×1
polymorphism ×1
prometheus ×1