标签: client-go

在单个 YAML 文件中使用多个类型直接针对 Kubernetes API 使用 client-go to `kubectl apply`

我正在使用https://github.com/kubernetes/client-go并且一切正常。

我有官方 Kubernetes 仪表板的清单 (YAML):https ://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml

我想kubectl apply在 Go 代码中使用 client-go模仿这个清单。

我知道我需要将 YAML 字节进行一些(取消)编组到包中定义的正确 API 类型中:https : //github.com/kubernetes/api

我已经成功地将Create单个 API 类型添加到我的集群中,但是对于包含不同类型列表的清单,我该如何执行此操作?是否有kind: List*支持这些不同类型的资源?

我目前的解决方法是使用csplitwith --- 作为分隔符拆分 YAML 文件

csplit /path/to/recommended.yaml /---/ '{*}' --prefix='dashboard.' --suffix-format='%03d.yaml'
Run Code Online (Sandbox Code Playgroud)

接下来,我遍历创建的新 (14) 部分,读取它们的字节,打开 UniversalDeserializer 的解码器返回的对象类型,并使用我的 k8s 客户端集调用正确的 API 方法。

我想以编程方式执行此操作,以便将仪表板的任何新版本更新到我的集群中。我还需要为 Metrics Server 和许多其他资源执行此操作。另一种(可能更简单)方法是将我的代码与安装了 kubectl 的容器镜像一起发送并直接调用kubectl apply -f -; 但这意味着我还需要将 kube 配置写入磁盘,或者将其内联传递,以便 kubectl 可以使用它。

我发现这个问题很有帮助:https : //github.com/kubernetes/client-go/issues/193 解码器住在这里:https : //github.com/kubernetes/apimachinery/tree/master/pkg/runtime/序列化器 …

go kubernetes kubernetes-apiserver client-go

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

如何在golang程序中使用client-go列出k8s集群中的所有pod?

我想在 go 程序中使用 client-go 列出 k8s 集群中的所有 pod。一个使用 client-go 列出 k8s 集群中所有 pod 的 go 程序?

go kubernetes client-go

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

如何使用client-go向Kubernetes API提交通用"runtime.Object"

我正在使用AWS'EKS,这是Kubernetes v1.10,我正在使用client-go v7.0.0.

我要做的是解析文件中包含多个Kubernetes资源定义的.yml文件,并将这些资源提交给Kubernetes API.我可以使用此代码成功解析文件scheme.Codecs.UniversalDeserializer().Decode,然后返回一个数组runtime.Object.

我知道所有Kubernetes资源都符合runtime.Object接口,但我找不到将通用接口提交给API的方法.我见过的大多数方法都使用了Deployment,Pod等具体类型的方法.

我已经看到了像这样的通用RESTClient的一些代码clientset.RESTClient().Put().Body(obj).Do(),但这不起作用,我无法弄明白.

我知道我的客户端配置正确,因为我可以成功列出所有Pod.

kubernetes kubernetes-apiserver client-go

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

使用 k8s.io/client-go 库更改 kubernetes 部署时获得通知的最佳方式是什么?

语境

我正在编写一个脚本,该脚本使用k8s.io/client-go库(此处godocs)来操作部署。特别是,我想为集群中的每个部署添加一个标签选择器。部署标签选择器是不可变的。所以我的做法是:

  1. 创建每个部署的副本,唯一的区别是名称后缀为“-temp”。这是为了最大限度地减少现有部署的停机时间。
  2. 删除原始部署。
  3. 重新创建原始部署,唯一的区别是额外的标签选择器。
  4. 删除临时部署。

我不能只使用 client-go 库按顺序执行步骤 1-4,因为我只想在 API 服务器认为上一步完成时进入下一步。例如,我不想执行第 3 步,直到 API 服务器说原始部署已被删除。否则,我将收到具有相同名称的 Deployment 已存在的错误。

使用 client-go 库检测何时创建和删除部署并附加回调函数的最佳方法是什么?我遇到了以下软件包。

但我不确定它们之间有什么区别以及使用哪一个。

在这里阅读了watchInformer 的例子。这是两个 相关的SO 问题。

更新

似乎watch提供了一种较低级别的方法来监视资源的更改并接收有关更改的事件。似乎使用SharedInformerFactory创建 SharedInformer 是要走的路。

到目前为止我有

