【云原生】学习K8s的扩展技能(CRD)_crd k8s
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
博主昵称跳楼梯企鹅
博主主页面链接博主主页传送门博主专栏页面连接专栏传送门--网路安全技术
创作初心本博客的初心为与技术朋友们相互交流每个人的技术都存在短板博主也是一样虚心求教希望各位技术友给予指导。
博主座右铭发现光追随光成为光散发光;
博主研究方向渗透测试、机器学习 ;
博主寄语感谢各位技术友的支持您的支持就是我前进的动力 ;
目录
一、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+1
个Service
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>