文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

有状态部署慢?使用 openkruise 实现容器应用固定ID

2024-12-24 17:10

关注

背景说明

我们在业务上容器的过程中遇到了如下问题:

  1. 以 deployment 部署的应用 pod,由于 id 经常变更,服务重启,监控变得难以维护。这里只是以监控为切入点,事实上,还有诸多应用需要与id强绑定。
  2. statefulset 可以解决上面的问题,但是引入一个新的问题就是 statefulset 本身为了维护有状态的应用,所有的应用 Pod 启动是有严格的先后顺序,也就是串行启动,对于大规模的应用 pod 来讲,启动消耗时间太长,这是无法忍受的。

为解决以上问题,我们在容器平台当中引入了 openkruise。

openkruise简介

项目地址:https://github.com/openkruise/kruise

详细的说明可以参考这篇文章:

https://yq.aliyun.com/articles/706442

从当前 github 上的文档来看,目前 OpenKruise 支持五种改进的控制器:

UnitedDeployment 是在 StatefulSet 基础上的更高级抽象,通过一个资源描述可以管理多个 StatefulSet 的实例组,可实现多实例组的灰度发布与滚动升级。

Broadcast Job 实际上就是以 DaemonSet 的方式在所有节点上运行一次性 Job,SidercarSet 用于 Sidercar 注入及管理。

而我们要使用到的正是其 Advanced StatefulSet 的特性。关于Advanced StatefulSet更详细的描述如下:

在kubernetes官方的statefulSet上做了功能扩展,更新策略由原来的只支持recreate,扩展为同时支持recreate和rollingupdate。rollingupdate还支持两种策略,一种是InPlaceIfPossible,另一种是InPlaceOnly。InPlaceIfPossible会尽可能的保证应用在原地升级(只支持镜像的升级,如果修改了yaml中的其他配置项,则无法保证);InPlaceOnly会保证应用一定在原地升级,但是它也只支持镜像的升级,如果修改了yaml中的其他配置项,会直接抛出异常。另外,原生的StatefulSet只能做到串行启动,Advanced StatefulSet可以做到并行启动。

部署openkruise

官方的安装文档可以直接参考这里:

https://github.com/openkruise/kruise/tree/master/docs/tutorial

我简单写下安装步骤:

  1. wget https://github.com/openkruise/kruise/releases/download/v0.4.0/kruise-chart.tgz 
  2.  
  3. tar xf kruise-chart.tgz 
  4.  
  5. cd kruise 
  6.  
  7. helm install openkruise ./ -n kube-system 

目前openkruise已经更新到了v0.5.0的版本。也可以直接通过阿里云的应用目录来完成其安装。

下面说一下更详细的安装过程:

获取helm包

  1. helm repo add incubator http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/app/charts-incubator/ 
  2.  
  3. helm search repo ack-kruise 
  4.  
  5. helm fetch incubator/ack-kruise 
  6.  
  7. tar xf ack-kruise-0.5.0.tgz 
  8.  
  9. cd ack-kruise 

修改values.yml文件如下:

  1. # Default values for kruise. 
  2.  
  3. revisionHistoryLimit: 3 
  4.  
  5. manager: 
  6.  
  7. # settings for log print 
  8.  
  9. log: 
  10.  
  11. # log level for kruise-manager 
  12.  
  13. level: "4" 
  14.  
  15. # image settings 
  16.  
  17. image: 
  18.  
  19. # repository for kruise-manager image 
  20.  
  21. repository: hub.example.com/library/kruise-manager 
  22.  
  23. # tag for kruise-manager image 
  24.  
  25. tag: v0.5.0 
  26.  
  27. # resources of kruise-manager container 
  28.  
  29. resources: 
  30.  
  31. limits: 
  32.  
  33. cpu: 500m 
  34.  
  35. memory: 1Gi 
  36.  
  37. requests: 
  38.  
  39. cpu: 500m 
  40.  
  41. memory: 1Gi 
  42.  
  43. metrics: 
  44.  
  45. addr: localhost 
  46.  
  47. port: 8080 
  48.  
  49. custom_resource_enable: StatefulSet 

其实这里就改了两个东西:

然后执行安装操作:

  1. helm install ack-kruise -n kube-system ./ 

安装完后,会生成以下五种crd:

  1. # kubectl get crds |grep kruise 
  2.  
  3. broadcastjobs.apps.kruise.io 2020-04-26T10:29:28Z 
  4.  
  5. clonesets.apps.kruise.io 2020-04-26T10:29:28Z 
  6.  
  7. sidecarsets.apps.kruise.io 2020-04-26T10:29:28Z 
  8.  
  9. statefulsets.apps.kruise.io 2020-04-26T10:29:28Z 
  10.  
  11. uniteddeployments.apps.kruise.io 2020-04-26T10:29:28Z 

同时会创建一个 kruise-system 的命名空间,并在里面生成一个 pod:

  1. # kubectl get pods -n kruise-system 
  2.  
  3. NAME READY STATUS RESTARTS AGE 
  4.  
  5. kruise-controller-manager-0 1/1 Running 0 55m 

