【云原生】学习K8s的扩展技能(CRD)

seuleyang

关注

阅读 239

2022-09-25

目录

一、CRD 扩展 Kubernetes 集群

1.什么是 CRD

 2.CRD 能做什么

(1)微服务管理总览

(2)创建 Yaml 配置

(3)自定义 Controller 逻辑

二、CRD 字段校验

1.校验方式

2.举例

3.API的常用方式

(1)配置

(2)查看文件  

(3)自定义CRD模型


 

一、CRD 扩展 Kubernetes 集群

1.什么是 CRD

 

$kubectl get crd
NAME                         CREATED AT
apps.app.my.cn            2022-09-25T07:02:47Z
microservices.app.my.cn   2022-09-25T07:02:47Z

 2.CRD 能做什么

(1)微服务管理总览

 

(2)创建 Yaml 配置

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  creationTimestamp: null
  labels:
    controller-tools.k8s.io: "1.0"
  # 名称必须与下面的spec字段匹配,格式为: <plural>.<group>
  name: apps.app.o0w0o.cn
spec:
  # 用于REST API的组名称: /apis/<group>/<version>
  group: app.o0w0o.cn
  names:
    # kind字段使用驼峰命名规则. 资源清单使用如此
    kind: App
    # URL中使用的复数名称: /apis/<group>/<version>/<plural>
    plural: apps
  # 指定crd资源作用范围在命名空间或集群
  scope: Namespaced
  # 自定义资源的子资源的描述
  subresources:
    # 启用状态子资源
    status: {}
  # 验证机制
  validation:
    # openAPIV3Schema is the schema for validating custom objects.
    openAPIV3Schema:
      properties:
        ...

(3)自定义 Controller 逻辑

func (r *ReconcileApp) Reconcile(request reconcile.Request) (reconcile.Result, error) {
    ...
        // 状态 App 同步
    if err := r.syncAppStatus(instance); err != nil {
        log.Info("Sync App error", err)
        return reconcile.Result{}, err
    }
        // 协调资源 MicroService 
    if err := r.reconcileMicroService(request, instance); err != nil {
        log.Info("Creating MicroService error", err)
        return reconcile.Result{}, err
    }
    ...
}
func (r *ReconcileMicroService) Reconcile(request reconcile.Request) (reconcile.Result, error) {
    ...
    // 同步 MicroService 状态
    if err := r.syncMicroServiceStatus(instance); err != nil {
        log.Info("Sync MicroServiceStatus error", err)
        return reconcile.Result{}, err
    }
    // 协调实例
    if err := r.reconcileInstance(instance); err != nil {
        log.Info("Reconcile Instance Versions error", err)
        return reconcile.Result{}, err
    }
   // 协调负载均衡器
    if err := r.reconcileLoadBalance(instance); err != nil {
        log.Info("Reconcile LoadBalance error", err)
        return reconcile.Result{}, err
    }
    ...
}

二、CRD 字段校验

 

 

1.校验方式

2.举例

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  # name must match the spec fields below, and be in the form: <plural>.<group>
  name: kubernetesclusters.ecs.yun.com
spec:
  # group name to use for REST API: /apis/<group>/<version>
  group: ecs.yun.com
  # list of versions supported by this CustomResourceDefinition
  versions:
    - name: v1
      # Each version can be enabled/disabled by Served flag.
      served: true
      # One and only one version must be marked as the storage version.
      storage: true
  # either Namespaced or Cluster
  scope: Namespaced
  names:
    # plural name to be used in the URL: /apis/<group>/<version>/<plural>
    plural: kubernetesclusters
    # singular name to be used as an alias on the CLI and for display
    singular: kubernetescluster
    # kind is normally the CamelCased singular type. Your resource manifests use this.
    kind: KubernetesCluster
      # listKind
    listKind: KubernetesClusterList
    # shortNames allow shorter string to match your resource on the CLI
    shortNames:
    - ecs





#CRD 对象
apiVersion: ecs.yun.com/v1
kind: KubernetesCluster
metadata:
  name: test-cluster
spec:
  clusterType: kubernetes
  serviceCIDR: ''
  masterList:
  - ip: 192.168.1.10
  nodeList:
  - ip: 192.168.1.11
  privateSSHKey: ''
  scaleUp: 0
  scaleDown: 0

3.API的常用方式

 

  • 使用CRD(CustomResourceDefinitions)自定义资源类型
  • 开发自定义的APIServer并聚合至主API Server
  • 及定制扩展API Server源码。这其中,CRD最为易用但限制颇多,自定义API Server更富于弹性但代码工作量偏大,而仅在必须添加新的核心类型才能确保专用的Kberneves集群功能正常,才应该定制系统源码
  • 其中CRD与CRT一般由开发或服务供应商提供
  • CRD只是定义一个类型Kind,但实际把kind运行起来CR需要有Controller来对资源进行控制,所有只有定义CRD定义没有并没有实际意义,当然也可以通过定义现在kind来运行,比如deployment 通过定义 RC来运行

