概要
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处理这些钩子结果)