草庐IT

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

跳楼梯企鹅 2023-04-08 原文

博主昵称:跳楼梯企鹅
博主主页面链接:博主主页传送门

博主专栏页面连接:专栏传送门--网路安全技术
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;

目录

一、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 资源。

 

$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)微服务管理总览

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

 

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

(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.校验方式

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

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>

 

有关【云原生】学习K8s的扩展技能(CRD)的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  9. ruby - 扩展类和实例 - 2

    这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