tnblog
首页
视频
资源
登录

Kubernetes .Net6 CRD

5198人阅读 2022/8/10 22:24 总访问:3527613 评论:0 收藏:0 手机
分类: 容器编排

Kubernetes

Kubernetes .Net6 CRD

CRD介绍


简单来说就是自定义资源,像Pod、Service、Deployment一样。
创建自定义资源的资源类型为:CustomResourceDefinition

简单示范


我们通过一个Demo来进行简单的示例与创建。
编辑croncustomresource.yaml文件,内容如下:

  1. apiVersion: apiextensions.k8s.io/v1
  2. kind: CustomResourceDefinition
  3. metadata:
  4. # 名字必需与下面的 spec 字段匹配,并且格式为 '<名称的复数形式>.<组名>'
  5. name: crontabs.stable.example.com
  6. spec:
  7. # 组名称,用于 REST API: /apis/<组>/<版本>
  8. group: stable.example.com
  9. # 列举此 CustomResourceDefinition 所支持的版本
  10. versions:
  11. # 版本名称,如v1、v1alpha3等
  12. - name: v1
  13. # 是否启用
  14. served: true
  15. # 是否进行存储
  16. storage: true
  17. schema:
  18. openAPIV3Schema:
  19. type: object
  20. properties:
  21. spec:
  22. # 定义spec为object类型的字段
  23. type: object
  24. properties:
  25. # 定义需要的字段
  26. cronSpec:
  27. type: string
  28. image:
  29. type: string
  30. replicas:
  31. type: integer
  32. # API生效范围,可以是 Namespaced 或 Cluster
  33. scope: Namespaced
  34. names:
  35. # 名称的复数形式,要求全部小写,用于 URL:/apis/<组>/<版本>/<名称的复数形式>
  36. plural: crontabs
  37. # 名称的单数形式,也要小写,作为命令行使用时和显示时的别名
  38. singular: crontab
  39. # kind CRD的资源名称类型
  40. kind: CronTab
  41. # 缩写形式的名称,小写。
  42. shortNames:
  43. - ct


接着我们来创建该自定义资源。

  1. kubectl apply -f croncustomresource.yaml


创建一个我们自定义的CronTab资源。

  1. vim cron.yaml
  1. apiVersion: "stable.example.com/v1"
  2. kind: CronTab
  3. metadata:
  4. name: my-new-cron-object
  5. spec:
  6. cronSpec: "* * * * */5"
  7. image: my-awesome-cron-image
  8. replicas: 3
  1. kubectl apply -f cron.yaml
  2. # 查看资源
  3. kubectl get ct


然后我们可以删除掉我们自定义的资源。

  1. kubectl delete -f croncustomresource.yaml
  2. kubectl get ct


当然我们还可以对指定的字段进行验证值规则,与设计默认值。
举例:
设置cronSpec字段值必须为时间规则,默认为5 0 * * *
设置replicas字段值必须为1-10区间,且默认值为1;

  1. cronSpec:
  2. type: string
  3. pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
  4. default: "5 0 * * *"
  5. image:
  6. type: string
  7. replicas:
  8. type: integer
  9. minimum: 1
  10. maximum: 10
  11. default: 1

Scale 子资源


从kubernetes 1.11+开始,在CRD的定义中引入了名为subresources的配置,可以设置的选项包括status和scale两类。

字段 描述
status 启动/status路径,其值来自CRD的.status字段,要求CRD控制器能够设置和更新这个字段的值。
scale 启动/scale路径,支持通过其他Kubernetes控制器(如HorizontalPodAutoscaler控制器)与CRD资源对象实例进行交互。用户通过 kubectl scale 命令也能对该CRD资源对象进行扩容或缩容操作,要求CRD本身支持多个副本的形式运行。


关于Scale子资源定义了以下字段:

