KubeVela最佳实践

KubeVela 是一个开源的现代化软件交付平台,提供丰富的应用运维, 管理能力和强大的可扩展性。 本文介绍如何在ACS上安装和使用KubeVela进行应用管理。

前提条件

安装步骤

步骤一:安装KubeVela组件

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. Helm页面,单击创建

  4. 在右侧的弹窗中的搜索栏,输入ack-kubevela,选中搜索结果中的组件,单击下一步image.png

  5. 选择最新Chart版本。image.png

  6. 单击确定,安装组件。

  7. 在集群管理页左侧导航栏,选择应用 > Helm,查看ack-kubevela的部署状态。

    当ack-kubevela的状态已部署,说明部署成功。

    重要

    预期安装结果如下:

    1. 安装KubeVela Core套件: 核心包括kubevela和cluster-gateway两个控制器。

    2. 安装VelaUX套件: 核心包括VelaUX WebServer和一个公网SLB作为访问Endpoint。

  1. 在集群管理页左侧导航栏,选择网络 > 服务,查看自动创建的服务。image.png

    说明

    您可以在网络->服务详情内查看到vela-system命名空间下创建的VelaUX的Endpoint默认的用户名是admin,默认密码是 VelaUX12345。

  2. 通过Endpoint登录VelaUX。

    image.png

    说明

    后续您可以通过K8s api、VelaUX或vela CLI等多种方式来管理您的应用和相关资源。

步骤二:安装Vela CLI(可选)

在VelaUX之外, 您也可以在本地安装Vela CLI, 通过客户端的方式进行应用管理、插件安装等操作。

  • 操作平台为Mac OS/Linux

    curl -fsSl https://kubevela.io/script/install.sh | bash
  • 操作平台为Windows

    powershell -Command "iwr -useb https://kubevela.io/script/install.ps1 | iex"

第一个应用

说明

以下示例通过KubeVela创建一个魔方小应用, 将会创建以下相关云资源:

  • 一个0.25 Core规格的标准型Pod资源。

  • 公网SLB: 用于访问小应用。

  • 30 GiB的高效云盘。

  1. 使用以下内容,创建cube.yaml。

    apiVersion: core.oam.dev/v1beta1
    kind: Application
    metadata:
      name: cube
      namespace: default
    spec:
      components:
      - name: cube
        properties:
          cpu: "0.25"
          exposeType: LoadBalancer #声明SLB
          image: registry.cn-hangzhou.aliyuncs.com/acr-toolkit/ack-cube:1.0
          memory: 512Mi
          ports:
          - expose: true
            port: 80
            protocol: TCP
        traits:
        - properties:
            "alibabacloud.com/compute-class": "general-purpose" #通用型Pod
            "app": "demo-1"
          type: labels
        - properties:
            replicas: 1
          type: scaler
        - properties:
            pvc:
            - mountPath: /home/admin
              name: demo-pvc
              resources:
                requests:
                  storage: 30Gi
              storageClassName: alicloud-disk-topology-alltype #声明使用高效云盘。
          type: storage
        type: webservice
      policies:
      - name: default
        properties:
          clusters:
          - local
          namespace: default
        type: topology
      workflow:
        mode:
          steps: DAG
        steps:
        - meta:
            alias: Deploy To default
          name: default
          properties:
            policies:
            - default
          type: deploy
  2. 执行以下命令,通过Vela CLI提交YAML创建应用。

    vela up -f cube.yaml -n default -v demo-v1

    预期输出:

    Applying an application in vela K8s object format...
    I1108 15:35:33.369515   65870 apply.go:121] "creating object" name="cube" resource="core.oam.dev/v1beta1, Kind=Application"
    App has been deployed 
        Port forward: vela port-forward cube
                 SSH: vela exec cube
             Logging: vela logs cube
          App status: vela status cube
            Endpoint: vela status cube --endpoint
    Application default/cube applied.
  3. 执行以下命令,查看运行状态。

    vela status cube -n default

    预期输出:

    About:
    
      Name:      	cube
      Namespace: 	default
      Created at:	2023-11-08 15:35:33 +0800 CST
      Status:    	running
    
    Workflow:
    
      mode: DAG-DAG
      finished: true
      Suspend: false
      Terminated: false
      Steps
      - id: 6vkbhba12p
        name: default
        type: deploy
        phase: succeeded
    
    Services:
    
      - Name: cube
        Cluster: local  Namespace: default
        Type: webservice
        Healthy Ready:1/1
        Traits:
          labels      scaler      storage

    当应用整体处于running时,表示应用已完成部署。

  4. 执行以下命令,查看访问入口。

    vela status cube -n default --endpoint

    预期输出:

    Please access cube from the following endpoints:
    +---------+-----------+--------------------------+-----------------------+-------+
    | CLUSTER | COMPONENT | REF(KIND/NAMESPACE/NAME) |       ENDPOINT        | INNER |
    +---------+-----------+--------------------------+-----------------------+-------+
    | local   | cube      | Service/default/cube     | http://your-endpoint  | false |
    +---------+-----------+--------------------------+-----------------------+-------+
  5. 通过浏览器访问ENDPOINT, 将看到以下魔方小程序。image.png

  6. 通过VelaUX进行后续的持续管理和运维工作。

    image.png

