0


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

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

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

一、CRD 扩展 Kubernetes 集群

1.什么是 CRD

**CRD 本身是一种 Kubernetes 内置的资源类型,是 CustomResourceDefinition 的缩写,可以通过

  1. kubectlget

命令查看集群内定义的 CRD 资源。**

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

2.CRD 能做什么

(1)微服务管理总览

**

  1. App

负责管理整个应用的生命周期,

  1. MicroService

负责管理微服务的生命周期。① 部署方面:

  1. App

可以直接管理多个

  1. MicroService

,同时

  1. MicroService

利用控制器模式,可以为每个版本创建一个

  1. Deployment

, 实现多个版本同时部署。**

**

  1. MicroService

为自己创建 1 个的

  1. LoadBalance

,也为每个版本创建了

  1. Service

。如下图所示,

  1. MicroService

下的每个版本(对应每个

  1. Deployment

)都有

  1. Service

,而本身也有

  1. LoadBalance

,即总共拥有

  1. n+1

  1. Service

**

(2)创建 Yaml 配置

  1. apiVersion: apiextensions.k8s.io/v1beta1
  2. kind: CustomResourceDefinition
  3. metadata:
  4. creationTimestamp: null
  5. labels:
  6. controller-tools.k8s.io: "1.0"
  7. # 名称必须与下面的spec字段匹配,格式为: <plural>.<group>
  8. name: apps.app.o0w0o.cn
  9. spec:
  10. # 用于REST API的组名称: /apis/<group>/<version>
  11. group: app.o0w0o.cn
  12. names:
  13. # kind字段使用驼峰命名规则. 资源清单使用如此
  14. kind: App
  15. # URL中使用的复数名称: /apis/<group>/<version>/<plural>
  16. plural: apps
  17. # 指定crd资源作用范围在命名空间或集群
  18. scope: Namespaced
  19. # 自定义资源的子资源的描述
  20. subresources:
  21. # 启用状态子资源
  22. status: {}
  23. # 验证机制
  24. validation:
  25. # openAPIV3Schema is the schema for validating custom objects.
  26. openAPIV3Schema:
  27. properties:
  28. ...

(3)自定义 Controller 逻辑

  1. func (r *ReconcileApp) Reconcile(request reconcile.Request) (reconcile.Result, error) {
  2. ...
  3. // 状态 App 同步
  4. if err := r.syncAppStatus(instance); err != nil {
  5. log.Info("Sync App error", err)
  6. return reconcile.Result{}, err
  7. }
  8. // 协调资源 MicroService
  9. if err := r.reconcileMicroService(request, instance); err != nil {
  10. log.Info("Creating MicroService error", err)
  11. return reconcile.Result{}, err
  12. }
  13. ...
  14. }
  15. func (r *ReconcileMicroService) Reconcile(request reconcile.Request) (reconcile.Result, error) {
  16. ...
  17. // 同步 MicroService 状态
  18. if err := r.syncMicroServiceStatus(instance); err != nil {
  19. log.Info("Sync MicroServiceStatus error", err)
  20. return reconcile.Result{}, err
  21. }
  22. // 协调实例
  23. if err := r.reconcileInstance(instance); err != nil {
  24. log.Info("Reconcile Instance Versions error", err)
  25. return reconcile.Result{}, err
  26. }
  27. // 协调负载均衡器
  28. if err := r.reconcileLoadBalance(instance); err != nil {
  29. log.Info("Reconcile LoadBalance error", err)
  30. return reconcile.Result{}, err
  31. }
  32. ...
  33. }

二、CRD 字段校验

1.校验方式

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

**语法校验(

  1. OpenAPI v3 schema

) **

**语义校验(

  1. validatingadmissionwebhook

)**

2.举例

  1. apiVersion: apiextensions.k8s.io/v1beta1
  2. kind: CustomResourceDefinition
  3. metadata:
  4. # name must match the spec fields below, and be in the form: <plural>.<group>
  5. name: kubernetesclusters.ecs.yun.com
  6. spec:
  7. # group name to use for REST API: /apis/<group>/<version>
  8. group: ecs.yun.com
  9. # list of versions supported by this CustomResourceDefinition
  10. versions:
  11. - name: v1
  12. # Each version can be enabled/disabled by Served flag.
  13. served: true
  14. # One and only one version must be marked as the storage version.
  15. storage: true
  16. # either Namespaced or Cluster
  17. scope: Namespaced
  18. names:
  19. # plural name to be used in the URL: /apis/<group>/<version>/<plural>
  20. plural: kubernetesclusters
  21. # singular name to be used as an alias on the CLI and for display
  22. singular: kubernetescluster
  23. # kind is normally the CamelCased singular type. Your resource manifests use this.
  24. kind: KubernetesCluster
  25. # listKind
  26. listKind: KubernetesClusterList
  27. # shortNames allow shorter string to match your resource on the CLI
  28. shortNames:
  29. - ecs
  30. #CRD 对象
  31. apiVersion: ecs.yun.com/v1
  32. kind: KubernetesCluster
  33. metadata:
  34. name: test-cluster
  35. spec:
  36. clusterType: kubernetes
  37. serviceCIDR: ''
  38. masterList:
  39. - ip: 192.168.1.10
  40. nodeList:
  41. - ip: 192.168.1.11
  42. privateSSHKey: ''
  43. scaleUp: 0
  44. 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)配置

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

