云服务器内容精选

  • 构建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 资源配置
  • 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
  • 如何对接边缘服务场景 由于边缘节点的轻量化和网络位于远端等特性,当前仅支持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 父主题: 附录
  • 控件类型 表单控件类型 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