通过KubeVela进行CI集成和运维管理

一、结合阿里云ACR和GitHub进行镜像构建和交付

以下示例将从CI和CD简要描述如何进行持续集成,基于KubeVela和ACS进行镜像构建和服务交付。

  • 通过kaniko在容器环境下进行镜像构建和推送至个人版ACR仓库。

  • 通过KubeVela Application进行一个应用描述和服务交付。

前提条件

  • 已开启ACR个人版或企业版。本示例使用个人版。

  • 已创建一个代码仓库。本示例使用GitHub仓库https://gitee.com/AliyunContainerService/simple-web-demo.git

操作步骤

  1. 开启vela-workflow addon。

    登录VelaUX,选择平台扩展 -> Addons -> 搜索vela-workflow -> 单击图标 -> 单击安装, 当Addon进入已启用状态时说明已经安装成功image.png

  2. 创建Git密钥。

    示例中使用的是GitHub,通过Secret的方式来保存密钥, 用于后续的镜像构建阶段使用。

    kubectl create secret generic git-token --from-literal='GIT_TOKEN=<YOUR-GIT-TOKEN>'
  3. 创建镜像仓库密钥

    示例中使用的是阿里云ACR个人版, 通过Secret的方式来保存密钥, 用户后续的镜像构建阶段和应用部署阶段都使用此Secret。

    说明

    ACS集成了ACR镜像仓库免密插件,您也可以通过免密插件的方式来代替这一步骤。关于如何使用免密插件,请参见免密拉取ACR镜像

    kubectl create secret docker-registry docker-regcred \
        --docker-server=registry.cn-beijing.aliyuncs.com \
        --docker-username=yourUserName \
        --docker-password=yourPassword
  4. 声明WorkflowRun工作流。

    apiVersion: core.oam.dev/v1alpha1
    kind: WorkflowRun
    metadata:
      name: demo-wr
      namespace: default
    spec:
      context:
        image: registry.cn-beijing.aliyuncs.com/k8s-conformance/demo:v1
      workflowSpec:
       steps:
        - name: build-push
          type: build-push-image
          inputs:
            - from: context.image
              parameterKey: image
          properties:
            # 您可以在 kanikoExecutor 字段中指定你的 kanikoExecutor 镜像,如果没有指定,默认使用 oamdev/kaniko-executor:v1.9.1
            # kanikoExecutor: gcr.io/kaniko-project/executor:latest
            # 您可以在 context 中指定 仓库地址 和 branch,或者直接指定完整的 context,请参考 https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts
            context:
              git: gitee.com/AliyunContainerService/simple-web-demo
              branch: main
            # 注意,该字段会被 inputs 中的 image 覆盖
            image: my-registry/test-image:v1
            # 指定 dockerfile 路径,如果没有指定,默认会使用 ./Dockerfile
            # dockerfile: ./Dockerfile
            credentials:
              image:
                name: docker-regcred
              git:
                name: git-token
                key: GIT_TOKEN
        - name: apply-app
          type: apply-app
          inputs:
            - from: context.image
              parameterKey: data.spec.components[0].properties.image
          properties:
            data:
              apiVersion: core.oam.dev/v1beta1
              kind: Application
              metadata:
                name: demo-1
                namespace: default
              spec:
                components:
                - name: demo-1
                  properties:
                    cpu: "0.25"
                    exposeType: LoadBalancer #声明SLB
                    image: image
                    memory: 512Mi
                    ports:
                    - expose: true
                      port: 80
                      protocol: TCP
                  traits:
                  - properties:
                      "alibabacloud.com/compute-class": "general-purpose" #通用型
                      "alibabacloud.com/compute-qos": "default"
                      "app": "demo-1"
                    type: labels
                  - properties:
                      replicas: 2
                    type: scaler
                  type: webservice
                policies:
                - name: default
                  properties:
                    clusters:
                    - local
                    namespace: default
                  type: topology
                workflow:
                  mode:
                    steps: DAG
                  steps:
                  - meta:
                      alias: Deploy To default
                    name: default
                    properties:
                      policies:
                      - default
                    type: deploy
  5. 查看工作流的状态和日志

    vela workflow logs demo-wr -n default
    
    #预期输出
    
    ? Select a step to show logs:  [Use arrows to move, type to filter]
    >  build-push
       apply-app

    当所有子任务执行完成时, 任务将整体成功。

  6. 查看应用的状态和访问入口。

    # 查看应用列表
    vela ls -n default
    
    # 预期输出
    APP   	COMPONENT	TYPE      	TRAITS       	PHASE  	HEALTHY	STATUS   	CREATED-TIME
    demo-1	demo-1   	webservice	labels,scaler	running	healthy	Ready:2/2	2023-11-15 17:58:12 +0800 CST
    
    # 查看应用详情
    vela status demo-1 -n default
    
    # 预期输出
    About:
    
      Name:      	demo-1
      Namespace: 	default
      Created at:	2023-11-15 17:58:12 +0800 CST
      Status:    	running
    
    Workflow:
    
      mode: DAG-DAG
      finished: true
      Suspend: false
      Terminated: false
      Steps
      - id: 8nsijpwkfd
        name: default
        type: deploy
        phase: succeeded
    
    Services:
    
      - Name: demo-1
        Cluster: local  Namespace: default
        Type: webservice
        Healthy Ready:2/2
        Traits:
          labels      scaler
    
    # 查看访问入口
    vela status demo-1 -n default --endpoint
    
    # 预期输出
    Please access demo-1 from the following endpoints:
    +---------+-----------+--------------------------+-----------------------+-------+
    | CLUSTER | COMPONENT | REF(KIND/NAMESPACE/NAME) |       ENDPOINT        | INNER |
    +---------+-----------+--------------------------+-----------------------+-------+
    | local   | demo-1    | Service/default/demo-1   | http://your-endpoint | false |
    +---------+-----------+--------------------------+-----------------------+-------+
  7. 通过ENDPOINT访问。

    image.png