字段 描述
specReplicasPath 指定我们定义的.spec.replicas字段。(必需定义)。/scale
statusReplicasPath 指定我们定义的.status.replicas字段。/status
labelSelectorPath 指定我们定义的.status.labelSelector字段。/status
  1. apiVersion: apiextensions.k8s.io/v1
  2. kind: CustomResourceDefinition
  3. metadata:
  4. name: crontabs.stable.example.com
  5. spec:
  6. group: stable.example.com
  7. versions:
  8. - name: v1
  9. served: true
  10. storage: true
  11. schema:
  12. openAPIV3Schema:
  13. type: object
  14. properties:
  15. spec:
  16. type: object
  17. properties:
  18. cronSpec:
  19. type: string
  20. image:
  21. type: string
  22. replicas:
  23. type: integer
  24. status:
  25. type: object
  26. properties:
  27. replicas:
  28. type: integer
  29. labelSelector:
  30. type: string
  31. # subresources 描述定制资源的子资源
  32. subresources:
  33. # status 启用 status 子资源
  34. status: {}
  35. # scale 启用 scale 子资源
  36. scale:
  37. # specReplicasPath 定义定制资源中对应 scale.spec.replicas 的 JSON 路径
  38. specReplicasPath: .spec.replicas
  39. # statusReplicasPath 定义定制资源中对应 scale.status.replicas 的 JSON 路径
  40. statusReplicasPath: .status.replicas
  41. # labelSelectorPath 定义定制资源中对应 scale.status.selector 的 JSON 路径
  42. labelSelectorPath: .status.labelSelector
  43. scope: Namespaced
  44. names:
  45. plural: crontabs
  46. singular: crontab
  47. kind: CronTab
  48. shortNames:
  49. - ct


创建自定义资源,与CronTab资源。

  1. kubectl apply -f croncustomresource.yaml
  2. kubectl apply -f cron.yaml
  3. kubectl get ct


通过API Endpoint查看资源对象的状态。

  1. # /apis/<api group 名称>/<版本>/namespaces/<名称空间>/<资源名称>/status
  2. curl https://172.30.1.2:6443/apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object/status \
  3. --cacert /etc/kubernetes/pki/ca.crt \
  4. --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt \
  5. --key /etc/kubernetes/pki/apiserver-kubelet-client.key


可通过使用kubectl scale命令对Pod的副本数量进行调整。

  1. # 查看当前副本数
  2. kubectl get ct my-new-cron-object -o yaml | grep "replicas:"
  3. # /apis/<api group 名称>/<版本>/namespaces/<名称空间>/<资源名称>/scaled
  4. # https://172.30.1.2:6443/apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object/scaled
  5. # 设置当前副本数为5
  6. kubectl scale crontab/my-new-cron-object --replicas=5
  7. kubectl get ct my-new-cron-object -o yaml | grep "replicas:"

显示多个列


我们发现这样查看副本数很不方便,我们可以通过在croncustomresource.yaml中定义additionalPrinterColumns字段。

  1. apiVersion: apiextensions.k8s.io/v1
  2. kind: CustomResourceDefinition
  3. metadata:
  4. name: crontabs.stable.example.com
  5. spec:
  6. group: stable.example.com
  7. versions:
  8. - name: v1
  9. served: true
  10. storage: true
  11. schema:
  12. openAPIV3Schema:
  13. type: object
  14. properties:
  15. spec:
  16. type: object
  17. properties:
  18. cronSpec:
  19. type: string
  20. image:
  21. type: string
  22. replicas:
  23. type: integer
  24. status:
  25. type: object
  26. properties:
  27. replicas:
  28. type: integer
  29. labelSelector:
  30. type: string
  31. subresources:
  32. status: {}
  33. scale:
  34. specReplicasPath: .spec.replicas
  35. statusReplicasPath: .status.replicas
  36. labelSelectorPath: .status.labelSelector
  37. additionalPrinterColumns:
  38. # Spec列显示cronSpec字段
  39. - name: Spec
  40. type: string
  41. description: The cron spec defining the interval a CronJob is run
  42. jsonPath: .spec.cronSpec
  43. # Replicas列显示replicas字段
  44. - name: Replicas
  45. type: integer
  46. description: The number of jobs launched by the CronJob
  47. jsonPath: .spec.replicas
  48. # Age列显示creationTimestamp时间字段,这个在创建资源的时候会产生
  49. - name: Age
  50. type: date
  51. jsonPath: .metadata.creationTimestamp
  52. scope: Namespaced
  53. names:
  54. plural: crontabs
  55. singular: crontab
  56. kind: CronTab
  57. shortNames:
  58. - ct


更新我们的自定义的CRD资源。

  1. kubectl apply -f croncustomresource.yaml
  2. # 查看ct
  3. kubectl get ct

.net crd资源的实现

实现目标


我们想通过CRD定义自己的CSharpApp资源,通过编写代码,直接让其执行。
具体请查看下图所示:


关于管理CSharpApp资源的服务器我们可以运行在本地,也可以运行在服务器上。总之它有管理的权限就可以了,kubeconfig啊、ServiceAccount…等
这是Common sense。
那我们管理CSharpApp资源的服务器通过监控自定义资源的事件来做不同的操作。代码的架构如下:


更多具体的请看代码地址(有注释):https://gitee.com/zuxiazijiahebo/k8s-plugs

部署CRD


