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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 【云原生】学习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

    相关实践学习
    通过Ingress进行灰度发布
    本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
    容器应用与集群管理
    欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
    相关文章
    |
    1月前
    |
    Kubernetes Cloud Native Docker
    云原生时代的容器化实践:Docker和Kubernetes入门
    【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
    97 2
    |
    1月前
    |
    弹性计算 人工智能 Serverless
    阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
    在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
    |
    2天前
    |
    存储 Kubernetes 开发者
    容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
    Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
    18 5
    容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
    |
    13天前
    |
    弹性计算 调度 数据中心
    阿里云 ACK One 注册集群云上弹性:扩展业务新利器
    随着企业数字化转型深入,传统IDC数据中心因物理容量限制,难以实现动态扩容,缺乏弹性能力。阿里云ACK One注册集群凭借其高度灵活性和丰富资源选择,成为解决此问题的最佳方案。通过与阿里云资源的整合,ACK One不仅实现了计算资源的按需扩展,提高了资源利用率,还通过按需付费模式降低了成本,使企业能够更高效地应对业务增长和高峰需求。
    |
    28天前
    |
    Kubernetes Cloud Native 微服务
    云原生入门与实践:Kubernetes的简易部署
    云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
    |
    1月前
    |
    Kubernetes Cloud Native 开发者
    云原生入门:Kubernetes的简易指南
    【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
    |
    29天前
    |
    Prometheus Kubernetes 监控
    深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
    深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
    |
    1月前
    |
    运维 Kubernetes Cloud Native
    云原生技术入门:Kubernetes和Docker的协同工作
    【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
    |
    1月前
    |
    Kubernetes 负载均衡 Cloud Native
    探索Kubernetes:云原生应用的基石
    探索Kubernetes:云原生应用的基石
    |
    1月前
    |
    Kubernetes 监控 负载均衡
    深入云原生:Kubernetes 集群部署与管理实践
    【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
    65 1