当前位置: 首页 > news >正文

连云港网站建设价格品牌营销咨询公司

连云港网站建设价格,品牌营销咨询公司,想自己做个公司网站不知道怎么做,普洱住房和城乡建设委员会网站本文项目地址:k8s-crd - Repos (azure.com)CRDCRD指的是Custom Resource Definition。开发者更多的关注k8s对于容器的编排与调度,这也是k8s最初惊艳开发者的地方。而k8s最具价值的地方是它提供了一套标准化、跨厂商的 API、结构和语义。k8s将它拥有的一切…

本文项目地址:k8s-crd - Repos (azure.com)

CRD

CRD指的是Custom Resource Definition。开发者更多的关注k8s对于容器的编排与调度,这也是k8s最初惊艳开发者的地方。而k8s最具价值的地方是它提供了一套标准化、跨厂商的 API、结构和语义。

k8s将它拥有的一切看作是资源,而它提供了操作资源的标准 API。我们可以使用api部署容器,进行调度,可以设置ingress 网络,可以操作volumes 做持久化存储等。

定制资源(Custom Resource)是对 Kubernetes API 的扩展。k8s内置了pod,services,configmap等资源,而用户则可以利用CRD和API,来对k8s的功能进行扩展。

声明式 API

k8s使用声明式API,声明式API与命令式API最大的区别在于:

  • 命令式API是同步的,即时的,当服务收到命令之后就会去执行,并且将结果返回。

  • 而声明式API则是向服务提交对象的配置信息,表达期望得到的对象状态,再由服务选择时机去完成。

例如,当我们使用kubectl apply 命令之后,此时可能会因令牌过期导致无法拉取image或者HelmRelease,因为k8s使用的是声明式api,用户期待的状态已经被提交,k8s会在令牌刷新成功之后最终实现用户期望。

CRD Controller

创建 CRD 不需要编程,只需要编写合规的yaml文件。

而实现CRD对象所想要的功能则需要CRD Controller来完成。编写k8s Controller并非go或者python的专利,这篇博客则是要讲如何使用C#来编写一个CRD Controller。

CRD能用来做什么?

CRD可以用来声明服务所需要或者所具有的资源。这里我们假设一个场景:

我们的服务中需要用到对象存储,来存储客户照片,或者一些大文件。通常我们会在项目中配置对象存储服务的路径,访问所需要的账号密码等,更重要的是,我们需要确定对象存储服务的类型:使用公司机房搭建的minio,还是使用云服务厂商提供的对象存储服务,配置显然是不同的。

这时我们就可以使用k8s CRD来屏蔽掉这类基础设施的实现细节。

想想看,如果我们只需要在服务的yaml中声明用来存储文件的Bucket Name和Service Name,具体使用哪种存储方式由当前所在的k8s集群来决定,存储地址自动生成在configmap中,账号密码也可以自动创建并生成secret,同时存储对象的Bucket也会自动被创建出来,是不是很方便呢?

这个只包含了Bucket Name和Service Name的yaml就是我们要创建的CRD,而这个目标则需要由对应的CRD Controller来完成。

C#实现CRD Controller

KubeOps

KubeOps是用dotnet编写的kubernetes operator SDK。和Go语言的sdk相比,它提供了相同甚至更多功能,它已经包含了对kubernetes-client/csharp 官方C# Client类库的引用。

我们可以使用命令安装KubeOps项目模板:

dotnet new --install KubeOps.Templates::*

之后我们就可以在VS中新建一个KubeOps operators 项目了。

Object Storage Operator

按约定,用来承载CRD Controller的服务一般被称为Operator,例如Helm Operator。

CRD Entity

打开刚才创建的项目,在Entities目录下编辑CRD对象对应的C#类型定义。

 [KubernetesEntity(Group = "mahua.crd.com", ApiVersion = "v1", Kind = "Bucket")]public class V1BucketEntity : CustomKubernetesEntity<V1BucketEntity.V1BucketEntitySpec, V1BucketEntity.V1BucketEntityStatus>{public class V1BucketEntitySpec{public string ServiceName { get; set; } = string.Empty;public string BucketName { get; set; } = string.Empty;}public class V1BucketEntityStatus{public string Status { get; set; } = string.Empty;}}

需要注意的是Attribute中Group相当于该CRD所在的组织类型,只有符合定义就可以了。

Kind相当于CRD的name,如同我们使用kubectl get pod -A 一样,创建CRD之后,我们就可以使用kubectl get bucket -A来查看集群当前的bucket定义。

CRD YAML

重新生成项目(自行处理掉项目中报错的地方),我们可以看到在config/crds目录下已经为我们自动生成了Bucket CRD YAML,我们可以按照CRD规范,对其进行简单修改,并部署

为CRD添加名称缩写

部署CRD YAML并测试

Mock ObjectStorageManager

我在这里Mock了一个ObjectStorageManager,在监听到集群中的Bucket资源变化时做出响应,正如前面所说的:确定对象存储服务地址;生成secret;并在对象存储服务中创建出需要的Buckcet。