import (
    "encoding/json"
    "errors"
    "flag"
    "fmt"
    "io/ioutil"
    "k8s.io/api/apps/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/informers"
    "k8s.io/client-go/kubernetes"
    typedv1 "k8s.io/client-go/kubernetes/typed/apps/v1"
    "k8s.io/client-go/tools/cache"
    "path/filepath"
    "strings"

    // We need this import to load the …
Run Code Online (Sandbox Code Playgroud)

go kubernetes client-go

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

如何通过 client-go 删除 k8s Job 及其 pod?

我尝试通过client-go使用 LabelSelector 删除我的作业:

cli.BatchV1().Jobs("default").Delete(context.TODO(), name, metav1.DeleteOptions{})
Run Code Online (Sandbox Code Playgroud)

作业已成功删除,但其 pod 却没有删除!

如果我通过 删除这个作业kubectl,它创建的 pod 也会被自动删除。

我如何简单地删除带有 pod 的作业client-go

go kubernetes client-go

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

Kubernetes client-go 创建服务和端点

我正在寻找有关如何使用 client-go API 创建/更新服务和端点的指针。似乎无法找到有关如何执行此操作的任何示例或文档。

谢谢!萨蒂什

kubernetes client-go

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

使用 client-go 模拟“kubectl wait”以等待 Pod 准备就绪

在 bash 脚本中,我通常使用“kubectl wait”来阻止,直到某个 pod 资源准备就绪,例如类似于以下内容:

kubectl wait --for=condition=Ready --timeout=2m -n mynamespace pod -l myselector
Run Code Online (Sandbox Code Playgroud)

这很有效,因为很多时候我不知道需要等待的 pod 的确切名称,而“kubectl wait”允许我根据选择器找到 pod,然后阻塞直到它准备好。

现在我需要在 golang 代码中做类似的事情。我见过使用client-go库进行身份验证并按名称“获取”特定 pod 的示例。但我有一些关于如何最好地使这个例子适应我的需要的问题......

  1. 我不知道能够“Get()”它的 pod 的确切/全名,这就是为什么“kubectl wait”是完美的,因为它允许我使用选择器找到 pod。我认为我应该使用 client-go 库来执行 CoreV1().Pods().List() 调用而不是 Get() 以便允许我使用选择器找到我想要的 pod?

  2. 此外,pod 可能不会立即存在,可能仅在 1 分钟左右后创建,这是“kubectl wait”为我处理的。在代码中,我是否需要循环/睡眠并继续执行 List() 直到 pod 存在?

  3. 与 #2 类似的问题...一旦 List() 返回 pod 名称,golang 中“等待”该 pod 处于“就绪”状态的最佳方法是什么?如果可以避免的话,我不想对睡眠进行任何丑陋的民意调查......那么有没有更好的选择使用 golang 'wait' 包或类似的?你有什么建议吗?

go kubernetes client-go

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

通过 .spec.selector.matchLabels 键使用 apimachinery 列出部署

我想根据现场找到的键值对列出我的部署.spec.selector.matchLabels

使用普通格式执行此操作labels很容易,但我找不到一种方法来匹配/获取满足key=value下一节中存在的某个条件的部署

spec:
  [...]
  selector:
    matchLabels:
      app: myapp
      process: web
      release: myrelease
Run Code Online (Sandbox Code Playgroud)

似乎不能使用ListOptions

go kubernetes client-go

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

无法从client-go - /serviceaccount/token连接到kubectl:没有这样的文件

我正在使用golang lib 客户端 - 去连接到正在运行的本地kubrenets.首先,我从示例中获取了代码:out-of-cluster-client-configuration.

运行这样的代码: $ KUBERNETES_SERVICE_HOST=localhost KUBERNETES_SERVICE_PORT=6443 go run ./main.go导致以下错误:

panic: open /var/run/secrets/kubernetes.io/serviceaccount/token: no such file or directory

goroutine 1 [running]:

/var/run/secrets/kubernetes.io/serviceaccount/
Run Code Online (Sandbox Code Playgroud)

我不太确定我缺少哪部分配置.我研究了以下链接:

但没有运气.我想我需要让客户端知道要使用哪个令牌/ serviceAccount,或者以每个人都可以连接到它的api的方式配置kubectl.

这是我的kubectl的状态,虽然一些命令结果:

$ kubectl配置视图

apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://localhost:6443
  name: docker-for-desktop-cluster
contexts:
- context:
    cluster: docker-for-desktop-cluster
    user: docker-for-desktop
  name: docker-for-desktop
current-context: docker-for-desktop
kind: Config
preferences: {}
users:
- name: docker-for-desktop
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
Run Code Online (Sandbox Code Playgroud)

$ kubectl获取serviceAccounts

NAME        SECRETS   AGE
default     1         3d
test-user …
Run Code Online (Sandbox Code Playgroud)

go kubernetes kubectl client-go

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

如何使用client-go API返回的Pod条件数组?

我使用 Go 中的 client-go API 来访问给定控制器(部署)下的 Pod 列表。使用选择器标签查询属于它的 pod 列表时,您会得到一个数组PodConditions- https://pkg.go.dev/k8s.io/api/core/v1?tab=doc#PodCondition

这与 Pod 条件的官方文档非常一致 - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions。但文档并不清楚如何访问这个条目数组。是按照最近的条目先排序吗?例如,如果我只想访问 Pod 的最新状态,应该怎么做?从我在本地集群中进行的一项试验中,我获得了控制器 Pod 之一的更新(Pod 条件数组),如下所示

{Initialized True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:15 +0000 UTC  } 
{Ready True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:22 +0000 UTC  } 
{ContainersReady True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:22 +0000 UTC  } 
{PodScheduled True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:15 +0000 UTC  }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,给定的 Pod几乎同时从 转变ContainersReady为。但它们都不在第一个或最后一个索引中。Ready08:01:22 +0000 UTC

TLDR,问题是如何从这个值数组推断最新的 Pod …

kubernetes kubernetes-apiserver kubernetes-pod client-go

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