标签: kubernetes-go-client

Kubernetes client-go:watch.Interface vs. cache.NewInformer vs. cache.NewSharedIndexInformer?

我需要我的 Go 应用程序来监控Kubernetes 集群中的一些资源并对它们的变化做出反应。基于大量的文章和例子,我似乎找到了一些方法;然而,我对 Kubernetes 比较陌生,而且它们的描述对我来说太复杂了,以至于我仍然无法理解它们之间的区别——因此,知道使用哪个,所以我不要出现一些意外的行为......具体来说:

  1. watch.Interface.ResultChan()- (通过收购如rest.Request.Watch()) -这似乎已经让我对变化做出反应发生在一个资源,通过提供Added/ Modified/Deleted事件;
  2. cache.NewInformer()— 当我实现 a 时cache.ResourceEventHandler,我可以将它作为最后一个参数传递:

    cache.NewInformer(
            cache.NewListWatchFromClient(clientset.Batch().RESTClient(), "jobs", ...),
            &batchv1.Job{},
            0,
            myHandler)
    
    Run Code Online (Sandbox Code Playgroud)

    -那么,该myHandler对象将接收OnAdd()/ OnUpdate()/OnDelete()电话。

    对我来说,这似乎或多或少相当于ResultChan我在上面的 (1.) 中得到的;一个区别是,显然现在我得到了资源的“之前”状态作为奖励,而ResultChan我只会得到它的“之后”状态。

    此外,IIUC,这实际上是以某种方式建立在watch.Interface上面提到的(通过NewListWatchFromClient)的基础上——所以我想它带来了一些价值,和/或修复了原始watch.Interface?

  3. cache.NewSharedInformer()并且cache.NewSharedIndexInformer()—— (呃,哇,现在这些都是一口……)我试图挖掘 godocs,但我觉得我不懂的术语完全超负荷,以至于我似乎无法掌握微妙之处(?)“常规”之间的差异NewInformerNewSharedInformerNewSharedIndexInformer...

有人可以帮助我理解 …

kubernetes kubernetes-go-client

15
推荐指数
1
解决办法
3467
查看次数

观察 kubernetes pod 状态在 client-go 中完成

我正在 k8 客户端中创建一个 pod,并制作一个手表以在 pod 完成时收到通知,以便我可以读取 pod 的日志。观看界面似乎没有在频道上提供任何事件。这是代码,我将如何收到通知,即 pod 状态现已完成并已准备好读取日志

func readLogs(clientset *kubernetes.Clientset) {
// namespace := "default"
// label := "cithu"
var (
    pod *v1.Pod
    // watchface watch.Interface
    err error
)
// returns a pod after creation

pod, err = createPod(clientset)
fmt.Println(pod.Name, pod.Status, err)

if watchface, err = clientset.CoreV1().Pods(namespace).Watch(metav1.ListOptions{
    LabelSelector: pod.Name,
}); err != nil {
    log.Fatalf(err.Error())
}

// How do I get notified when the pod.Status == completed
}
Run Code Online (Sandbox Code Playgroud)

kubernetes kubernetes-go-client kubernetes-pod

9
推荐指数
1
解决办法
7721
查看次数

运行kubectl exec时禁用Kubernetes上的网络日志

Runnning kubectl exec -it <PODNAME> -- /bin/bash正在打印很多外壳的垃圾:

) Data frame handling
                     I0331 17:46:15.486652    3807 logs.go:41] (0xc4201158c0) Data frame received for 5
                                                                                                       I0331 17:46:15.486671    3807 logs.go:41] (0xc42094a000) (5) Data frame handling
                                                                                                                                                                                       I0331 17:46:15.486682    3807 logs.go:41] (0xc42094a000) (5) Data frame sent
                                                                                                                                                                                                                                                                   root@hello-node-2399519400-6q6s3:/# I0331 17:46:16.667823    3807 logs.go:41] (0xc420687680) (3) Writing data frame
                                                  I0331 17:46:16.669223    3807 logs.go:41] (0xc4201158c0) Data frame received for 5
                                                                                                                                    I0331 17:46:16.669244    3807 logs.go:41] (0xc42094a000) (5) Data frame handling
                                                                                                                                                                                                                    I0331 17:46:16.669254    3807 logs.go:41] (0xc42094a000) (5) Data frame sent

root@hello-node-2399519400-6q6s3:/# I0331 …
Run Code Online (Sandbox Code Playgroud)

bash logging kubernetes kubernetes-go-client

8
推荐指数
2
解决办法
690
查看次数

如何反序列化 Kubernetes YAML 文件

如何将 Kubernetes YAML 文件反序列化为 Go 结构?我查看了kubectl代码,但不知何故我收到每个 YAML 文件的错误:

no kind "Deployment" is registered for version "apps/v1beta1"
Run Code Online (Sandbox Code Playgroud)

这是一个 MWE:

package main

import (
    "fmt"

    "k8s.io/client-go/pkg/api"
)

var service = `
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
`