**(2)查看文件 **

calico的yaml文件

  1. [root@k8s-master plugin]# vim calico.yaml
  2. ...
  3. ---
  4. apiVersion: apiextensions.k8s.io/v1
  5. kind: CustomResourceDefinition
  6. metadata:
  7. name: ippools.crd.projectcalico.org
  8. spec:
  9. ......
  10. ...
  11. [root@k8s-master plugin]# kubectl get CustomResourceDefinition
  12. NAME CREATED AT
  13. bgpconfigurations.crd.projectcalico.org 2022-08-25T14:33:24Z
  14. bgppeers.crd.projectcalico.org 2022-08-25T14:33:24Z
  15. blockaffinities.crd.projectcalico.org 2022-08-25T14:33:24Z
  16. clusterinformations.crd.projectcalico.org 2022-08-25T14:33:24Z
  17. felixconfigurations.crd.projectcalico.org 2022-08-25T14:33:24Z
  18. globalnetworkpolicies.crd.projectcalico.org 2022-08-25T14:33:24Z
  19. globalnetworksets.crd.projectcalico.org 2022-08-25T14:33:24Z
  20. hostendpoints.crd.projectcalico.org 2022-08-25T14:33:24Z
  21. ipamblocks.crd.projectcalico.org 2022-08-25T14:33:24Z
  22. ipamconfigs.crd.projectcalico.org 2022-08-25T14:33:24Z
  23. ipamhandles.crd.projectcalico.org 2022-08-25T14:33:24Z
  24. ippools.crd.projectcalico.org 2022-08-25T14:33:24Z
  25. kubecontrollersconfigurations.crd.projectcalico.org 2022-08-25T14:33:24Z
  26. networkpolicies.crd.projectcalico.org 2022-08-25T14:33:24Z
  27. networksets.crd.projectcalico.org 2022-08-25T14:33:24Z

(3)自定义CRD模型

  1. [root@k8s-master crd]# cat user-cr-demo.yaml
  2. apiVersion: auth.ilinux.io/v1alpha1
  3. kind: User
  4. metadata:
  5. name: admin
  6. namespace: default
  7. spec:
  8. userID: 1
  9. email: test@test.com
  10. groups:
  11. - superusers
  12. - adminstrators
  13. password: ikubernetes.io
  14. [root@k8s-master crd]# kubectl apply -f user-cr-demo.yaml
  15. user.auth.ilinux.io/admin created
  16. [root@k8s-master crd]# kubectl get User
  17. NAME AGE
  18. admin 14s
  19. [root@k8s-master ~]# kubectl describe User admin
  20. Name: admin
  21. Namespace: default
  22. Labels: <none>
  23. Annotations: <none>
  24. API Version: auth.ilinux.io/v1alpha1
  25. Kind: User
  26. Metadata:
  27. Creation Timestamp: 2022-09-25T14:51:53Z
  28. Generation: 1
  29. Managed Fields:
  30. API Version: auth.ilinux.io/v1alpha1
  31. Fields Type: FieldsV1
  32. fieldsV1:
  33. f:metadata:
  34. f:annotations:
  35. .:
  36. f:kubectl.kubernetes.io/last-applied-configuration:
  37. f:spec:
  38. .:
  39. f:email:
  40. f:groups:
  41. f:password:
  42. f:userID:
  43. Manager: kubectl-client-side-apply
  44. Operation: Update
  45. Time: 2022-09-25T14:51:53Z
  46. Resource Version: 2583010
  47. Self Link: /apis/auth.ilinux.io/v1alpha1/namespaces/default/users/admin
  48. UID: 5af89454-e067-4f30-83b7-cc2ad82e3526
  49. Spec:
  50. Email: test@test.com
  51. Groups:
  52. superusers
  53. adminstrators
  54. Password: ikubernetes.io
  55. User ID: 1
  56. Events: <none>

本文转载自: https://blog.csdn.net/weixin_50481708/article/details/127033146
版权归原作者 跳楼梯企鹅 所有, 如有侵权,请联系我们删除。

“【云原生】学习K8s的扩展技能(CRD)”的评论:

还没有评论