OpenKruise是基于Kubernetes的一个标准扩展组件,可以配合原生Kubernetes使用,高效管理应用容器、Sidecar及镜像分发等功能。本文介绍如何使用OpenKruise部署云原生应用。
前提条件
已安装Kubernetes托管版集群,且集群版本不低于1.13。具体操作,请参见创建Kubernetes托管版集群。
背景信息
OpenKruise是阿里云开源的云原生应用自动化引擎,也是阿里巴巴经济体上云全面使用的部署基座,已正式加入CNCF Sandbox。
OpenKruise包含了多种自定义Workload,用于无状态应用、有状态应用、Sidecar容器、Daemon应用等部署管理,提供了原地升级、灰度、流式、配置优先级等扩展策略。
组件架构
OpenKruise是Kubernetes的一个标准扩展,所以也可以原生地部署到K8s集群当中,主要包含以下三个组件。
组件 | 说明 |
Kruise-manager | Kruise-manager是一个运行Controller和Webhook的中心组件,通过Deployment部署在kruise-system命名空间中。通过Controller以及Webhook实现原地升级及Sidecar管理等核心能力。 |
Kruise-daemon | 通过DaemonSet部署到每个节点上,提供镜像预热及容器重启等功能。 |
Kruise-Rollout | Kruise-Rollout是基于Kubernetes的一个标准扩展组件,包含完整的Rollout模型定义与方案实现,满足配合应用流量和实际部署实例的金丝雀发布、蓝绿发布、A/B Testing发布,并能提供旁路的无感对接、兼容已有的多种工作负载。 |
使用说明
OpenKruise包含CloneSet、Advanced StatefulSet、Advanced DaemonSet等控制器。以下介绍常用控制器的功能。
表 1. 常用控制器介绍
控制器 | 功能 |
CloneSet | 管理无状态应用,对标Kubernetes原生Deployment。关于CloneSet的详细介绍,请参见CloneSet。 资源(YAML)的字段与Deployment不完全兼容,但功能上全覆盖,并提供比Deployment更丰富的策略。 |
Advanced StatefulSet | 管理有状态应用,对标Kubernetes原生StatefulSet。关于Advanced StatefulSet的详细介绍,请参见Advanced StatefulSet。 资源(YAML)字段与原生StatefulSet完全兼容,只需要把 |
Advanced DaemonSet | 管理Daemon应用,对标Kubernetes原生DaemonSet。关于Advanced DaemonSet的详细介绍,请参见Advanced DaemonSet。 资源(YAML)字段与原生DaemonSet完全兼容,只需要把 |
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。 |
以下介绍CloneSet、Advanced StatefulSet、Advanced DaemonSet与社区对标控制器的功能对比。
表 2. 与社区控制器功能对比
功能 | CloneSet VS Deployment | Advanced StatefulSet VS StatefulSet | Advanced DaemonSet VS DaemonSet | |||
CloneSet | Deployment | Advanced StatefulSet | StatefulSet | Advanced DaemonSet | DaemonSet | |
流式扩容 | ||||||
指定缩容 | ||||||
Pod重建升级 | ||||||
Pod原地升级 | ||||||
分批灰度发布 | ||||||
最大可用数量 | ||||||
最大弹性数量 | ||||||
通过使用优先级策略和打散策略来自定义发布顺序 | ||||||
通过lifecycle hook管理Pod生命周期 |
安装OpenKruise
安装OpenKruise前,请确保Kubernetes版本不低于1.13。如果您使用的是Kubernetes 1.13或1.14版本,必须先在kube-apiserver中打开
CustomResourceWebhookConversion
feature-gate。更多信息,请参见特性门控。由于杭州仓库已不可用,您如果遇到镜像
registry.cn-hangzhou.cr.aliyuncs.com/openkruise/kruise-manager
拉取失败,请将镜像地址调整为registry.cn-shanghai.cr.aliyuncs.com/openkruise/kruise-manager
进行重试。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击应用管理页签。在ack-kruise区域,单击安装。
在提示对话框确认组件信息后,单击确定。
使用CloneSet部署无状态应用
创建CloneSet。
创建cloneset.yaml。
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: openkruise-registry.cn-shanghai.cr.aliyuncs.com/openkruise/demo:1.10.2 env: - name: test value: foo updateStrategy: type: InPlaceIfPossible # 尽量使用原地升级,否则重建升级。 maxUnavailable: 20% # 发布过程最多20%不可用。 inPlaceUpdateStrategy: gracePeriodSeconds: 3 # 每个Pod原地升级前Not Ready优雅等待时间。
type:设置升级策略,支持以下3种升级方式。
ReCreate:控制器会删除旧Pod和PVC,然后用新版本重新创建Pod和PVC。
InPlaceIfPossible:控制器会优先尝试原地升级Pod,如果不行再采用重建升级。
InPlaceOnly:控制器只允许采用原地升级。
maxUnavailable:发布过程中,限制最多不可用的Pod数量,可以设置为一个绝对值或者百分比。
gracePeriodSeconds:每个Pod原地升级前Not Ready优雅等待时间。
使cloneset.yaml在ACK集群中生效。
kubectl create -f ./cloneset.yaml
预期输出:
cloneset.apps.kruise.io/demo-clone created
查看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
DESIRED:期望Pod数量(spec.replicas)。
UPDATED:最新版本的Pod数量(status.updatedReplicas)。
UPDATED_READY:最新版本的可用Pod数量(status.updatedReadyReplicas)。
READY:可用Pod总量(status.readyReplicas)。
TOTAL:实际Pod总量(status.replicas)。
使用Advanced StatefulSet部署有状态应用
创建Advanced StatefulSet。
创建statefulset.yaml。
apiVersion: apps.kruise.io/v1alpha1 kind: StatefulSet metadata: name: demo-asts spec: replicas: 3 selector: matchLabels: app: guestbook-sts podManagementPolicy: Parallel template: # Pod template和官方StatefulSet的结构完全一致。 metadata: labels: app: guestbook-sts spec: containers: - name: guestbook image: openkruise-registry.cn-shanghai.cr.aliyuncs.com/openkruise/demo:1.10.2 env: - name: test value: foo readinessGates: - conditionType: InPlaceUpdateReady updateStrategy: type: RollingUpdate rollingUpdate: podUpdatePolicy: InPlaceIfPossible # 尽量使用原地升级,否则重建升级。 maxUnavailable: 20% # 发布过程最多20%不可用。 inPlaceUpdateStrategy: gracePeriodSeconds: 3 # 每个Pod原地升级前Not ready优雅等待时间。
type:设置Pod升级策略,支持以下3种方式升级。
ReCreate:控制器会删除旧Pod和PVC,然后用新版本重新创建Pod和PVC。
InPlaceIfPossible:控制器会优先尝试原地升级Pod,如果不行再采用重建升级。
InPlaceOnly:控制器只允许采用原地升级。
maxUnavailable:发布过程中,限制最多不可用的Pod数量,可以设置为一个绝对值或者百分比。
gracePeriodSeconds:每个Pod原地升级前Not ready优雅等待时间。
使statefulset.yaml在ACK集群中生效。
kubectl create -f ./statefulset.yaml
预期输出:
statefulset.apps.kruise.io/demo-asts created
查看Pod运行状态。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE demo-asts-0 1/1 Running 0 3h29m demo-asts-1 1/1 Running 0 3h29m demo-asts-2 1/1 Running 0 3h29m
查看Advanced StatefulSet。
kubectl get asts
预期输出:
NAME DESIRED CURRENT UPDATED READY AGE demo-asts 3 3 3 3 3h30m
DESIRED:期望Pod数量(spec.replicas)。
UPDATED:最新版本的Pod数量(status.updatedReplicas)。
READY:可用Pod总量(status.readyReplicas)。
TOTAL:实际Pod总量(status.replicas)。