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

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 【云原生】学习K8s的扩展技能(CRD)

 

博主昵称:跳楼梯企鹅
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;

目录

一、CRD 扩展 Kubernetes 集群

1.什么是 CRD

2.CRD 能做什么

(1)微服务管理总览

(2)创建 Yaml 配置

(3)自定义 Controller 逻辑

二、CRD 字段校验

1.校验方式

2.举例

3.API的常用方式

(1)配置

(2)查看文件  

(3)自定义CRD模型


一、CRD 扩展 Kubernetes 集群

1.什么是 CRD

CRD 本身是一种 Kubernetes 内置的资源类型,是 CustomResourceDefinition 的缩写,可以通过 kubectlget 命令查看集群内定义的 CRD 资源。

图片.png


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

image.gif

2.CRD 能做什么

(1)微服务管理总览

App 负责管理整个应用的生命周期,MicroService 负责管理微服务的生命周期。① 部署方面:App 可以直接管理多个 MicroService,同时 MicroService 利用控制器模式,可以为每个版本创建一个 Deployment, 实现多个版本同时部署。

image.gif图片.png

MicroService 为自己创建 1 个的 LoadBalance,也为每个版本创建了 Service。如下图所示,MicroService 下的每个版本(对应每个 Deployment)都有 Service,而本身也有 LoadBalance,即总共拥有 n+1Service

(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:
        ...

image.gif

(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
    }
    ...
}

image.gif

二、CRD 字段校验

图片.png

1.校验方式

kubernetes 目前提供了两种方式来对 CR 的校验

语法校验(OpenAPI v3 schema

语义校验( validatingadmissionwebhook

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

image.gif

3.API的常用方式

图片.png

  • 使用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端点

    image.gif

    (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

    image.gif

    (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>

    image.gif

    image.gif图片.png

    相关实践学习
    容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
    通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
    云原生实践公开课
    课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
    相关文章
    |
    3月前
    |
    Cloud Native 关系型数据库 分布式数据库
    掌阅科技采用云原生数据库PolarDB,大幅降低使用成本,提升业务稳定性和扩展性
    掌阅科技将数据库迁移到PolarDB后,数据压缩到之前的30%,整体成本节省50%。
    101 0
    |
    3月前
    |
    运维 Kubernetes Cloud Native
    OpenKruise是一个基于Kubernetes的扩展套件
    OpenKruise是一个基于Kubernetes的扩展套件【1月更文挑战第14天】【1月更文挑战第68篇】
    19 2
    |
    3月前
    |
    Kubernetes Cloud Native 调度
    云原生技术专题 | 云原生容器编排问题盘点,总结分享年度使用Kubernetes的坑和陷阱
    随着云原生的兴起,越来越多的应用选择基于Kubernetes进行部署,可以说Kubernetes 是最流行的容器编排和部署平台。它的强大功能特性,可以保障在生产中可靠地运行容器化应用程序,相关的DevOps等工具也应运而生,下面就是小编简单化了一个Kubernetes的逻辑架构图。
    327 9
    云原生技术专题 | 云原生容器编排问题盘点,总结分享年度使用Kubernetes的坑和陷阱
    |
    4月前
    |
    Kubernetes Cloud Native 应用服务中间件
    云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
    云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
    66 0
    |
    12天前
    |
    Kubernetes 监控 Cloud Native
    构建高效云原生应用:基于Kubernetes的微服务治理实践
    【4月更文挑战第13天】 在当今数字化转型的浪潮中,企业纷纷将目光投向了云原生技术以支持其业务敏捷性和可扩展性。本文深入探讨了利用Kubernetes作为容器编排平台,实现微服务架构的有效治理,旨在为开发者和运维团队提供一套优化策略,以确保云原生应用的高性能和稳定性。通过分析微服务设计原则、Kubernetes的核心组件以及实际案例,本文揭示了在多变的业务需求下,如何确保系统的高可用性、弹性和安全性。
    16 4
    |
    27天前
    |
    Kubernetes API 调度
    总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
    总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(水平扩展控制)
    59 0
    |
    1月前
    |
    Kubernetes Cloud Native Docker
    【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0
    Kubernetes 是一个开源平台,用于管理容器化工作负载和服务,提供声明式配置和自动化。源自 Google 的大规模运维经验,它拥有广泛的生态支持。本文档详细介绍了 Kubernetes 集群的搭建过程,包括服务器配置、Docker 和 Kubernetes 组件的安装,以及 Master 和 Node 的部署。此外,还提到了使用 Calico 作为 CNI 网络插件,并提供了集群功能的测试步骤。
    219 0
    |
    1月前
    |
    Kubernetes Cloud Native Devops
    云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
    云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
    51 1
    |
    1月前
    |
    弹性计算 运维 Kubernetes
    云原生K8S场景自动化响应ECS系统事件
    客户云原生K8S场景下,通过社区开源NPD+Draino+Autoscaler零开发,对接响应ECS主动运维事件,通过自动响应事件减少非预期宕机。
    |
    2月前
    |
    监控 关系型数据库 MySQL
    利用容器编排工具实现员工电脑监控软件系统的横向扩展
    随着企业规模的不断扩大,员工电脑监控软件系统的横向扩展成为一项迫切的需求。为了更有效地管理和监控员工的工作环境,容器编排工具的运用成为一种值得考虑的解决方案。在本文中,我们将探讨如何利用容器编排工具实现监控软件系统的横向扩展,并通过一些实际的代码示例来说明。
    184 0

    热门文章

    最新文章

    推荐镜像

    更多