我正在使用https://github.com/kubernetes/client-go,并且一切正常。
我有一个官方Kubernetes资讯主页的清单(YAML):https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
我想使用client-go模仿Go代码中的kubectl apply
这个清单。
我知道我需要对YAML字节进行一些(非)编组,以封装https://github.com/kubernetes/api
中定义的正确API类型。我已经成功Create
将单个API类型kind: List*
添加到集群中,但是我如何对包含不同类型列表的清单执行此操作?是否有资源csplit
支持这些不同类型?
我当前的解决方法是使用csplit /path/to/recommended.yaml /---/ '{*}' --prefix='dashboard.' --suffix-format='%03d.yaml'
以-作为分隔符来拆分YAML文件
kubectl apply -f -
接下来,我遍历已创建的新(14)部分,读取它们的字节,打开UniversalDeserializer的解码器返回的对象的类型,并使用我的k8s客户端集调用正确的API方法。
我想通过编程来对集群中仪表板的任何新版本进行更新。我还将需要对Metrics Server和许多其他资源执行此操作。另一种(可能更简单)的方法是将安装了kubectl的代码运送到容器映像中,然后直接调用kind
;但这意味着我还需要将kube配置写入磁盘或内联传递它,以便kubectl可以使用它。
我发现此问题有帮助:https://github.com/kubernetes/client-go/issues/193 解码器位于此处:https://github.com/kubernetes/apimachinery/tree/master/pkg/runtime/serializer
它在客户端中公开:https://github.com/kubernetes/client-go/blob/master/kubernetes/scheme/register.go#L69
我还看了kubectl:https://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/convert/convert.go#L139使用的RunConvert方法,并假设我可以提供自己的genericclioptions.IOStreams来获取输出?
It looks like RunConvert is on a deprecation path
我还查看了其他带有[client-go]标签的问题,但是大多数问题都使用旧示例或使用定义了单个Serviceaccount
的YAML文件,并且此后API发生了变化。
编辑:因为我需要对多个群集执行此操作,并且正在以编程方式创建群集(AWS EKS API + CloudFormation / eksctl),所以我想将创建master
的开销降至最低跨多个群集上下文,跨多个AWS账户。理想情况下,创建我的客户端集所涉及的唯一身份验证步骤是使用aws-iam-authenticator使用群集数据(名称,区域,CA cert等)获取令牌。一段时间没有发布aws-iam-authenticator,但是Serviceaccount
的内容允许使用第三方角色交叉帐户角色和要传递的外部ID。 IMO,这比使用{{1}}(和IRSA)更干净,因为应用程序(用于创建附加组件并将附加组件应用到这些集群的后端API)还需要与其他AWS服务交互。 / p>
编辑:我最近发现了https://github.com/ericchiang/k8s。在高层上,它肯定比client-go更简单,但不支持此行为。