博主昵称:跳楼梯企鹅
博主主页面链接:博主主页传送门博主专栏页面连接:专栏传送门--网路安全技术
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,希望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
目录
一、CRD 扩展 Kubernetes 集群
1.什么是 CRD
CRD 本身是一种 Kubernetes 内置的资源类型,是 CustomResourceDefinition 的缩写,可以通过
kubectlget
命令查看集群内定义的 CRD 资源。
$kubectl get crdNAME CREATED ATapps.app.my.cn 2022-09-25T07:02:47Zmicroservices.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+1
个Service
(2)创建 Yaml 配置
apiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata: creationTimestamp: null labels: controller-tools.k8s.io: "1.0" # 名称必须与下面的spec字段匹配,格式为: . name: apps.app.o0w0o.cnspec: # 用于REST API的组名称: /apis// group: app.o0w0o.cn names: # kind字段使用驼峰命名规则. 资源清单使用如此 kind: App # URL中使用的复数名称: /apis/// 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/v1beta1kind: CustomResourceDefinitionmetadata: # name must match the spec fields below, and be in the form: . name: kubernetesclusters.ecs.yun.comspec: # group name to use for REST API: /apis// 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/// 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/v1kind: KubernetesClustermetadata: name: test-clusterspec: 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 #资源名称spec: conversion
(2)查看文件
calico的yaml文件
[root@k8s-master plugin]# vim calico.yaml ...---apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata: name: ippools.crd.projectcalico.orgspec:.........[root@k8s-master plugin]# kubectl get CustomResourceDefinitionNAME CREATED ATbgpconfigurations.crd.projectcalico.org 2022-08-25T14:33:24Zbgppeers.crd.projectcalico.org 2022-08-25T14:33:24Zblockaffinities.crd.projectcalico.org 2022-08-25T14:33:24Zclusterinformations.crd.projectcalico.org 2022-08-25T14:33:24Zfelixconfigurations.crd.projectcalico.org 2022-08-25T14:33:24Zglobalnetworkpolicies.crd.projectcalico.org 2022-08-25T14:33:24Zglobalnetworksets.crd.projectcalico.org 2022-08-25T14:33:24Zhostendpoints.crd.projectcalico.org 2022-08-25T14:33:24Zipamblocks.crd.projectcalico.org 2022-08-25T14:33:24Zipamconfigs.crd.projectcalico.org 2022-08-25T14:33:24Zipamhandles.crd.projectcalico.org 2022-08-25T14:33:24Zippools.crd.projectcalico.org 2022-08-25T14:33:24Zkubecontrollersconfigurations.crd.projectcalico.org 2022-08-25T14:33:24Znetworkpolicies.crd.projectcalico.org 2022-08-25T14:33:24Znetworksets.crd.projectcalico.org 2022-08-25T14:33:24Z
(3)自定义CRD模型
[root@k8s-master crd]# cat user-cr-demo.yaml apiVersion: auth.ilinux.io/v1alpha1kind: Usermetadata: name: admin namespace: defaultspec: 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 UserNAME AGEadmin 14s[root@k8s-master ~]# kubectl describe User adminName: adminNamespace: defaultLabels: Annotations: API Version: auth.ilinux.io/v1alpha1Kind: UserMetadata: 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-cc2ad82e3526Spec: Email: test@test.com Groups: superusers adminstrators Password: ikubernetes.io User ID: 1Events:
来源地址:https://blog.csdn.net/weixin_50481708/article/details/127033146