二、结合PDB进行应用高可用防护

PDB即PodDisruptionBudget可以通过定义maxUnavailable方式来对应用进行最小可用副本数的防护, 在通过KubeVela进行集成时, 我们可以作为WorkflowRun中的一个步骤, 通过apply-object子任务进行下发

重要

建议您对于需要高可用的生产环境工作负载配置PDB来保障应用的最小可用副本数, 避免因为各类操作或非操作原因导致应用不可用。

  1. 调整WorkflowRun。

    apiVersion: core.oam.dev/v1alpha1
    kind: WorkflowRun
    metadata:
      name: demo-wr
      namespace: default
    spec:
      context:
        image: registry.cn-beijing.aliyuncs.com/k8s-conformance/demo:v1
      workflowSpec:
       steps:
        ......
        - name: apply-app
          type: apply-app
          ......
        - name: apply-pdb
          type: apply-object
          properties:
            value:
              apiVersion: policy/v1
              kind: PodDisruptionBudget
              metadata:
                name: demo-pdb
              spec:
                maxUnavailable: 20% #最打不可用副本数为总副本数20%, 可以进行evict防护。
                selector:
                  matchLabels:
                    app: demo-1 #通过label-selector进行关联。
     
  2. Kubectl进行提交。

    kubectl apply -f demo-wr.yaml
  3. 重新执行工作流,并查看PDB的创建状态。

    # 重新执行工作流
    vela workflow restart demo-wr -ndefault
    
    # 预期输出
    Successfully restart workflow: demo-wr
    
    # 查看PDB
    kubectl get pdb
    
    # 预期输出
    NAME       MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    demo-pdb   1               N/A               1                     2s

