使用 cube-openkruise 使用应用原地升级
OpenKruise是基于Kubernetes的一个标准扩展组件,可以配合原生Kubernetes使用,高效管理应用容器、Sidecar及镜像分发等功能。本文介绍如何使用OpenKruise部署云原生应用。
前提条件
已安装Kubernetes托管版集群,且集群版本不低于1.23。
背景信息
OpenKruise包含了多种自定义Workload,用于无状态应用、有状态应用、Sidecar容器、Daemon应用等部署管理,提供了原地升级等扩展策略。
使用说明
OpenKruise包含CloneSet、Advanced StatefulSet、Advanced DaemonSet等控制器。常用控制器说明如下:
控制器 | 功能 |
---|---|
CloneSet | 管理无状态应用,对标Kubernetes原生Deployment。关于CloneSet的详细介绍,请参见Cloneset。资源(YAML)的字段与Deployment不完全兼容,但功能上全覆盖,并提供比Deployment更丰富的策略。 |
Advanced StatefulSet | 管理有状态应用,对标Kubernetes原生StatefulSet。关于Advanced StatefulSet的详细介绍,请参见Advanced StatefulSet。资源(YAML)字段与原生StatefulSet完全兼容,只需要把apiVersion改为apps.kruise.io/v1alpha1,另外提供了optional字段来扩展发布策略(原地升级、并行发布等) |
Advanced DaemonSet | 管理Daemon应用,对标Kubernetes原生DaemonSet。关于Advanced DaemonSet的详细介绍,请参见Advanced DaemonSet。资源(YAML)字段与原生DaemonSet完全兼容,只需要把apiVersion改为apps.kruise.io/v1alpha1,另外提供了optional字段来扩展发布策略(热升级、灰度、按Node标签灰度等 |
SidecarSet | 独立管理Sidecar容器和注入。关于SidecarSet的详细介绍,请参见SidecarSet。在独立CR中定义Sidecar容器和Label Selector,OpenKruise会在所有符合Selector条件的Pod创建时注入定义好的Sidecar容器,并支持对已注入Sidecar容器做原地升级 |
UnitedDeployment | 管理不同区域下的多个Sub Workload,关于UnitedDeployment的详细介绍,请参见UnitedDeployment。目前支持将CloneSet、StatefulSet、Advanced StatefulSet作为Sub Workload,您可以用一个UnitedDeployment来定义不同区域中的Sub Workload部署Replicas。 |
安装 OpenKruise
1、在集群的菜单“插件”-“插件市场”中安装cube-openkruise插件。
2、使用CloneSet部署无状态应用并原地升级,第一步:创建CloneSet。
kubectl apply -f -<<eof
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
name: demo-clone
spec:
replicas: 5
selector:
matchLabels:
app: guestbook
template: #Pod template和Deployment的结构完全一致。
metadata:
labels:
app: guestbook
spec:
containers:
- name: guestbook
image: nginx:1.24.0
env:
- name: test
value: foo
updateStrategy:
type: InPlaceIfPossible #尽量使用原地升级,否则重建升级。
maxUnavailable: 20% #发布过程最多20%不可用。
inPlaceUpdateStrategy:
gracePeriodSeconds: 3 #每个Pod原地升级前Not Ready优雅等待时间。
eof
第二步:执行以下命令,查看Pod运行状态。
kubectl get pod
NAME READY STATUS RESTARTS AGE
demo-clone-5b9kl 1/1 Running 0 3s
demo-clone-6xjdg 1/1 Running 0 3s
demo-clone-bvmdj 1/1 Running 0 3s
demo-clone-dm22s 1/1 Running 0 3s
demo-clone-rbpg9 1/1 Running 0 3s
第三步:执行以下命令,查看CloneSet。
kubectl get clone
NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE
demo-clone 5 5 5 5 5 46s
第四步:原地升级。
kubectl patch cloneset demo-clone --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"nginx:1.25.2"}]'
第五步:查看升级 Pod。
kubectl get pod
# pod 的名字没变,镜像已经更新