(1)配置

 

apiVersion: apiextensions.k8s.io/v1 #API群组和版本
kind: CustomResourceDefinition #资源类别
metadata:
  -name <string> #资源名称
spec:
  conversion <object> #定义不同版本间的格式转换方式
    strategy <string># 不同版本间的自定义资源转换策略,有None和webhook两种取值
    webhook <0bject>#如何调用用于进行格式转换的webhook
  group <string>#资源所属的API群组
  names <object># 自定义资源的类型,即该CRD创建资源规范时使用的kind
    categories <[]string>#资源所属的类别编目,例如"kubectl get all"中的all
    kind <string> #kind名称,必选字段
    listKind <string> #资源列表名称,默认为"`kind`List"
    plural <string>  #复数,用于API路径`/apis/<group>/<version>/. . ./<plural>"
    shortNames <[string>#该资源的kind的缩写格式
    singular <string>#资源kind的单数形式,必须使用全小写字母,默认为小写的kind名称
  preserveUnknownFields <boolean> #预留的非知名字段,kind等都是知名的预留字段
  scope <string> #作用域,可用值为Cluster和Namespaced
  versions <[]object>#版本号定义
    additionalPrinterColumns <[]0bject> #需要返回的额外信息
    name <string>  #形如vM[alphaN|betaN]格式的版本名称,例如v1或vlalpha2等
    schema <object> #该资源的数据格式(schema)定义,必选字段
      openAPIV3Schema <object> #用于校验字段的schema对象,格式请参考相关手册
    served <boolean> #是否允许通过RESTful API调度该版本,必选字段
    storage <boolean> #将自定义资源存储于etcd中时是不是使用该版本
    subresources <0bject>#子资源定义
      scale <0bject># 启用scale子资源,通过autoscaling/v1.Scale发送负荷
      status <map[string]># 启用status子资源,为资源生成/status端点

(2)查看文件  

calico的yaml文件

[root@k8s-master plugin]# vim calico.yaml   
...
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: ippools.crd.projectcalico.org
spec:
......
...
[root@k8s-master plugin]# kubectl get CustomResourceDefinition
NAME                                                  CREATED AT
bgpconfigurations.crd.projectcalico.org               2022-08-25T14:33:24Z
bgppeers.crd.projectcalico.org                        2022-08-25T14:33:24Z
blockaffinities.crd.projectcalico.org                 2022-08-25T14:33:24Z
clusterinformations.crd.projectcalico.org             2022-08-25T14:33:24Z
felixconfigurations.crd.projectcalico.org             2022-08-25T14:33:24Z
globalnetworkpolicies.crd.projectcalico.org           2022-08-25T14:33:24Z
globalnetworksets.crd.projectcalico.org               2022-08-25T14:33:24Z
hostendpoints.crd.projectcalico.org                   2022-08-25T14:33:24Z
ipamblocks.crd.projectcalico.org                      2022-08-25T14:33:24Z
ipamconfigs.crd.projectcalico.org                     2022-08-25T14:33:24Z
ipamhandles.crd.projectcalico.org                     2022-08-25T14:33:24Z
ippools.crd.projectcalico.org                         2022-08-25T14:33:24Z
kubecontrollersconfigurations.crd.projectcalico.org   2022-08-25T14:33:24Z
networkpolicies.crd.projectcalico.org                 2022-08-25T14:33:24Z
networksets.crd.projectcalico.org                     2022-08-25T14:33:24Z

(3)自定义CRD模型

[root@k8s-master crd]# cat user-cr-demo.yaml 
apiVersion: auth.ilinux.io/v1alpha1
kind: User
metadata:
  name: admin
  namespace: default
spec:
  userID: 1
  email: test@test.com
  groups:
  - superusers
  - adminstrators
  password: ikubernetes.io

[root@k8s-master crd]# kubectl apply -f user-cr-demo.yaml 
user.auth.ilinux.io/admin created

[root@k8s-master crd]# kubectl get User
NAME    AGE
admin   14s

[root@k8s-master ~]# kubectl describe User admin
Name:         admin
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  auth.ilinux.io/v1alpha1
Kind:         User
Metadata:
  Creation Timestamp:  2022-09-25T14:51:53Z
  Generation:          1
  Managed Fields:
    API Version:  auth.ilinux.io/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        .:
        f:email:
        f:groups:
        f:password:
        f:userID:
    Manager:         kubectl-client-side-apply
    Operation:       Update
    Time:            2022-09-25T14:51:53Z
  Resource Version:  2583010
  Self Link:         /apis/auth.ilinux.io/v1alpha1/namespaces/default/users/admin
  UID:               5af89454-e067-4f30-83b7-cc2ad82e3526
Spec:
  Email:  test@test.com
  Groups:
    superusers
    adminstrators
  Password:  ikubernetes.io
  User ID:   1
Events:      <none>

 

精彩评论(0)

0 0 举报