我需要我的 Go 应用程序来监控Kubernetes 集群中的一些资源并对它们的变化做出反应。基于大量的文章和例子,我似乎找到了一些方法;然而,我对 Kubernetes 比较陌生,而且它们的描述对我来说太复杂了,以至于我仍然无法理解它们之间的区别——因此,知道使用哪个,所以我不要出现一些意外的行为......具体来说:
watch.Interface.ResultChan()- (通过收购如rest.Request.Watch()) -这似乎已经让我对变化做出反应发生在一个资源,通过提供Added/ Modified/Deleted事件;cache.NewInformer()— 当我实现 a 时cache.ResourceEventHandler,我可以将它作为最后一个参数传递:
cache.NewInformer(
        cache.NewListWatchFromClient(clientset.Batch().RESTClient(), "jobs", ...),
        &batchv1.Job{},
        0,
        myHandler)
-那么,该myHandler对象将接收OnAdd()/ OnUpdate()/OnDelete()电话。
对我来说,这似乎或多或少相当于ResultChan我在上面的 (1.) 中得到的;一个区别是,显然现在我得到了资源的“之前”状态作为奖励,而ResultChan我只会得到它的“之后”状态。
此外,IIUC,这实际上是以某种方式建立在watch.Interface上面提到的(通过NewListWatchFromClient)的基础上——所以我想它带来了一些价值,和/或修复了原始watch.Interface?
cache.NewSharedInformer()并且cache.NewSharedIndexInformer()—— (呃,哇,现在这些都是一口……)我试图挖掘 godocs,但我觉得我不懂的术语完全超负荷,以至于我似乎无法掌握微妙之处(?)“常规”之间的差异NewInformer与NewSharedInformer对NewSharedIndexInformer...有人可以帮助我理解 …
我正在 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
}
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 …如何将 Kubernetes YAML 文件反序列化为 Go 结构?我查看了kubectl代码,但不知何故我收到每个 YAML 文件的错误:
no kind "Deployment" is registered for version "apps/v1beta1"
这是一个 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) …我想实现一个功能 - 使用k8s JSON模式/ Yaml模式验证Kubernetes部署文件(部署yaml或service yaml或rc yaml).
目前我需要设置kubectl和k8s群集才能验证.但是如果没有这个设置,想要使用Go-Client(K8s)api进行验证.
谁能告诉我是否有可用于验证文件的库?我如何获得K8s模式.有没有工具/库来生成模式?你能指出我的方向吗,因为我对kubernetes的东西很新.
有谁知道kubectl如何实现这个?如果可能的话,我想使用类似的库
有没有办法使用 go-client 重新启动 kubernetes 部署。我不知道如何实现这一点,请帮助我!
使用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)
    }
然而,phase在一点点简单的,它永远只能显示5个值(Pending,Running,Succeeded,Failed,Unknown)。我希望获得与kubectl get pods“ 状态”列中相同的信息,例如:
$ kubectl get pods
NAME                                        READY …我有以下运行良好的代码。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: …我想解析 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 接口
问候,
我有一个有 3 名成员的状态集。可以通过以下方式从集群内部访问它们:
podname-{0..n}.service.default.svc.cluster.local
我正在使用控制器中的 Kubernetes API。我刚刚创建了 Statefulset:
podname-{0..n}.service.default.svc.cluster.local
假设一切正常,几分钟后我就有了 3 个正在运行的 Pod。如何获取新创建的 Pod 的 Pod DNS 条目?
我知道我可以使用以下方法构建 DNS:
fmt.Sprintf("%s-%d.%s.%s.svc.cluster.local", s.Name, idx, service, S.Namespace)
但我发现一些问题:
StatefulSetcluster.local这不一定是真的我认为它应该存在(但我不确定它是否真的存在),是一个 API,给定 StatefulSet 将允许我知道所创建的副本的 DNS 名称。有这样的API吗?