验证 statefulset 资源的 webhook 是否被正常创建:

  1. # kubectl get mutatingwebhookconfiguration -o yaml 
  2.  
  3. apiVersion: v1 
  4.  
  5. items: 
  6.  
  7. - apiVersion: admissionregistration.k8s.io/v1 
  8.  
  9. kind: MutatingWebhookConfiguration 
  10.  
  11. metadata: 
  12.  
  13. creationTimestamp: "2020-04-26T10:29:28Z" 
  14.  
  15. generation: 3 
  16.  
  17. name: kruise-mutating-webhook-configuration 
  18.  
  19. resourceVersion: "622944921" 
  20.  
  21. selfLink: /apis/admissionregistration.k8s.io/v1/mutatingwebhookconfigurations/kruise-mutating-webhook-configuration 
  22.  
  23. uid: 303a7b7f-3a62-49d7-8ef6-082ea288eeb2 
  24.  
  25. webhooks: 
  26.  
  27. - admissionReviewVersions: 
  28.  
  29. - v1beta1 
  30.  
  31. clientConfig: 
  32.  
  33. caBundle: xxxxx 
  34.  
  35. service: 
  36.  
  37. name: kruise-webhook-server-service 
  38.  
  39. namespace: kruise-system 
  40.  
  41. path: /mutating-create-update-statefulset 
  42.  
  43. port: 443 
  44.  
  45. failurePolicy: Fail 
  46.  
  47. matchPolicy: Exact 
  48.  
  49. name: mutating-create-update-statefulset.kruise.io 
  50.  
  51. namespaceSelector: 
  52.  
  53. matchExpressions: 
  54.  
  55. - key: control-plane 
  56.  
  57. operator: DoesNotExist 
  58.  
  59. objectSelector: {} 
  60.  
  61. reinvocationPolicy: Never 
  62.  
  63. rules: 
  64.  
  65. - apiGroups: 
  66.  
  67. - apps.kruise.io 
  68.  
  69. apiVersions: 
  70.  
  71. - v1alpha1 
  72.  
  73. operations: 
  74.  
  75. - CREATE 
  76.  
  77. - UPDATE 
  78.  
  79. resources: 
  80.  
  81. - statefulsets 
  82.  
  83. scope: '*' 
  84.  
  85. sideEffects: Unknown 
  86.  
  87. timeoutSeconds: 30 
  88.  
  89. ...... 

也是确保其他未用到的相关 mutatingwebhook 是关闭的。。在实际测试中,SidecarSet 资源的 mutatingwebhook 可能会导致创建的 pod 出不来。

这些webhook本质上都是kubernetes的admissioncontrol,只要你安装了,哪怕没有使用,当你在执行相关操作时,都需要被所有的adminssioncontrol检测,如果admissioncontrol本身出了问题,就会导致请求无法响应的状态。同时这些webhook类型的adminssioncontrol也会拖慢响应速度。

用法示例

下面是官方提供的一个基于 openkruise 提供的 statefulset 资源的部署文件示例:

  1. apiVersion: apps.kruise.io/v1alpha1 
  2.  
  3. kind: StatefulSet 
  4.  
  5. metadata: 
  6.  
  7. name: demo-v1-guestbook-kruise 
  8.  
  9. labels: 
  10.  
  11. app.kubernetes.io/name: guestbook-kruise 
  12.  
  13. app.kubernetes.io/instance: demo-v1 
  14.  
  15. spec: 
  16.  
  17. replicas: 3 
  18.  
  19. serviceName: demo-v1-guestbook-kruise 
  20.  
  21. selector: 
  22.  
  23. matchLabels: 
  24.  
  25. app.kubernetes.io/name: guestbook-kruise 
  26.  
  27. app.kubernetes.io/instance: demo-v1 
  28.  
  29. template: 
  30.  
  31. metadata: 
  32.  
  33. labels: 
  34.  
  35. app.kubernetes.io/name: guestbook-kruise 
  36.  
  37. app.kubernetes.io/instance: demo-v1 
  38.  
  39. spec: 
  40.  
  41. readinessGates: 
  42.  
  43. # A new condition that ensures the pod remains at NotReady state while the in-place update is happening 
  44.  
  45. - conditionType: InPlaceUpdateReady 
  46.  
  47. containers: 
  48.  
  49. - name: guestbook-kruise 
  50.  
  51. image: openkruise/guestbook:v1 
  52.  
  53. imagePullPolicy: Always 
  54.  
  55. ports: 
  56.  
  57. - name: http-server 
  58.  
  59. containerPort: 3000 
  60.  
  61. podManagementPolicy: Parallel # allow parallel updates, works together with maxUnavailable 
  62.  
  63. updateStrategy: 
  64.  
  65. type: RollingUpdate 
  66.  
  67. rollingUpdate: 
  68.  
  69. # Do in-place update if possible, currently only image update is supported for in-place update 
  70.  
  71. podUpdatePolicy: InPlaceIfPossible 
  72.  
  73. # Allow parallel updates with max number of unavailable instances equals to 2 
  74.  
  75. maxUnavailable: 3 

执行部署之后,启动 pod 示例如下:

  1. # kubectl get pods |grep demo-v1 
  2.  
  3. demo-v1-guestbook-kruise-0 1/1 Running 0 62s 
  4.  
  5. demo-v1-guestbook-kruise-1 1/1 Running 0 62s 
  6.  
  7. demo-v1-guestbook-kruise-2 1/1 Running 0 62s 

也可通过如下操作查看资源状态:

  1. # kubectl get sts.apps.kruise.io 
  2.  
  3. NAME DESIRED CURRENT UPDATED READY AGE 
  4.  
  5. demo-v1-guestbook-kruise 3 3 3 3 56s 
  6.  
  7. openkruise提供的statefulset的资源名为sts.apps.kruise.io 

更详细的用法可参考:

Advanced StatefulSet具体的使用方法:https://github.com/openkruise/kruise/blob/master/docs/concepts/astatefulset/README.md

Advanced StatefulSet示例文件:https://github.com/openkruise/kruise/blob/master/docs/tutorial/v1/guestbook-statefulset.yaml

UnitedDeployment具体的使用方法:https://github.com/openkruise/kruise/blob/master/docs/tutorial/uniteddeployment.md

UnitedDeployment示例文件:https://raw.githubusercontent.com/kruiseio/kruise/master/docs/tutorial/v1/uniteddeployment.yaml

 

 

来源:高效运维内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