KubeVela 是一个开源的现代化软件交付平台,提供丰富的应用运维, 管理能力和强大的可扩展性。 本文介绍如何在ACS上安装和使用KubeVela进行应用管理。
前提条件
已在ACS集群安装CoreDNS。具体操作,请参见CoreDNS配置说明。
已通过Kubectl工具连接ACS集群。具体操作,请参见通过kubectl快速使用ACS。
安装步骤
步骤一:安装KubeVela组件
登录容器计算服务控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm。
在Helm页面,单击创建。
在右侧的弹窗中的搜索栏,输入ack-kubevela,选中搜索结果中的组件,单击下一步。
选择最新Chart版本。
单击确定,安装组件。
在集群管理页左侧导航栏,选择 ,查看ack-kubevela的部署状态。
当ack-kubevela的状态为已部署,说明部署成功。
重要预期安装结果如下:
安装KubeVela Core套件: 核心包括kubevela和cluster-gateway两个控制器。
安装VelaUX套件: 核心包括VelaUX WebServer和一个公网SLB作为访问Endpoint。
在集群管理页左侧导航栏,选择 ,查看自动创建的服务。
说明您可以在网络->服务详情内查看到vela-system命名空间下创建的VelaUX的Endpoint默认的用户名是admin,默认密码是 VelaUX12345。
通过Endpoint登录VelaUX。
说明后续您可以通过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的高效云盘。
使用以下内容,创建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
执行以下命令,通过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.
执行以下命令,查看运行状态。
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
时,表示应用已完成部署。执行以下命令,查看访问入口。
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 | +---------+-----------+--------------------------+-----------------------+-------+
通过浏览器访问ENDPOINT, 将看到以下魔方小程序。
通过VelaUX进行后续的持续管理和运维工作。
通过KubeVela进行CI集成和运维管理
一、结合阿里云ACR和GitHub进行镜像构建和交付
以下示例将从CI和CD简要描述如何进行持续集成,基于KubeVela和ACS进行镜像构建和服务交付。
通过kaniko在容器环境下进行镜像构建和推送至个人版ACR仓库。
通过KubeVela Application进行一个应用描述和服务交付。
前提条件
已开启ACR个人版或企业版。本示例使用个人版。
已创建一个代码仓库。本示例使用GitHub仓库
https://gitee.com/AliyunContainerService/simple-web-demo.git
。
操作步骤
开启vela-workflow addon。
登录VelaUX,选择平台扩展 -> Addons -> 搜索vela-workflow -> 单击图标 -> 单击安装, 当Addon进入已启用状态时说明已经安装成功
创建Git密钥。
示例中使用的是GitHub,通过Secret的方式来保存密钥, 用于后续的镜像构建阶段使用。
kubectl create secret generic git-token --from-literal='GIT_TOKEN=<YOUR-GIT-TOKEN>'
创建镜像仓库密钥
示例中使用的是阿里云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
声明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
查看工作流的状态和日志
vela workflow logs demo-wr -n default #预期输出 ? Select a step to show logs: [Use arrows to move, type to filter] > build-push apply-app
当所有子任务执行完成时, 任务将整体成功。
查看应用的状态和访问入口。
# 查看应用列表 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 | +---------+-----------+--------------------------+-----------------------+-------+
通过ENDPOINT访问。
二、结合PDB进行应用高可用防护
PDB即PodDisruptionBudget可以通过定义maxUnavailable方式来对应用进行最小可用副本数的防护, 在通过KubeVela进行集成时, 我们可以作为WorkflowRun中的一个步骤, 通过apply-object子任务进行下发
建议您对于需要高可用的生产环境工作负载配置PDB来保障应用的最小可用副本数, 避免因为各类操作或非操作原因导致应用不可用。
调整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进行关联。
Kubectl进行提交。
kubectl apply -f demo-wr.yaml
重新执行工作流,并查看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的功能。
通过平台扩展进行cloudshell的安装。
在平台扩展中搜索cloudshell, 并进行安装。 当插件状态处于已启用时说明已经安装成功。
通过WebTerminal登录至容器中。
四、结合Keda进行弹性伸缩
Keda是一个开源的事件驱动的弹性伸缩框架,基于KubeVela我们可以扩展集成Keda进行各粒度的弹性伸缩,以满足各场景的弹性伸缩或分时复用场景。
通过平台扩展进行Keda的安装。
在平台扩展中搜索keda,并进行安装。当插件处于已启动时说明已经安装成功。同时KubeVela将安装Keda的运维特征keda-auto-scaler。
调整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
提交并重新执行工作流。
kubectl apply -f demo-wr.yaml # 重新执行 vela workflow restart demo-wr -ndefault # 预期输出 Successfully restart workflow: demo-wr
查看应用的状态。
应用详情中可以看到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