总结:任何看到这里的人都应该看到项目中存在大量由编码工具生成的代码。 运行脚本会自动生成以下文件和路径: 运行该脚本会建立以下包管理结构: 是不是很简单呢? 代码已完全生成,包含语言类型的文件下面的文件也是如此。 然后您可以根据生成的代码编写自己的代码。
CRD 部署和使用态度
CustomResourceDefinition (CRD) 是从 v1.7 开始的 Kubernetes API 扩展,允许您扩展 Kubernetes API无需更改您的代码。 用于管理自定义对象。 这实际上是 ThirdPartyResources (TPR) 的升级版本,在 v1.8 中被删除。
一些使用场景:
提供/管理外部数据存储/数据库(例如CloudSQL/RDS实例)。
k8s 执行基本的更高级别的抽象。 资源(比如etcd集群定义)
事实上,crd在很多围绕k8s的开源项目中都有使用,比如ingress-控制器和很多operator。
CRD 控制器
使用 CRD 扩展 Kubernetes API 时,通常需要为新资源实现一个控制器来监控资源变化并执行进一步的处理。 Sample-controller是官方提供的示例项目。
这个例子主要涵盖以下几个方面:
如何使用自定义资源定义注册 Foo 类型(自定义资源类型)的新自定义资源
如何创建/获取/列出新资源类型的 Foo 实例 Show
如何使用创建/更新/删除事件配置控制器以进行资源处理
在创建 crd 控制器之前,请务必使用 k8s 官方提供的代码。 生成工具 k8s.io/code-generator,用于生成客户端、通知者、列表者和 Deep-co。py 函数。 不仅代码风格符合k8s,而且对于减少错误和工作量也很有帮助。
在项目中使用代码生成器
下面您将了解代码生成工具的工作原理以及如何在自己的项目中使用尽可能少的代码行来使用它。我们将向您展示如何应用它并生成代码。 。 所有深度复制函数/类型化客户端/列表器/通知器仅通过单个 shell 脚本调用和部分代码注释生成。
不要去想代码生成有多复杂。 其实官方做了很多工作,提供了generator-group.sh。 看过client-go的Gopher都知道,项目中存在大量的编码工具生成的代码。 运行 ./hack/update-codegen.sh。 也就是说,
#!/usr/bin/env bash# 版权所有 2017 The Kubernetes Authors.## 根据 Apache 许可证 2.0 版许可(“许可证文件”); # 许可证副本可从 ## http://www.apache.org/licenses/LICENSE- 获取。 2.0 ## 除非适用法律要求或书面同意,否则 # 根据许可证分发的软件将按“原样”分发,不附带任何形式的保证或条件。# 明确或暗示。 # License下的权限和限制请参考具体语言License。 设置 -o errexitset -o nounsetset -o PipefailSCRIPT_ROOT=$(目录名 ${BASH_SOURCE})/.. CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo .. /code-generator)}# 该脚本位于 k8s.io 的供应商目录中/kubernetes # 使用 --output-base 生成代码,因为您需要能够使用 # 运行它 生成器需要输出-base 才能输出到供应商目录 # 而不是直接输出到 $GOPATH。 对于常规项目,可以将其删除。 ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" k8s.io/canary-controller/pkg/client k8s.io/canary-controller/pkg/apis canarycontroller:v1alpha1 --output-base "$(dirname ${BASH_SOURCE})/../../.." - -go-header-file ${SCRIPT_ROOT}/hack/boilerplate.go.txt# 要使用您自己的样板文本,请使用:# --go[ k4]header-file $ {SCRIPT_ROOT}/hack/custom-boilerplate.go.txt
update-codegen脚本自动生成以下文件和路径
pkg/apis/canarycontroller/v1alpha1/ zz_ generated.deepcopy.go
pkg/client/
运行该脚本会建立以下包管理结构:Masu。
就这么简单吗?pkg/client代码已经完全生成了,还有types.go文件下的zz_generate.deepcopy.go文件,该文件包含CustomResource golang语言类型,并且基于生成的代码。您可以使用创建自己的控制器
但是,这并不意味着您不必自己编写代码。 毕竟,机器还不够智能,无法定义它想要什么样的 CD。 以下所有文件都必须由您定义和实现,并且都与您自己的业务逻辑相关。
pkg/apis 下的所有文件(zz_ generated.deepcopy.go 除外)。
示例:
types.go
/*版权所有 2017 Kubernetes A作者。 根据 Apache 许可证 2.0 版(“许可证”)获得许可。 除非按照许可,否则您不得使用此文件。 许可证副本可从 http://www.apache.org/licenses/LICENSE-2.0 获取。 除非适用法律要求或书面同意,否则根据许可证分发的软件将“按原样”分发。 不存在任何类型的明示或暗示的保证或条件。 请参阅许可证,了解许可证下管理权限和限制的特定语言。 */package v1alpha1import (metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" )// +genclient// +k8s:deepcopy-gen:interfaces=k8s.io /apimachinery/pkg/runtime.Object // Canary 是 Foo 资源类型 Canary struct {metav1.TypeMeta `json:", inline"` metab1 的规范.ObjectMeta `json:"metadata,omitempty"` Spec CanarySpec `json:"spec"` Status CanaryStatus `json:"status"`}// CanarySpec 是 Foo 资源类型的规范 CanarySpec struct { DeploymentName string `json:" deploymentName "` Replicas *int32 `json:"replicas"`}// CanaryStatus 为 Foo 资源类型的状态 CanaryStatus struct { availableReplicas int32 `json:"availableReplicas"`}// +k8s:deepcopy-gen:interfaces =k8s .io/apimachinery/pkg/runtime.Object// CanaryList 是 Foo 资源类型的列表 CanaryList struct {metav1.TypeMeta `json:",inline"`metav1.ListMeta `json:"metadata"` Items []Canary `json : "items"`}
registry.go
/*版权所有 2017 Kubernetes 作者,已根据 Apache 许可证版本 2.0(“许可证”)获得许可。 这个不能用。除非遵守许可证,否则会归档文件。 可以从 http://www.apache.org/licenses/LICENSE-2.0 获取许可证副本。 除非适用法律要求或书面同意,否则本软件是根据许可证分发的。 它“按原样”分发,没有任何明示或暗示的保证或条件。 请参阅许可证,了解管理许可证下的权限和限制的特定语言。 * / package v1alpha1import(metav1“k8s.io/apimachinery/pkg/apis/meta/v1”“k8s.io/apimachinery/pkg/runtime”“k8s.io/apimachinery/pkg/runtime/schema”canarycontroller“k8s.io” /canary-controller/pkg/apis/canarycontroller" )//SchemeGroupVersion 是用于注册这些对象的组版本 var SchemeGroupVersion = schema.GroupVersion{Group: canarycontroller.GroupName, Version: "v1alpha1"}// Kind 接受不合格的种类并返回合格的组。 GroupKindfunc Kind(kind string) schema.GroupKind { return SchemeGroupVersion.WithKind(kind).GroupKind()}// Resource 返回非限定资源,组限定 GroupResourcefunc Resource(resource string) schema.GroupResource { return SchemeGroupVersion .WithResource(resource). GroupResource()}var (SchemeBuilder=runtime.NewSchemeBuilder(addKnownTypes)AddToScheme=SchemeBuilder.AddToScheme)//添加已知类型列表Scheme.func addKnownTypes(scheme *runtime.Scheme) error {cheme.AddKnownTypes(SchemeGroupVersion, &Canary{}, &CanaryList{}, )metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil}
详细信息>
有关具体说明和标签注释,请参阅 Kubernetes 深入探究:CustomResources 的代码生成。
概述
基于crds和crd控制器可以抽象出很多业务场景。 接下来,我们计划实施一个与我们的部署策略相关的项目。
评论前必须登录!
注册