如何解决在Go程序中支持Kuberentes API的多个版本 客户端/服务器和API 类型转换 Kubernetes实用程序问题
Kubernetes拥有一个快速发展的API,我正在尝试寻找最佳实践,建议或关于如何编写可以优雅地处理支持其不断发展的API并同时支持多个版本的Go软件的任何指导。我确定我不是尝试此操作的第一人,但是到目前为止,我还没有找到有关Kubernetes的任何具体指导,而且我对Go中多态性的了解还没有启发出一个好的解决方案。
Kubernetes用Go编写,并提供k8s.io/api/extensions/v1beta1
和k8s.io/api/networking/v1beta1
之类的Go软件包。 Kubernetes资源(例如Ingress)首先在一个API组(扩展)中发布,随着它们变得更加成熟,被转移到另一个API组(网络)中,还可以更改版本(例如,从v1beta1
更改为普通{ {3}})。 Kubernetes还提供v1
与Kubernetes集群进行交互。
我是一位经验丰富的面向对象(和其他类型)的程序员,但是对于Go来说是相当陌生的,对于Kubernetes软件包来说却是全新的。我要完成的是一种程序体系结构,该体系结构允许我编写一次代码,并使它可以在任何版本的Kubernetes资源上运行,至少只要该资源包含我关心的所有功能即可。在典型的面向对象的环境中,我将创建一个基类Ingress
,并从中派生所有这些不同的版本,并对操作进行打包,以便可以在任何地方使用Ingress
。我的感觉是Go打算让人们采取不同的方法,并且由于客户端/服务器方面的原因,在任何情况下都存在复杂性。
客户端/服务器和API
我的Go程序是Kubernetes服务器的客户端。各种版本的服务器将支持各种版本的Kubernetes API,因此将支持各种版本的Ingress资源。所以我的第一个问题是我必须做这样的事情才能获得所有Ingress的列表:
ingressesExt,err := il.kubeClient.ExtensionsV1beta1().Ingresses(namespace).List(Metav1.ListOptions{})
ingressesNet,err := il.kubeClient.NetworkingV1beta1().Ingresses(namespace).List(Metav1.ListOptions{})
我必须妥善处理有关不支持该API的错误。由于返回类型不同,因此AFAIK没有统一的界面,我只能在其中打电话并在一个列表中获得结果。看来这是某人应该解决并提供解决方案的事情,但到目前为止我还没有发现任何东西。
类型转换
我还必须找到某种方法将ingressesExt
和ingressesNet
合并到一个可用列表中,并且由于Ingress现已升级到NetworkingV1,因此着眼于可维护性/可扩展性。
Kubernetes实用程序
我看到Kubernetes提供了许多自动生成的代码和实用程序,但是我还没有找到很多有关如何使用它们的文档。例如,Ingress具有类似
的功能也许我可以用它们来进行类型转换?合并编组,解组,丢弃和合并,以某种方式从版本中获取数据并将其导入另一个版本?
问题
希望您能看到问题并了解我要实现的目标。
- Kubernetes或其他开源作者提供的软件包是否在像我需要的那样统一API方面取得了一些进展?
- Kubernetes是否有任何自动生成的功能可用于一般用途(而不是内部使用)并且对我的挑战有所帮助?除了Deepcopy,我没有找到任何文档。
- 抽象出Ingress对象各个版本之间的差异的“可行方式”是什么,以便我可以编写其余代码以在任何版本上工作?请记住,我可能需要进行另一个API调用以进行进一步处理,在这种情况下,我需要了解对象的具体类型并选择正确的API调用。对我来说,
client-go
并不支持对API调用的这种自动选择提供任何支持。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。