创建crd.yaml文件,并执行如下命令。

  1. vim crd.yaml
  1. apiVersion: apiextensions.k8s.io/v1
  2. kind: CustomResourceDefinition
  3. metadata:
  4. name: csharpapps.k8s.jijiechen.com
  5. spec:
  6. group: k8s.jijiechen.com
  7. versions:
  8. - name: v1alpha1
  9. served: true
  10. storage: true
  11. schema:
  12. openAPIV3Schema:
  13. type: object
  14. description: "An application running csharp source"
  15. properties:
  16. spec:
  17. type: object
  18. required:
  19. - code
  20. properties:
  21. code:
  22. type: string
  23. replicas:
  24. type: integer
  25. format: int32
  26. service:
  27. type: object
  28. description: "Service properties when the application provides network services"
  29. properties:
  30. port:
  31. type: integer
  32. format: int32
  33. type:
  34. enum:
  35. - LoadBalancer
  36. - ClusterIP
  37. - NodePort
  38. type: string
  39. required:
  40. - port
  41. scope: Namespaced
  42. names:
  43. plural: csharpapps
  44. singular: csharpapp
  45. kind: CSharpApp
  46. shortNames:
  47. - csa
  1. kubectl apply -f crd.yaml


运行我们的项目,这里为了方便我就在本地进行运行了;如果你需要在pod上运行请注意需要授权运行,可参考如下定义的ServiceAccess(注意:需要添加serviceAccountName字段):

  1. kind: ServiceAccount
  2. apiVersion: v1
  3. metadata:
  4. name: csharpapp-pod
  5. namespace: 你的名称空间
  6. ---
  7. apiVersion: rbac.authorization.k8s.io/v1
  8. kind: RoleBinding
  9. metadata:
  10. name: csharpapp-pod-operator-role
  11. namespace: 你的名称空间
  12. roleRef:
  13. apiGroup: rbac.authorization.k8s.io
  14. kind: ClusterRole
  15. name: cluster-admin
  16. subjects:
  17. - kind: ServiceAccount
  18. name: csharpapp-pod
  19. namespace: 你的名称空间


本地运行

  1. dotnet run


关于我们创建的容器,并不直接是mcr.microsoft.com/dotnet/sdk:6.0,而是通过一定的封装的,其执行的内容就是创建web项目,并替换Program.cs然后运行。
相关Dockerfile和run.sh如下:

  1. FROM mcr.microsoft.com/dotnet/sdk:6.0
  2. COPY run.sh /run.sh
  3. ENTRYPOINT ["/bin/bash", "-f", "/run.sh"]
  1. #!/bin/bash
  2. SRC=/etc/cs-source/Program.cs
  3. if [ ! -f "$SRC" ]; then
  4. echo "No C# source file detected."
  5. echo 1
  6. fi
  7. WORK_DIR=/tmp/Proj$RANDOM
  8. mkdir -p $WORK_DIR
  9. cd $WORK_DIR
  10. dotnet new web
  11. cp $SRC $WORK_DIR/
  12. dotnet run

测试


接下来创建我们的测试console.yaml

  1. vim console.yaml
  1. apiVersion: k8s.jijiechen.com/v1alpha1
  2. kind: CSharpApp
  3. metadata:
  4. name: hello-console
  5. namespace: default
  6. spec:
  7. code: |
  8. Console.WriteLine("Hello world from CSharp App");
  9. Thread.Sleep(Timeout.Infinite);
  10. replicas: 2
  1. kubectl apply -f console.yaml
  2. kubectl get pod -w


由于我们的副本数量设置的是2,所以创建了两个pod,接下来我们查看其中一个pod的日志信息,发现已经将刚刚的代码给打印出来了。


我们创建web.yaml来创建web项目测试,将它发布的类型设置为LoadBalancer,你们可以设置为默认的ClusterService

  1. vim web.yaml
  1. apiVersion: k8s.jijiechen.com/v1alpha1
  2. kind: CSharpApp
  3. metadata:
  4. name: hello-web
  5. namespace: default
  6. spec:
  7. code: |
  8. var app = WebApplication.Create(args);
  9. app.MapGet("/", () => "Hello World!");
  10. app.Run("http://*:80");
  11. replicas: 2
  12. service:
  13. type: LoadBalancer
  14. port: 80
  1. kubectl apply -f web.yaml


由于我这里LoadBalancer没有进行配置,所以我们可以直接访问cluster-ip也是没问题的。


可以看到访问没有任何问题。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

asp.net主动推送百度seo

虽然可以使用百度提供的js自动推送,但是估计度娘还是希望主动推送一点。哈哈^_^,女孩子嘛大多都喜欢被动一点。publicclass...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...
这一世以无限游戏为使命!
排名
2
文章
644
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术