我正在使用https://github.com/kubernetes/client-go,一切运行良好。
我有一个官方Kubernetes Dashboard的清单(YAML):https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
我想在Go代码中使用client-go模仿此清单的kubectl apply
,我知道需要将YAML字节(un)marshalling为包https://github.com/kubernetes/api中定义的正确API类型。
我已经成功地将单个API类型Create
到我的集群中,但是对于包含不同类型的列表的清单,我该如何操作呢?是否有支持这些不同类型的资源kind: List*
?
我的当前解决方法是使用csplit
和---作为分隔符来拆分YAML文件。
csplit /path/to/recommended.yaml /---/ '{*}' --prefix='dashboard.' --suffix-format='%03d.yaml'
接下来,我循环遍历了新创建的14个部分,读取它们的字节,根据UniversalDeserializer的解码器返回的对象类型进行切换,并使用我的k8s clientset调用正确的API方法。我希望以编程方式执行此操作,以便将任何新版本的仪表板更新到我的集群中。 我还需要对Metrics Server和许多其他资源执行此操作。 另一种(可能更简单)的方法是将我的代码与安装了kubectl的容器映像一起发送,并直接调用; 但这意味着我还需要将kube配置写入磁盘,或者可能内联传递,以便kubectl可以使用它。
我发现这个问题很有帮助:https://github.com/kubernetes/client-go/issues/193解码器位于此处:https://github.com/kubernetes/apimachinery/tree/master/pkg/runtime/serializer。
它在client-go中公开:https://github.com/kubernetes/client-go/blob/master/kubernetes/scheme/register.go#L69 我还看了一下kubectl使用的RunConvert方法:https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/convert/convert.go#L139并假设我可以提供自己的genericclioptions.IOStreams以获得输出?
看起来RunConvert正走向弃用之路:https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/convert/convert.go#L141-L145 我还查看了其他标记为[client-go]的问题,但大多数使用旧示例或使用仅定义了单个
kind
的YAML文件,而API已经发生了变化。编辑:因为我需要对多个集群执行此操作,并且正在以编程方式创建集群(AWS EKS API + CloudFormation / eksctl),因此我希望将在许多群集上下文中创建ServiceAccount的开销最小化,跨多个AWS帐户。 理想情况下,创建我的clientset所涉及的唯一身份验证步骤是使用aws-iam-authenticator使用集群数据(名称、区域、CA证书等)获取令牌。 aws-iam-authenticator已经有一段时间没有发布了,但是
master
的内容允许传递第三方角色跨帐户角色和外部ID。 我个人认为,这比使用ServiceAccount
(和IRSA)更加简洁,因为应用程序(创建并应用这些群集的后端API)需要与其他AWS服务进行交互。编辑:我最近发现了https://github.com/ericchiang/k8s它在高层次上肯定比客户端-go更简单易用,但不支持此行为。
^---$
进行分割呢? - Shawyeoklinkerd2
,并像你说的那样模仿kubectl apply -f -
的思路。我们应该使用https://github.com/kubernetes/kubectl/blob/596d7b0ffffd963af1b995fea599ad49d9b2a046/pkg/cmd/apply/apply.go#L161,而不需要手动按Kind拆分资源吗? - Aisuko