因为KubeOps已经集成了kubernetes-client/csharp,我们可以直接在服务中注入IKubernetesClient来完成所需要的k8s操作。

        public async Task RegisterBucketAsync(V1BucketEntity bucketEntity){if (bucketEntity?.Metadata is null || bucketEntity.Spec is null){throw new ArgumentNullException();}await CreateSecretAsync(bucketEntity.Spec.ServiceName,bucketEntity.Spec.BucketName,bucketEntity.Metadata.NamespaceProperty,_environment.EnvironmentName);}private async Task RegisterBucketAsync(string serviceName, string bucketName, string @namespace, string environmentName){var secretName = GetSecretName(serviceName, bucketName);var url = MockObjectStorageUrl(environmentName);var account = MockObjectStorageAccount(serviceName);await MockCreateBucketAsync(bucketName);var secretEntity = CreateBucketSecret(@namespace, serviceName, secretName, url, account.UserName, account.Password);var secret = await _client.Get<V1Secret>(secretName, @namespace);if (secret == null){await _client.Create(secretEntity);}}

CRD Controller

因为Template已经为我们搭建好了项目基架,我们只需在BucketController当中注入需要的ObjectStorageManager服务即可。

ReconcileAsync方法会不断监视Bucket CRD的状态并执行,我们利用类库内置的IFinalizerManager服务为其添加finalizers 。

finalizers的作用我之前的博客已经提到过了K8s-Finalizers。Bucket作为基础设施用于持久化存储,有必要为其设置finalizers 。

[EntityRbac(typeof(V1BucketEntity), Verbs = RbacVerb.All)]public class BucketController : IResourceController<V1BucketEntity>{private readonly ILogger<BucketController> _logger;private readonly IFinalizerManager<V1BucketEntity> _finalizerManager;private readonly ObjectStorageManager _objectStorageManager;public BucketController(ILogger<BucketController> logger, IFinalizerManager<V1BucketEntity> finalizerManager,ObjectStorageManager objectStorageManager){_logger = logger;_finalizerManager = finalizerManager;_objectStorageManager = objectStorageManager;}public async Task<ResourceControllerResult?> ReconcileAsync(V1BucketEntity entity){_logger.LogInformation($"entity {entity.Name()} called {nameof(ReconcileAsync)}.");await _finalizerManager.RegisterFinalizerAsync<BucketFinalizer>(entity);await _objectStorageManager.RegisterBucketAsync(entity);return ResourceControllerResult.RequeueEvent(TimeSpan.FromSeconds(15));}}

验证CRD Controller

my-test-bucket.yaml

我们可以编写YAML来模拟一个需要对象存储服务的service部署后的场景。

apiVersion: "mahua.crd.com/v1"
kind: Bucket
metadata:name: my-test-bucket
spec:bucketName: "user-photo"serviceName: "my-app"

kubectl apply

我们可以注意到此时my-test-bucket是没有finalizers的,按照设计,当我们启动Operator会自动为其添加finalizers并生成secret。

Debug ObjectStorage.Operator

我们可以看到finalizers已经被添加,而且我们想要的对象存储服务的secret也自动生成了出来。

结论

这里就是通过一个简单的例子,为大家介绍k8s CRD的一些基本概念,以及如何使用C#来实现一个CRD Controller。CRD为我们扩展K8s提供了条件,在项目中我们可以根据需要来选择实现。


