使用Operator SDK创建和部署自定义Operator和自定义Kubernetes类型相当简单。以下是如何操作的说明。
在K8s中,对象类似于现实世界中的工作或已完成的任务。您可以使用它们来定义常见任务,将它们存储在版本控制系统中,并通过kubectl apply命令让它们生效。K8s通过创建运行软件所需的依赖资源(如pods)来确保这触发了所有必要的事情,确保你的声明性描述变得有效。Kubernetes包含许多可以使用此工作流创建的内置对象类型,如Deployments和Services。
借助Operators,Kubernetes允许集群维护者或软件提供商定义自己的Kubernetes对象类型,称为自定义资源定义(CRD)。这些对象可以由Kubernetes API处理,就像内置对象类型一样。在操作员代码中,作者可以定义如何对这些自定义对象执行操作。
操作员用户可以使用kubectl apply创建此自定义类型的对象,该对象称为自定义资源(CR)。
CR的用途很多,从部署几个Pod到更复杂的应用程序。想象一下简单运行kubectl -f postgres.yml就可以准备并使用一个高可用性的PostgreSQL集群是不是很速度。
本文将使用Kubernetes Operator部署由一个配置映射和pod组成的简单应用程序。在CR中,您可以指定Markdown字符串,该字符串将转换为基于HTML5的演示文稿。(毕竟,谁不想在本教程中那样使用kubectl edit presentation my-presentation就可以轻松的粘贴到PPT中演示?)
如果您还不熟悉运行Kubernetes集群,请阅读官方文档上的的Minikube入门,以更轻松地遵循此操作方法。
安装Operator SDK
在开始之前,我假设您已经登录到要使用的Kubernetes集群。您还必须具有Golang 1.13或更高版本的环境。
首先在GitHub上的Operator SDK版本页面为您的计算机安装最新版本的Operator SDK ,然后使其可执行并以operator-sdk的形式放入您的PATH中:
$ wget https://github.com/operator-framework/operator-sdk/releases/download/v0.15.2/operator-sdk-v0.15.2-x86_64-linux-gnu$ sudo mv operator-sdk-v0.15.2-x86_64-linux-gnu /usr/local/bin/operator-sdk$ sudo chmod +x /usr/local/bin/operator-sdk
引导新的K8s Operator
现在你应该已经准备好开始Operator开发了吧!Operator sdk二进制文件可用于生成许多不同运算符通用的样板代码。这使得每一个Operator 作者都能专注于开发自己的逻辑,使其区别于其他Operator,而不是一次又一次地重新设计Operator逻辑。要生成样板代码,请在要创建Operator的文件夹中运行以下命令。Operator SDK将生成一个文件夹,其中包含指定的Operator的名称:
$ cd ~/operators$ operator-sdk new presentation-example-operator --type go --repo github.com/NautiluX/presentation-example-operator
将repo参数指向要用于Go模块的存储库。此命令将下载一些依赖项,创建文件夹presentation-example-operator,并创建基本项目设置。接下来,生成一些Go代码来代表您的自定义资源定义(操作员的“ API”):
$ cd presentation-example-operator$ operator-sdk add api --kind Presentation --api-version presentation.example.com/v1alpha1
此命令指定CRD将被称为Presentation并创建文件pkg/apis/presentation/v1alpha1/presentation_types.go,您可以对其进行修改以指定CRD的输入参数。对于此示例应用程序,您只需要一个名为Markdown的参数:
...type PresentationSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file // Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html // This field can be used to define your presentation in markdown. Use --- to separate slides. Markdown string `json:"markdown,omitempty"`}...
请注意,这里唯一不同的是该字段的注释和Markdown字段的声明。该文件的其余部分由Operator SDK生成,可以根据需要进行调整。
现在,根据此定义和一些Go代码生成实际的CRD。为此,请运行以下命令:
$ operator-sdk generate crds$ operator-sdk generate k8s
在deploy/crds/presentation.example.com_presentations_crd.yaml中,您将找到CRD,您可以使用以下命令将其安装在K8s集群上:
$ kubectl apply -f deploy/crds/presentation.example.com_presentations_crd.yaml
Operator将运行一个所谓的协调循环,以确保每次从运算符的crd创建CR时都执行一段代码。这段代码存在于控制器中。Operator想要操作的每个CRD在Operator中都有相应的控制器。在这种情况下,您只需要一个控制器,因为您只有一个CRD。不过,在一个Operator中打包多个CRD和多个控制器是很常见的。要为新创建的CRD创建控制器,请运行以下命令:
$ operator-sdk add controller --kind Presentation --api-version presentation.example.com/v1alpha1
现在,您可以在生成的文件pkg/controller/add_presentation.go中将自己的逻辑添加到Reconcile函数中。每当创建,更改或删除Presentation CR 时,都会调用此函数。每当返回错误时,同一请求将通过该函数运行另一轮。
生成后,它包含创建Pod的示例代码,您可以对其进行调整以适应您的需求。您可以在此示例Operator的Git存储库中找到被调用函数的完整实现。此代码在协调功能中显示了工作流程:
... configMapChanged, err := r.ensureLatestConfigMap(instance) if err != nil { return reconcile.Result{}, err } err = r.ensureLatestPod(instance, configMapChanged) if err != nil { return reconcile.Result{}, err } return reconcile.Result{}, nil...
首先,它确保当前标记的ConfigMap存在。然后,它确保使用安装的最新版本的ConfigMap创建pod。
快速迭代:在集群外部运行Operator
Operator可以像其他应用程序一样部署到集群。但是,对于开发期间的快速迭代,在本地计算机上运行它很方便。这样,您可以立即看到输出,只需按Ctrl+C即可停止输出。要启动Operator,请运行以下命令:
$ operator-sdk run --local
现在,您可以在单独的终端上创建您的第一个演示,并观察Operator的工作情况:
$ kubectl apply -f apiVersion: presentation.example.com/v1alpha1kind: Presentationmetadata: name: example-presentationspec: markdown: | # My First Presentation --- ## Test slide * Test ---")
这将启动一个pod并创建一个配置映射,正如您在上面的Go代码中定义的那样:
$ kubectl get podsNAME READY STATUS RESTARTS AGEexample-presentation-pod 1/1 Running 0 103s$ kubectl get configmapsNAME DATA AGEexample-presentation-config 1 104s
要访问并查看此应用程序,您需要从Pod内部转发端口80。在实际的应用程序中,您可以根据Operator代码创建服务资源:
$ kubectl port-forward example-presentation-pod 8080:80
现在,您可以通过将浏览器访问http:// localhost:8080来查看。每当您更新Markdown时(例如,使用kubectl edit presentation example-presentation),将在重新部署Pod之后更新页面(并且您将需要重新启动端口转发)。
部署Operator
要部署Operator,需要创建一个容器镜像,该镜像可以由Kubernetes集群访问。幸运的是,Operator SDK包含创建此镜像的工具。生成后,可以使用Docker CLI推送图像:
$ operator-sdk build manueldewald/presentation-example-operator$ docker push manueldewald/presentation-example-operator
现在,您需要调整先前由Operator SDK在deploy/operator.yaml中生成的部署配置:
$ sed -i 's|REPLACE_IMAGE|manueldewald/presentation-example-operator|g' deploy/operator.yaml
最后,您可以使用kubectl apply -f deploy/operator.yml部署Operator,它将开始在集群中运行。现在,您可以尝试更改presentation或部署新的。
结论
使用Operator SDK创建和部署自定义Operator和自定义Kubernetes类型非常简单。
如果您喜欢使用Markdown创建幻灯片的想法,请看一下本示例Operator中使用的Remark.js。您无需运行Kubernetes集群即可使用它。打开一个简单的HTML文件就足够了。但是,如果您出于任何原因想要从Kubernetes集群中进行演示,那么你现在应该就知道怎么做了。
参考链接:https://opensource.com/article/20/3/kubernetes-operator-sdk
欣赏
5种Kubernetes集群管理自动化的方法
Mirantis收购Docker后发布首个 Enterprise版本
使用 Thanos 实现 Prometheus 的高可用
Kubernetes多集群上部署应用的利器