三、结合cloudshell进行登录管理

cloudshell是KubeVela集成的插件之一,它基于开源软件cloudtty来提供WebTerminal的功能。

  1. 通过平台扩展进行cloudshell的安装。

    在平台扩展中搜索cloudshell, 并进行安装。 当插件状态处于已启用时说明已经安装成功。

    image.png

  2. 通过WebTerminal登录至容器中。

    image.png

四、结合Keda进行弹性伸缩

Keda是一个开源的事件驱动的弹性伸缩框架,基于KubeVela我们可以扩展集成Keda进行各粒度的弹性伸缩,以满足各场景的弹性伸缩或分时复用场景。

  1. 通过平台扩展进行Keda的安装。

    在平台扩展中搜索keda,并进行安装。当插件处于已启动时说明已经安装成功。同时KubeVela将安装Keda的运维特征keda-auto-scaler。

    image.png

  2. 调整WorkflowRun增加keda-auto-scaler运维特征。

    说明

    示例中新增的是一个定时弹性, 您也可以结合指标等粒度进行触发源配置。

    apiVersion: core.oam.dev/v1alpha1
    kind: WorkflowRun
    metadata:
      name: demo-wr
      namespace: default
    spec:
      context:
        image: registry.cn-beijing.aliyuncs.com/k8s-conformance/demo:v1
      workflowSpec:
       steps:
        ......
        - name: apply-app
          type: apply-app
          inputs:
            - from: context.image
              parameterKey: data.spec.components[0].properties.image
          properties:
            data:
              apiVersion: core.oam.dev/v1beta1
              kind: Application
              metadata:
                name: demo-1
                namespace: default
              spec:
                components:
                - name: demo-1
                  properties:
                    cpu: "0.25"
                    exposeType: LoadBalancer #声明SLB
                    image: image
                    memory: 512Mi
                    ports:
                    - expose: true
                      port: 80
                      protocol: TCP
                  traits:
                  - properties:
                      "alibabacloud.com/compute-class": "general-purpose" #通用型
                    type: labels
                  - properties:
                      replicas: 2
                    type: scaler
                  - type: keda-auto-scaler
                    properties:
                      triggers:
                      - type: cron
                        metadata:
                          timezone: Asia/Shanghai  # The acceptable values would be a value from the IANA Time Zone Database.
                          start: 00 * * * *       # Every hour on the 30th minute
                          end: 10 * * * *         # Every hour on the 45th minute
                          desiredReplicas: "3"
                  type: webservice
     
  3. 提交并重新执行工作流。

    kubectl apply -f demo-wr.yaml
    
    # 重新执行
    vela workflow restart demo-wr -ndefault
    
    # 预期输出
    Successfully restart workflow: demo-wr
  4. 查看应用的状态。

    应用详情中可以看到keda-auto-scaler已经被启用。

    vela status demo-1 -ndefault

    预期输出:

    About:
    
      Name:      	demo-1
      Namespace: 	default
      Created at:	2023-11-15 17:58:12 +0800 CST
      Status:    	running
    
    Workflow:
    
      mode: DAG-DAG
      finished: true
      Suspend: false
      Terminated: false
      Steps
      - id: ziwddaa6mt
        name: default
        type: deploy
        phase: succeeded
    
    Services:
    
      - Name: demo-1
        Cluster: local  Namespace: default
        Type: webservice
        Healthy Ready:2/2
        Traits:
          labels      scaler      keda-auto-scaler