使用OpenKruise部署云原生应用

OpenKruise是基于Kubernetes的一个标准扩展组件,可以配合原生Kubernetes使用,高效管理应用容器、Sidecar及镜像分发等功能。本文介绍如何使用OpenKruise部署云原生应用。

前提条件

已安装Kubernetes托管版集群,且集群版本不低于1.13。具体操作,请参见创建Kubernetes托管版集群

背景信息

OpenKruise是阿里云开源的云原生应用自动化引擎,也是阿里巴巴经济体上云全面使用的部署基座,已正式加入CNCF Sandbox。

OpenKruise包含了多种自定义Workload,用于无状态应用、有状态应用、Sidecar容器、Daemon应用等部署管理,提供了原地升级、灰度、流式、配置优先级等扩展策略。

组件架构

OpenKruise

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完全兼容,只需要把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。

以下介绍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进行重试。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击应用管理页签。在ack-kruise区域,单击安装

    提示对话框确认组件信息后,单击确定

使用CloneSet部署无状态应用

  1. 创建CloneSet。

    1. 创建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优雅等待时间。

    2. 使cloneset.yaml在ACK集群中生效。

      kubectl create -f ./cloneset.yaml

      预期输出:

      cloneset.apps.kruise.io/demo-clone created
  2. 查看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
  3. 查看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部署有状态应用

  1. 创建Advanced StatefulSet。

    1. 创建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优雅等待时间。

    2. 使statefulset.yaml在ACK集群中生效。

       kubectl create -f ./statefulset.yaml

      预期输出:

      statefulset.apps.kruise.io/demo-asts created
  2. 查看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
  3. 查看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)。