错误: 至少有一个需要的隐性或转发依赖函数没找到。_如何在10分钟内构建一个Kubernetes Operator...

cf7a8dcd5ee128d4b0d45c76507c014d.gif

使用Operator SDK创建和部署自定义Operator和自定义Kubernetes类型相当简单。以下是如何操作的说明。

3e38cab8dc2828855ea177a8929bc39e.png

在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多集群上部署应用的利器

5a66ef7a40437ce67503fda98fdd9d16.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值