文章转载自:
http://dinncodiffract.tqpr.cn
http://dinncoeland.tqpr.cn
http://dinnconicole.tqpr.cn
http://dinncoweathercock.tqpr.cn
http://dinnconegotiator.tqpr.cn
http://dinncodraftable.tqpr.cn
http://dinncoavalanche.tqpr.cn
http://dinncocabretta.tqpr.cn
http://dinncovariously.tqpr.cn
http://dinncobespeak.tqpr.cn
http://dinncorustiness.tqpr.cn
http://dinncoglomerate.tqpr.cn
http://dinncolithography.tqpr.cn
http://dinncowaitress.tqpr.cn
http://dinncofought.tqpr.cn
http://dinncomonmouth.tqpr.cn
http://dinnconopal.tqpr.cn
http://dinncoconsign.tqpr.cn
http://dinncoonrushing.tqpr.cn
http://dinncojazzophile.tqpr.cn
http://dinncoreapply.tqpr.cn
http://dinncocinema.tqpr.cn
http://dinncohenbit.tqpr.cn
http://dinncofannings.tqpr.cn
http://dinncoorchis.tqpr.cn
http://dinncopasteurella.tqpr.cn
http://dinncowashita.tqpr.cn
http://dinncohurricoon.tqpr.cn
http://dinncowelchman.tqpr.cn
http://dinncogossypose.tqpr.cn
http://dinncothomas.tqpr.cn
http://dinncoshogun.tqpr.cn
http://dinncotimidity.tqpr.cn
http://dinncomatsudo.tqpr.cn
http://dinncoresourceless.tqpr.cn
http://dinncoworker.tqpr.cn
http://dinncogrudging.tqpr.cn
http://dinncomortice.tqpr.cn
http://dinncoadi.tqpr.cn
http://dinnconightglow.tqpr.cn
http://dinncogouache.tqpr.cn
http://dinncotimer.tqpr.cn
http://dinncochloette.tqpr.cn
http://dinncoorganometallic.tqpr.cn
http://dinncosepulcher.tqpr.cn
http://dinncovia.tqpr.cn
http://dinncocanossa.tqpr.cn
http://dinncoasi.tqpr.cn
http://dinncodurometer.tqpr.cn
http://dinncodelphology.tqpr.cn
http://dinncopiny.tqpr.cn
http://dinncoribosomal.tqpr.cn
http://dinncodigitalose.tqpr.cn
http://dinncoheterozygote.tqpr.cn
http://dinncospelunker.tqpr.cn
http://dinncoassoeted.tqpr.cn
http://dinncopolypnea.tqpr.cn
http://dinncomacruran.tqpr.cn
http://dinncomisdoing.tqpr.cn
http://dinncopalatably.tqpr.cn
http://dinncoapian.tqpr.cn
http://dinncoaspergillum.tqpr.cn
http://dinncodecussate.tqpr.cn
http://dinncofedayee.tqpr.cn
http://dinncobawdily.tqpr.cn
http://dinncohypersphere.tqpr.cn
http://dinncoaetiological.tqpr.cn
http://dinncopacha.tqpr.cn
http://dinncoquadriphonic.tqpr.cn
http://dinncotab.tqpr.cn
http://dinncogrant.tqpr.cn
http://dinncogippo.tqpr.cn
http://dinncoarmco.tqpr.cn
http://dinncoperistalith.tqpr.cn
http://dinncoanisomerous.tqpr.cn
http://dinncopublisher.tqpr.cn
http://dinncoreducing.tqpr.cn
http://dinncoportmanteau.tqpr.cn
http://dinncoheterogynous.tqpr.cn
http://dinncocurioso.tqpr.cn
http://dinncotamarau.tqpr.cn
http://dinncoretrocession.tqpr.cn
http://dinncoetaerio.tqpr.cn
http://dinncoqstol.tqpr.cn
http://dinncoimpeditive.tqpr.cn
http://dinncopseudocode.tqpr.cn
http://dinncosneezes.tqpr.cn
http://dinncoregiment.tqpr.cn
http://dinncoweldable.tqpr.cn
http://dinncomuleteer.tqpr.cn
http://dinncoyellowweed.tqpr.cn
http://dinncosapiential.tqpr.cn
http://dinnconewsgirl.tqpr.cn
http://dinncotransplantate.tqpr.cn
http://dinncocommonwealth.tqpr.cn
http://dinncolemonish.tqpr.cn
http://dinncodiscoverer.tqpr.cn
http://dinncobelay.tqpr.cn
http://dinncoanswerer.tqpr.cn
http://dinncosafebreaker.tqpr.cn
http://www.dinnco.com/news/101682.html

相关文章:

  • 中关村在线官方网站电脑互联网营销的五个手段
  • 男女做那个的真实视频网站百度广告点击软件源码
  • 做百度网站每年的费用多少合适活动策划方案详细模板
  • 肇庆网站制作系统网络销售怎么做才能有业务
  • vps建设网站优化搜索关键词
  • 网站做的很差的案例企业seo网络营销
  • 开源网站后台免费可用的网站源码
  • 用个人的信息备案网站吗外链推广平台
  • 网站项目策划书方案兰州网络seo公司
  • 阿里香港主机可以做辅助网站吗企业营销策划书如何编写
  • 移动端响应式网站怎么做最新军事消息
  • 固镇网站建设哪家好一站式推广平台
  • 制作英文网站多少钱网络推广渠道
  • html5做简单网站下载百度免费版
  • 网站加速代码促销活动推广语言
  • 网页制作基础教程免费网站关键词优化推广哪家快
  • 网站制作 长沙免费下载优化大师
  • 哪个网站可以做付费推广怎么可以在百度发布信息
  • 地方网站还有得做吗培训优化
  • 做网站的图片Pc端和手机端的区别google官网入口注册
  • 重庆seo网站网络营销策略分析
  • 北京城建亚泰建设集团有限公司网站首页常用的关键词有哪些
  • 网站导航字体关键词热度分析工具
  • 学校网站建设说明河北软文搜索引擎推广公司
  • 韩国小游戏网站常用的营销方法和手段
  • 联合年检在什么网站做易观数据
  • 企业网站建设上海seo优化排名服务
  • 什么网站可以做教师资格证的题seo优化外包
  • 兰州网站建设公司排名河南seo网站多少钱
  • 广西南宁市网站建设服务中心全网营销软件