operator-sdk

Kubernetes中对象类似于现实世界中的工作或已完成的任务。 您可以使用它们来定义常见任务,将它们存储在版本控制系统中,并通过kubectl apply应用它们。 Kubernetes通过创建运行软件的相关资源(例如Pod),确保触发触发将声明式描述变为现实的一切必要操作。 Kubernetes包含许多可以使用此工作流创建的内置对象类型,例如Deployments和Services。

借助Operators,Kubernetes允许集群维护者或软件提供商定义自己的Kubernetes对象类型,称为自定义资源定义(CRD)。 这些对象可以由Kubernetes API处理,就像内置对象类型一样。 在操作员代码中,作者可以定义如何对这些自定义对象执行操作。

操作员用户可以使用kubectl apply创建此自定义类型的对象,该对象称为自定义资源(CR)。

kubectl -f postgres.yml并准备使用高可用性PostgreSQL集群。

本文将使用Kubernetes Operator部署一个由一个配置映射和一个pod组成的简单应用程序。 在CR中,您可以指定Markdown字符串,该字符串将转换为基于HTML5的演示文稿。 (毕竟,谁不想像本教程中那样使用kubectl编辑演示文稿my-presentation为下一次演讲准备幻灯片?)

如果您还不熟悉运行Kubernetes集群,请阅读笔记本电脑上的Minikube入门:Kubernetes,以更轻松地遵循此方法。

安装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

引导新的Kubernetes运营商

现在,您准备开始操作员开发! operator-sdk二进制文件可用于生成许多不同的Operators通用的样板代码。 这使每个操作员作者都可以专注于开发自己的逻辑以将其与其他操作员区分开来,而不是一遍又一遍地重新发明操作员逻辑。 要生成样板代码,请在要创建操作员的文件夹中运行以下命令。 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代码来表示您的自定义资源定义(Operator的“ 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,您可以使用以下命令将其安装在群集上:

 $  kubectl apply -f deploy / crds / presentation.example.com_presentations_crd.yaml 

操作员将运行一个所谓的reconcile-loop ,以确保每次创建来自操作员CRD的CR时都执行一段代码。 这段代码存在于控制器中。 操作员要操作的每个CRD在操作员中都会有一个相应的控制器。 在这种情况下,您只需要一个控制器,因为您只有一个CRD。 但是,在一个操作员中打包多个CRD和多个控制器是很常见的。 要为新创建的CRD创建控制器,请运行以下命令:

 $  operator-sdk add controller --kind Presentation --api-version presentation.example.com / v1alpha1 

现在,您可以在生成的文件pkg / controller / add_presentation.go中将自己的逻辑添加到Reconcile函数中。 每当创建,更改或删除Presentation CR时,都会调用此函数。 每当返回错误时,同一请求将通过该函数运行另一轮。

生成后,它包含创建吊舱的示例代码,您可以对其进行调整以适应您的需求。 您可以在此示例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
...

首先,它确保存在具有当前Markdown的ConfigMap。 然后,它确保使用已安装的最新版本的ConfigMap创建容器。

快速迭代:在集群外部运行操作员

可以像其他任何应用程序一样将Operator部署到群集中。 但是,为了在开发期间进行快速迭代,可以在本地计算机上运行它。 这样,您可以立即看到输出,只需按Ctrl + C即可停止输出 要启动操作员,请运行以下命令:

 $  operator-sdk run --local 

现在,您可以从单独的终端创建您的第一个演示文稿,并观察操作员的工作情况:


   
   
$ kubectl apply -f < ( echo "
apiVersion: presentation.example.com/v1alpha1
kind: Presentation
metadata:
  name: example-presentation
spec:
  markdown: |
    # My First Presentation
    ---
    ## Test slide

    * Test
    ---
"
)

如您在上面的Go代码中定义的那样,这将旋转一个pod并创建一个配置映射:


   
   
$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
example-presentation-pod   1 / 1     Running   0          103s

$ kubectl get configmaps
NAME                          DATA   AGE
example-presentation-config   1      104s

要访问此小应用程序并查看幻灯片,您需要从Pod内部转发端口80。 在实际的应用程序中,您可以根据操作员代码创建服务资源:

 $  kubectl port-forward example-presentation-pod 8080 : 80 

现在,您可以通过将浏览器导航到http:// localhost:8080来查看演示文稿。 每当您更新Markdown时(例如,使用kubectl编辑演示文稿example-presentation ),将在重新部署Pod之后更新页面(并且您将需要重新启动端口转发)。

部署运营商

要部署操作员,您需要创建一个可由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 SDK创建和部署自定义Operator和自定义Kubernetes类型非常简单。

如果您喜欢使用Markdown创建幻灯片的想法,请看一下本示例Operator中使用的Remark.js 。 您无需运行Kubernetes集群即可使用它。 打开一个简单HTML文件就足够了。 但是,如果出于任何原因想要从Kubernetes集群中进行演示,那么现在您知道该怎么做。

翻译自: https://opensource.com/article/20/3/kubernetes-operator-sdk

operator-sdk

Logo

开源、云原生的融合云平台

更多推荐