云服务器内容精选
-
构建CR 通过CustomResource(CR)的方式创建新资源类型,在CR中为应用定义参数和状态属性。 参数 size:应用实例包含的实例数量。 image:应用的容器镜像地址。 storage:应用数据存储相关配置。 状态 phase:应用实例安装状态。 server:应用访问地址。 以创建一个Kafka应用,指定其Pod数量为3为例,设计CR如下: apiVersion: osctest.huawei.com/v1 kind: Hwfka metadata: name: hwfka-sample spec: size: 3 image: swr.cn-north-7.myhuaweicloud.com/osc/kafka:v2.7.0 storage: class: csi-disk accessModes: ReadWriteOnce size: 20Gi diskType: SSD kind为CRD中定义的names.kind。 metadata.name为CR名称,用户可自行更改。 该CR包含三个属性:size、image、storage,下文在定义API时需要为其定义Marker,以便自动生成OpenAPI schema。 apiVersion由group、domain、version组成,group为osctest,domain为huawei.com,version为v1,与CRD中的定义对应,可根据需要修改。
-
CRD字段说明 group,一般为组织名称,如:osctest。 API版本,第一个版本一般为v1。 scope,Namespaced级别,修改为Cluster级别,则集群内仅可以创建一个同名的CR。仅Cluster级别的operator可管理同级别CRD。 API名称,假设应用名称为hwfka,则对应的多种名称格式如下: API名称:kind: Hwfka,创建API的时候使用。 列表形式:listKind: HwfkaList。 复数形式:plural: hwfkas。 单数形式:singular: hwfka。 简称:shortNames: hfk。
-
接入规范说明 开源helm服务支持自定义配置服务场景、支持架构等配置,其描述说明定义在Chart.yaml中,具体样例如下: apiVersion: v1 description: "nginx \n" maintainers: - email: support@rancher.com name: Rancher Labs Support name: helm-instance-update version: 1.0.2 annotations: scenes: CCE,U CS source: ISV architecture: x86_64,aarch64 categories: database devices: CPU,GPU,NPU industries: education,media 参数名称 参数描述 参数示例 必选 source 包来源,取值范围:{ISV, OpenSource, HuaweiProvided},分别表示独立服务供应商、开源服务、华为自有服务,仅支持配置一个值。默认值为OpenSource OpenSource 否 architecture 支持架构列表,取值范围:{x86_64, aarch64},默认值为x86_64 x86_64,aarch64 否 categories 分类列表,范围不限,如"AI, Database",注意,当前同一个服务不同版本须配置相同内容,一旦配置后当前不支持修改 Database 否 devices 实例运行需要使用的硬件设备列表,取值范围:{CPU, GPU, NPU},默认值为CPU CPU,GPU 否 industries 行业列表,范围不限,如"education,media" education 否 scenes 部署平台列表,取值列表:{CCE,UCS},分别表示CCE平台和UCS平台,大小写敏感,默认值为CCE。 CCE,UCS 否 父主题: Helm规范
-
生命周期Lifecycle 生命周期文件:{OSC-Package}/lifecycle.yaml,描述当前OSC服务包的安装,升级方式信息。 lifecycle.yaml文件样例 ## 描述该OSC服务包的声明周期相关信息 install: strategy: deployment clusterPermissions: - rules: - apiGroups: - "" resources: - "" verbs: - "" serviceAccountName: sa deployments: - name: example-operator spec: template: metadata: spec: upgrade: replaces: 0.0.1 skips: - 0.0.2 - 0.0.3 operations: logpath: /var/paas/sys/log/operator/xxx-operator.log 表1 Lifecycle配置 参数名称 参数描述 参数示例 必填 install.strategy 安装方式,目前仅支持deployment方式 deployment 否 install.clusterPermissions 安装时需要的集群级别的权限 Kubernetes RABC规范 否 install.deployments 安装时的内容 Kubernetes Deployment规范 是 upgrade.replaces 升级基线版本 0.0.1 否 upgrade.skips 可以跳过升级的版本列表 说明: 举例说明: 假设已经发布0.0.1, 0.0.2, 0.0.3, 0.0.4, 0.0.5五个版本,其中0.0.2配置replaces: 0.0.1,0.0.5配置replace: 0.0.1及skips: 0.0.2。 0.0.2和0.0.5版本都配置基线版本为0.0.1,所以已经部署的0.0.1版本可以升级到0.0.2和0.0.5版本。 0.0.5版本因为配置了跳过0.0.2版本并且基线版本为0.0.1,所以已经部署的0.0.2版本无法升级到0.0.5版本,但是可以先将0.0.2版本回退到0.0.1版本后再次升级到0.0.5版本 参见样例 否 operations 运维操作配置,以注解方式定义 参见样例 否 operations.logpath 日志目录 参见样例 否 对于lifecycle文件中配置了upgrade字段的服务包,需要确保该服务operator能够管理的实例版本(由CSD文件中的versionDefinition字段规定)与被升级的operator所能管理的实例版本相兼容,否则会导致上传服务包或升级服务operator失败。具体规则请参见versionDefinition。 父主题: 服务包规范
-
接入规范说明 开源OLM服务(operator-framework)服务支持自定义配置服务场景、支持架构等配置,其描述说明定义在clusterserviceversion.yaml中,具体样例如下: apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: name: example-operator.v0.0.3 namespace: test annotations: scenes: UCS,CCE source: ISV architecture: x86_64,aarch64 categories: Database devices: CPU,GPU,NPU industries: education,media spec: apiservicedefinitions: {} skips: - example-operator.v0.0.2 replaces: example-operator.v0.0.1 customresourcedefinitions: ... 参数名称 参数描述 参数示例 必选 source 包来源,取值范围:{ISV, OpenSource, HuaweiProvided},分别表示独立服务供应商、开源服务、华为自有服务,仅支持配置一个值。默认值为OpenSource OpenSource 否 architecture 支持架构列表,取值范围:{x86_64, aarch64},默认值为x86_64 x86_64,aarch64 否 categories 分类列表,范围不限,如"AI, Database",注意,当前同一个服务不同版本须配置相同内容,一旦配置后当前不支持修改 Database 否 devices 实例运行需要使用的硬件设备列表,取值范围:{CPU, GPU, NPU},默认值为CPU CPU,GPU 否 industries 行业列表,范围不限,如"education,media" education 否 scenes 部署平台列表,取值列表:{CCE,UCS},分别表示CCE平台和UCS平台,大小写敏感,默认值为CCE。 CCE,UCS 否 父主题: Operator规范
-
资源配置 和K8S配套的资源控件,可以设置limit和request。 配置示例: - path: resources displayName: 单节点规格 description: "单节点Redis的内存规格,因系统开销,实际使用内存是所填数值的1.25倍" x-descriptors: - "urn:alm:descriptor:com.tectonic.ui:resourceRequirements" 图9 资源配置
-
如何对接边缘服务场景 由于边缘节点的轻量化和网络位于远端等特性,当前仅支持helm类型的实例,其中实例所包含的资源可以为Node、Namespace、Deployment、Job、Configmap、Secret、Cronjob、Pod、Daemonset、Service等kubernetes资源。支持边缘场景的helm服务包,对于应用负载的开发需按照以下配置开发,以支持实例部署在边缘节点,并可通过IEF界面进行进一步操作: 边缘场景下实例会默认指定部署在以用户projectID的namespace下,其他namespace下无法创建资源。 服务包内Deployment类型的资源,需要为Deployment添加app:{deployment_name}的label,且Deployment不能与已有Deployment或Job重名,以支持通过IEF界面查看Deployment信息。 若实例需要进行指定边缘节点部署,可以通过增加节点亲和性中的节点label实现,并通过value.yaml的输入(结合descriptor)进行指定,样例: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: edgecloud.huawei.com/node_id # key值必须为edgecloud.huawei.com/node_id operator: In values: - {node_id} # 此处取值为边缘节点ID 父主题: 附录
-
RBAC权限管理 Operator使用基于角色的访问控制机制对Kubernetes中的资源进行访问,因此,要保证Operator正确的运行,需要使用管理员权限的帐号对Operator进行授权,即预先创建对应的role和rolebinding。 在Reconcile()上添加markers,增加Operator对于Service、StatefulSet、Deployment、Pod的管理权限,SDK即可自动生成对应的role和rolebinding等资源描述文件。 // +kubebuilder:rbac:groups=osctest.huawei.com,resources=hwfkas,verbs=get;list;watch;create;update;patch;delete// +kubebuilder:rbac:groups=osctest.huawei.com,resources=hwfkas/status,verbs=get;update;patch// +kubebuilder:rbac:groups=core,resources=services,verbs=get;list;watch;create;update;patch;delete// +kubebuilder:rbac:groups=apps,resources=statefulsets,verbs=get;list;watch;create;update;patch;delete// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete// +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch// +kubebuilder:rbac:groups=core,resources=persistentvolumeclaims,verbs=get;list;watch;updatefunc (r *HwfkaReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { // ...} 如果Operator为namespace级别的,则需要还添加namespace,如: // +kubebuilder:rbac:groups=osctest.huawei.com,namespace=example,resources=hwfkas,verbs=get;list;watch;create;update;patch;delete// +kubebuilder:rbac:groups=osctest.huawei.com,namespace=example,resources=hwfkas/status,verbs=get;update;patch
-
控件类型 表单控件类型 1. 使用默认crd.yaml文件自动生成表单 由CRD中定义的openAPIV3Schema字段规定CR中可配置的参数以及这些参数的类型、范围,应用在创建CR的时候通过YAML文件指定这些参数。 2. 使用自定义csd.yaml文件生成表单 自动生成的创建表单已经很强大,但有时可能需要修改自定义表单的呈现方式。例如,可能需要对用户更友好的displayName、更简洁的描述,以及更改表单字段顺序,或排除一些非面向用户的字段。这就是“(x-descriptors)规范描述符”的作用。 父主题: 配置表单控件
-
生成服务包 最终的服务目录结构如下: $ tree hwfka-operator-packagehwfka-operator-package├── lifecycle.yaml├── manifests│ ├─ hwfka_crd.yaml│ └─ hwfka_csd.yaml│ └─ vendor└── metadata.yaml 打包服务包命令如下: $ tar -zcvf hwfka-operator-package.tgz hwfka-operator-package 父主题: 制作服务包
-
创建服务包模板 通过OSC提供的oscctl工具创建服务包模板,oscctl工具使用详情请参见oscctl工具使用。 使用oscctl工具创建服务包模板。 # 使用oscctl工具,创建服务包$ oscctl create -o ./hwfka-operator-packageSuccessfully created original package to OSC package! 检查服务包目录结构。 # 服务包的结构$ tree hwfka-operator-packagehwfka-operator-package├── lifecycle.yaml #【必选】生命周期文件├── manifests # 【必选】资源合计│ ├─ hwfka_crd.yaml│ └─ hwfka_csd.yaml│ └─ vendor└── metadata.yaml #【必选】元数据文件 父主题: 制作服务包
-
Controller实现背景 在创建Kafka实例时,Kafka-Operator需要创建的Kubernetes资源如下: 1个StatefulSet,包含3个Pod分别启动ZooKeeper; 1个Service,用来暴露ZooKeeper访问地址; 1个StatefulSet,包含3个Pod分别启动Hwfka broker; 1个Service,用来暴露Hwfka访问地址; 1个Deployment,包含1个Pod启动KafkaManager; 1个Service,用来暴露KafkaManager访问地址。 在创建API的时候,SDK已自动创建controllers/hwfka_controller.go,为SetupWithManager添加对Service、StatefulSet、Deployment的监听和管理。 import ("context""fmt""github.com/go-logr/logr"appsv1 "k8s.io/api/apps/v1"corev1 "k8s.io/api/core/v1""k8s.io/apimachinery/pkg/api/errors""k8s.io/apimachinery/pkg/runtime""k8s.io/apimachinery/pkg/types"ctrl "sigs.k8s.io/controller-runtime""sigs.k8s.io/controller-runtime/pkg/client"osctestv1 "hwfka-operator/api/v1")func (r *HwfkaReconciler) SetupWithManager(mgr ctrl.Manager) error {return ctrl.NewControllerManagedBy(mgr).For(&osctestv1.Hwfka{}).Owns(&corev1.Service{}).Owns(&appsv1.StatefulSet{}).Owns(&appsv1.Deployment{}).Complete(r)}
-
调度逻辑 对于Kubernetes集群内任何Hwfka或Service、StatefulSet、Deployment的变化,Controller都会监听到,并生成事件,触发Reconcile()方法。需要在Reconcile()方法中实现协调逻辑,创建Service、StatefulSet等资源,并更新应用实例状态,实现的过程中,可以参考: 查询资源:控制器使用controller-runtime库中的Client实现对Kubernetes资源的增查改删,示例代码参见:example_test.go。 创建资源:使用Go语言调用Kubernetes API创建资源,可参考Kubernetes API Reference。 设置关联:为创建的Kubernetes资源设置ownerReferences,以便其能在CR删除时被级联删除,可参考如下代码。 // 为指定命名空间和名称的 secret 设置 owner,返回 secretfunc (k *K8sClient) SetSecretOwner(cr *oscv1.Kafka, secretName string) (*corev1.Secret, error) {ctx := context.Background()secret, err := k.GetSecretByNamespaceName(cr.Namespace, secretName)if err != nil {return nil, err}if secret.OwnerReferences == nil {patch := client.MergeFrom(secret.DeepCopy())secret.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(cr, schema.GroupVersionKind{Group: cr.GroupVersionKind().Group,Version: cr.GroupVersionKind().Version,Kind: cr.Kind,}),}if err := k.Patch(ctx, secret, patch); err != nil {return nil, err}}return secret, nil} 如果一个动作的处理时间较长,为了避免Reconcile阻塞,需要使请求返回并重新排队,有四种方法: // 请求成功,不再排队return ctrl.Result{}, nil// 请求失败,重新加入队列return ctrl.Result{}, err// 请求因某种原因需要重新加入队列return ctrl.Result{Requeue: true}, nil// 请求因某种原因,需要在指定时间后重新加入队列return ctrl.Result{RequeueAfter: time.Second*5}, nil 当删除CR时,如果需要预先清理Kubernetes之外的资源,此时仅凭ownerReferences无法实现,可以利用finalizers特性。利用finalizers延时删除资源的方法请参见Using Finalizers。 示例代码请参见Controller实现。
-
statusDescriptors statusDescriptor用于描述自定义资源中状态字段的属性,其配置在csd.yaml文件的status字段。statusDescriptors的结构与specDescriptors相似,包括相同的字段。 text x-descriptors: 文本形式公开实例的状态字段。 status: [PATH_TO_THE_FIELD]: [FIELD_VALUE] 例子: - description: 版本 displayName: 版本 path: version x-descriptors: - urn:alm:descriptor:text 图1 界面展示 2. link 此描述符用来公开实例的外部链接。它需要实例的状态块中的输出格式: status: [PATH_TO_THE_FIELD]: [FIELD_VALUE] 例子: - description: 开启公网访问后,可通过弹性公网IP访问,集群模式暂不支持 displayName: CCE集群内访问地址 path: publishedEndpoint restriction: scenes: - Cloud x-descriptors: - urn:alm:descriptor:com.huawei.ui:link 实例status字段具体值信息如下: status: publishedEndpoint: 'http://kafka-1wppvf-broker.default.svc.cluster' 图2 界面展示 父主题: 自定义控件
-
生成代码和资源描述文件 修改api/v1/memcached_types.go或controller中的markers之后,需要重新生成代码和资源描述文件。 # 生成 api/v1/zz_generated.deepcopy.gomake generate# 生成 config/crd/bases 和 config/rbac/role.yamlmake manifests 该步骤将根据API定义自动生成CRD和RBAC。 父主题: 实现Operator
更多精彩内容
CDN加速
GaussDB
文字转换成语音
免费的服务器
如何创建网站
域名网站购买
私有云桌面
云主机哪个好
域名怎么备案
手机云电脑
SSL证书申请
云点播服务器
免费OCR是什么
电脑云桌面
域名备案怎么弄
语音转文字
文字图片识别
云桌面是什么
网址安全检测
网站建设搭建
国外CDN加速
SSL免费证书申请
短信批量发送
图片OCR识别
云数据库MySQL
个人域名购买
录音转文字
扫描图片识别文字
OCR图片识别
行驶证识别
虚拟电话号码
电话呼叫中心软件
怎么制作一个网站
Email注册网站
华为VNC
图像文字识别
企业网站制作
个人网站搭建
华为云计算
免费租用云托管
云桌面云服务器
ocr文字识别免费版
HTTPS证书申请
图片文字识别转换
国外域名注册商
使用免费虚拟主机
云电脑主机多少钱
鲲鹏云手机
短信验证码平台
OCR图片文字识别
SSL证书是什么
申请企业邮箱步骤
免费的企业用邮箱
云免流搭建教程
域名价格