func main() {
    decode := api.Codecs.UniversalDecoder().Decode
    //decode := api.Codecs.UniversalDeserializer().Decode

    obj, _, err := decode([]byte(service), nil, nil)
    if err != nil {
        panic(err) …
Run Code Online (Sandbox Code Playgroud)

go kubernetes kubernetes-go-client

8
推荐指数
1
解决办法
7882
查看次数

验证Kubernetes配置文件(YAML)

我想实现一个功能 - 使用k8s JSON模式/ Yaml模式验证Kubernetes部署文件(部署yaml或service yaml或rc yaml).

目前我需要设置kubectl和k8s群集才能验证.但是如果没有这个设置,想要使用Go-Client(K8s)api进行验证.

谁能告诉我是否有可用于验证文件的库?我如何获得K8s模式.有没有工具/库来生成模式?你能指出我的方向吗,因为我对kubernetes的东西很新.

有谁知道kubectl如何实现这个?如果可能的话,我想使用类似的库

validation yaml kubernetes kubectl kubernetes-go-client

7
推荐指数
1
解决办法
5669
查看次数

如何使用 go-client 在 kubernetes 中重新启动部署

有没有办法使用 go-client 重新启动 kubernetes 部署。我不知道如何实现这一点,请帮助我!

kubernetes kubernetes-go-client

7
推荐指数
1
解决办法
4278
查看次数

如何使用kubernetes go-client获得与kubectl相同的Pod状态信息

使用kubernetes go-client(k8s.io/client-go/kubernetes),我知道如何获得,pod.Status并且找到了pod.Status.Phase有用的(docs)。例如,我可以使用以下命令输出所有Pod的Pod Status Phase:

    ...
    api := clientset.CoreV1()
    pods, err := api.Pods("").List(metav1.ListOptions{})
    for i, pod := range pods.Items {
        podstatusPhase := string(pod.Status.Phase)
        podCreationTime := pod.GetCreationTimestamp()
        age := time.Since(podCreationTime.Time).Round(time.Second)

        podInfo := fmt.Sprintf("[%d] Pod: %s, Phase: %s , Created: %s, Age: %s", i, pod.GetName(), podstatusPhase, podCreationTime, age.String())
        fmt.Println(podInfo)
    }
Run Code Online (Sandbox Code Playgroud)

然而,phase在一点点简单的,它永远只能显示5个值(PendingRunningSucceededFailedUnknown)。我希望获得与kubectl get pods状态”列中相同的信息,例如:

$ kubectl get pods

NAME                                        READY …
Run Code Online (Sandbox Code Playgroud)

go kubernetes kubernetes-go-client

6
推荐指数
2
解决办法
216
查看次数

用“/”字符修补 kubernetes 标签

我有以下运行良好的代码。example: yes它在 kubernetes 对象中添加标签:

package main

import (
    "fmt"
    "encoding/json"
    "k8s.io/apimachinery/pkg/types"

    eksauth "github.com/chankh/eksutil/pkg/auth"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type patchStringValue struct {
    Op    string `json:"op"`
    Path  string `json:"path"`
    Value string `json:"value"`
}

func main() {
    var updateErr error

    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{})

    for i, pod := range pods.Items {

        payload := []patchStringValue{{
            Op:    "replace",
            Path: …
Run Code Online (Sandbox Code Playgroud)

label patch go kubernetes kubernetes-go-client

6
推荐指数
1
解决办法
1791
查看次数

client-go:将 kubernetes json 文件解析为 k8s 结构

我想解析 kubernetes 清单文件(json/yaml)并能够将它们转换为 k8s 结构(稍后操作它们)

我知道有 NewYAMLOrJSONDecoder().Decode() 函数(https://github.com/kubernetes/apimachinery/blob/master/pkg/util/yaml/decoder.go)来读取 json/yaml 文件,但是下一步是:如何将它们转换为 k8s 结构/类型?

即,如果我读取带有 Namespace 对象的 yaml 文件,例如如何将其转换为 core/v1/namespace 接口

问候,

api client go kubernetes kubernetes-go-client

5
推荐指数
1
解决办法
9600
查看次数

以编程方式获取 Pod DNS 名称

我有一个有 3 名成员的状态集。可以通过以下方式从集群内部访问它们:

podname-{0..n}.service.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

我正在使用控制器中的 Kubernetes API。我刚刚创建了 Statefulset:

podname-{0..n}.service.default.svc.cluster.local
Run Code Online (Sandbox Code Playgroud)

假设一切正常,几分钟后我就有了 3 个正在运行的 Pod。如何获取新创建的 Pod 的 Pod DNS 条目?

我知道我可以使用以下方法构建 DNS:

fmt.Sprintf("%s-%d.%s.%s.svc.cluster.local", s.Name, idx, service, S.Namespace)
Run Code Online (Sandbox Code Playgroud)

但我发现一些问题:

  1. 我必须根据副本数量计算索引
  2. 我需要知道用于此目的的服务名称StatefulSet
  3. 我假设集群域是cluster.local这不一定是真的

我认为它应该存在(但我不确定它是否真的存在),是一个 API,给定 StatefulSet 将允许我知道所创建的副本的 DNS 名称。有这样的API吗?

kubernetes kubernetes-go-client

5
推荐指数
1
解决办法
4628
查看次数