Kruise实战(1): 可以原地升级的Development CloneSet

397 阅读3分钟

概要

OpenKruise 是一个基于 Kubernetes 的扩展套件,主要聚焦于云原生应用的自动化,比如部署、发布、运维以及可用性防护。本文是跟随官方文档,使用Kruise的第一篇,CloneSet。

实战

安装

Kruise需要k8s的版本为1.16以上,支持helm一键安装:

$ helm repo add openkruise https://openkruise.github.io/charts/
$ helm repo update
$ helm install kruise openkruise/kruise --version 1.2.0

架构初探

文档说了,Kruise是一个标准的K8s拓展,所以都是通过CRD+Controller+Webhook+DaemonSet的方式实现的。例如:

k get pod -n kruise-system
NAME                                         READY   STATUS    RESTARTS   AGE
kruise-controller-manager-7b9f47dc8b-pctj6   1/1     Running   1          122m
kruise-controller-manager-7b9f47dc8b-v42vd   1/1     Running   0          122m
kruise-daemon-8ss8c                          1/1     Running   0          122m
kruise-daemon-gw6q6                          1/1     Running   0          122m
kruise-daemon-splst                          1/1     Running   0          122m
k get crd | grep kruise.io
advancedcronjobs.apps.kruise.io            2022-09-30T07:53:36Z
broadcastjobs.apps.kruise.io               2022-09-30T07:53:36Z
clonesets.apps.kruise.io                   2022-09-30T07:53:36Z
containerrecreaterequests.apps.kruise.io   2022-09-30T07:53:36Z
daemonsets.apps.kruise.io                  2022-09-30T07:53:36Z
imagepulljobs.apps.kruise.io               2022-09-30T07:53:36Z
nodeimages.apps.kruise.io                  2022-09-30T07:53:36Z
persistentpodstates.apps.kruise.io         2022-09-30T07:53:36Z
podunavailablebudgets.policy.kruise.io     2022-09-30T07:53:36Z
resourcedistributions.apps.kruise.io       2022-09-30T07:53:36Z
sidecarsets.apps.kruise.io                 2022-09-30T07:53:36Z
statefulsets.apps.kruise.io                2022-09-30T07:53:36Z
uniteddeployments.apps.kruise.io           2022-09-30T07:53:36Z
workloadspreads.apps.kruise.io             2022-09-30T07:53:36Z

第一个应用 CloneSet

CloneSet是Development的加强版,支持原地升级,自动创建PVC等功能,下面验证一下Kruise的原地升级 InPlaceIfPossible 能力。

---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
  labels:
    app: cs-no-pvc-cs-no-pvc-sample
  name: cs-no-pvc-sample
spec:
  replicas: 2
  selector:
    matchLabels:
      app: cs-no-pvc-sample
  template:
    metadata:
      labels:
        app: cs-no-pvc-sample
    spec:
      containers:
      - name: nginx
        image: nginx:1.18-alpine
  updateStrategy:
    type: InPlaceIfPossible
    inPlaceUpdateStrategy:
      gracePeriodSeconds: 5
k get pod -l app=cs-no-pvc-sample
NAME                     READY   STATUS    RESTARTS   AGE
cs-no-pvc-sample-5ppmm   1/1     Running   0          8m31s
cs-no-pvc-sample-brfxq   1/1     Running   0          8m31s
---
# -o yaml
  # annotations:
    # apps.kruise.io/runtime-containers-meta: '{"containers":[{"name":"nginx","containerID":"docker://11f9f20896cb113e865f5096fd6bdfd957bd989eee9d9601250bf970617abada","restartCount":0,"hashes":{"plainHash":723524768}}]}
    
---
k get clone cs-no-pvc-sample

NAME               DESIRED   UPDATED   UPDATED_READY   READY   TOTAL   AGE
cs-no-pvc-sample   2         2         2               2       2       19m
---
k edit clone cs-no-pvc-sample
# 修改 replicas 为1, image为 1.19-alpine
---
k get pod cs-no-pvc-sample-5ppmm -oyaml
NAME                     READY   STATUS    RESTARTS   AGE
cs-no-pvc-sample-5ppmm   1/1     Running   1          26m
# generation: 3
# apps.kruise.io/inplace-update-state: '{"revision":"cs-no-pvc-sample-6ccb957675","updateTimestamp":"2022-09-30T09:43:21Z","lastContainerStatuses":{"nginx":{"imageID":"docker-pullable://nginx@sha256:93baf2ec1bfefd04d29eb070900dd5d79b0f79863653453397e55a5b663a6cb1"}},"containerBatchesRecord":[{"timestamp":"2022-09-30T09:43:26Z","containers":["nginx"]}]}'
# image: nginx:1.19-alpine

由此可见,这次升级镜像,没有重建Pod,而是原地升级。 实际上,有一个status.updateRevision字段记录了clone的版本,老的为: updateRevision: cs-no-pvc-sample-7fb7468d98 ,新的为 updateRevision: cs-no-pvc-sample-6ccb957675

cloneset 主要功能

  • 指定Pod缩容
  • 缩容优先级
  • 流式扩容(一步一步扩容)
  • 使用partition进行灰度
  • 使用partition进行回滚
  • 可用性保证的设置
  • 超发弹性 MaxSurge
  • 原地升级,自动预热镜像
  • 生命周期钩子(原地升级钩子更新annotation,或者删除时设置finalizer,用户自己编写controller处理这些钩子结果)

参考

openkruise.io/zh/docs/use…