golang云原生应用交付与管理插件库KubeVela的使用
Golang云原生应用交付与管理插件库KubeVela的使用
简介
KubeVela是一个现代应用交付平台,它使跨当今混合、多云环境的应用程序部署和操作变得更加简单、快速和可靠。
主要特点
部署即代码
将您的部署计划声明为工作流,使用任何CI/CD或GitOps系统自动运行它,使用CUE扩展或重新编程工作流步骤。
内置可观测性、多租户和安全支持
选择我们提供的各种LDAP集成,享受增强的多租户和多集群授权和认证。
多云/混合环境应用交付作为一等公民
原生支持多集群/混合云场景,如跨测试/预发布/生产环境的渐进式推出。
轻量级但高度可扩展的架构
最小化您的控制平面部署,只需一个pod和0.5c1g资源即可处理数千个应用程序交付。
快速入门
安装KubeVela
// 示例:使用Go客户端安装KubeVela
package main
import (
"fmt"
"os/exec"
)
func main() {
// 安装KubeVela CLI
cmd := exec.Command("curl", "-fsSl", "https://kubevela.io/script/install.sh", "|", "bash")
err := cmd.Run()
if err != nil {
fmt.Println("安装KubeVela CLI失败:", err)
return
}
// 安装KubeVela核心
cmd = exec.Command("vela", "install")
err = cmd.Run()
if err != nil {
fmt.Println("安装KubeVela核心失败:", err)
return
}
fmt.Println("KubeVela安装成功!")
}
部署第一个应用
// 示例:使用Go部署一个简单的应用
package main
import (
"fmt"
"os"
"os/exec"
)
func deployApplication() error {
// 创建应用描述文件
appYaml := `apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
name: first-vela-app
spec:
components:
- name: express-server
type: webservice
properties:
image: crccheck/hello-world
port: 8000
traits:
- type: ingress
properties:
domain: testsvc.example.com
http:
"/": 8000`
// 将应用描述写入临时文件
tmpFile := "app.yaml"
err := os.WriteFile(tmpFile, []byte(appYaml), 0644)
if err != nil {
return fmt.Errorf("创建应用文件失败: %v", err)
}
defer os.Remove(tmpFile)
// 使用vela CLI部署应用
cmd := exec.Command("vela", "up", "-f", tmpFile)
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("部署应用失败: %v\n输出: %s", err, output)
}
fmt.Println("应用部署成功!")
fmt.Println(string(output))
return nil
}
func main() {
if err := deployApplication(); err != nil {
fmt.Println("错误:", err)
}
}
使用KubeVela Go SDK
KubeVela提供了Go SDK,可以直接在Go程序中使用KubeVela的功能。
// 示例:使用KubeVela Go SDK创建和管理应用
package main
import (
"context"
"fmt"
"log"
"github.com/kubevela/kubevela-core-api/apis/core.oam.dev/v1beta1"
velaclient "github.com/kubevela/kubevela-core-api/pkg/generated/client/clientset/versioned"
"k8s.io/client-go/tools/clientcmd"
)
func main() {
// 加载kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", clientcmd.RecommendedHomeFile)
if err != nil {
log.Fatalf("获取kubeconfig失败: %v", err)
}
// 创建KubeVela客户端
velaClient, err := velaclient.NewForConfig(config)
if err != nil {
log.Fatalf("创建KubeVela客户端失败: %v", err)
}
// 创建应用对象
app := &v1beta1.Application{
ObjectMeta: metav1.ObjectMeta{
Name: "go-sdk-app",
Namespace: "default",
},
Spec: v1beta1.ApplicationSpec{
Components: []v1beta1.ApplicationComponent{
{
Name: "web",
Type: "webservice",
Properties: runtime.RawExtension{
Raw: []byte(`{"image":"nginx","port":80}`),
},
Traits: []v1beta1.ApplicationTrait{
{
Type: "ingress",
Properties: runtime.RawExtension{
Raw: []byte(`{"domain":"web.example.com","http":{"/":80}}`),
},
},
},
},
},
},
}
// 创建应用
createdApp, err := velaClient.CoreV1beta1().Applications("default").Create(context.TODO(), app, metav1.CreateOptions{})
if err != nil {
log.Fatalf("创建应用失败: %v", err)
}
fmt.Printf("应用创建成功: %s\n", createdApp.Name)
}
社区
- Slack: CNCF Slack kubevela channel (英文)
- 钉钉群: 23310022 (中文)
- 微信群 (中文): 联系维护者加入用户群
贡献
欢迎贡献!请查看贡献指南了解如何与KubeVela一起开发。
更多关于golang云原生应用交付与管理插件库KubeVela的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang云原生应用交付与管理插件库KubeVela的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
KubeVela: Golang云原生应用交付与管理插件库使用指南
KubeVela 是一个开源的、基于 Go 语言开发的云原生应用交付与管理平台,它构建在 Kubernetes 之上,提供了更高级别的抽象来简化应用的部署和管理。
核心概念
- Application - 应用的核心抽象,定义了要部署的内容
- Component - 应用的组成部分,可以是微服务、数据库等
- Trait - 为组件添加的特性,如自动扩缩容、Ingress等
- Workflow - 定义应用的交付流程
安装与设置
首先需要安装 KubeVela CLI 工具:
curl -fsSl https://kubevela.io/script/install.sh | bash
验证安装:
vela version
基本使用示例
1. 初始化应用
package main
import (
"context"
"fmt"
"os"
"github.com/oam-dev/kubevela-core-api/apis/core.oam.dev/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/client/config"
)
func main() {
scheme := runtime.NewScheme()
_ = clientgoscheme.AddToScheme(scheme)
_ = v1beta1.AddToScheme(scheme)
cfg, err := config.GetConfig()
if err != nil {
fmt.Printf("Error getting config: %v\n", err)
os.Exit(1)
}
k8sClient, err := client.New(cfg, client.Options{Scheme: scheme})
if err != nil {
fmt.Printf("Error creating client: %v\n", err)
os.Exit(1)
}
app := &v1beta1.Application{
Spec: v1beta1.ApplicationSpec{
Components: []v1beta1.ApplicationComponent{
{
Name: "my-web-service",
Type: "webservice",
Properties: runtime.RawExtension{Raw: []byte(`{"image": "nginx:latest", "port": 80}`)},
},
},
},
}
app.SetName("demo-app")
app.SetNamespace("default")
err = k8sClient.Create(context.Background(), app)
if err != nil {
fmt.Printf("Error creating application: %v\n", err)
os.Exit(1)
}
fmt.Println("Application created successfully!")
}
2. 添加特性(Trait)
// 在上面的Application定义中添加Trait
app.Spec.Components[0].Traits = []v1beta1.ApplicationTrait{
{
Type: "ingress",
Properties: runtime.RawExtension{
Raw: []byte(`{"domain": "example.com", "http":{"/": 80}}`),
},
},
}
3. 定义工作流(Workflow)
app.Spec.Workflow = &v1beta1.Workflow{
Steps: []v1beta1.WorkflowStep{
{
Name: "deploy-web",
Type: "deploy",
Properties: runtime.RawExtension{
Raw: []byte(`{"policies": ["my-policy"]}`),
},
},
{
Name: "notify",
Type: "notification",
Properties: runtime.RawExtension{
Raw: []byte(`{"slack": {"message": "Deployment completed"}}`),
},
},
},
}
高级功能
1. 自定义组件类型
package main
import (
"context"
"fmt"
"github.com/oam-dev/kubevela-core-api/apis/core.oam.dev/common"
"github.com/oam-dev/kubevela-core-api/apis/core.oam.dev/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
)
func registerCustomComponent(k8sClient client.Client) error {
compDef := &v1beta1.ComponentDefinition{
Spec: v1beta1.ComponentDefinitionSpec{
Workload: common.WorkloadTypeDescriptor{
Definition: common.WorkloadGVK{
APIVersion: "apps/v1",
Kind: "Deployment",
},
},
Schematic: &common.Schematic{
CUE: &common.CUE{
Template: `
output: {
apiVersion: "apps/v1"
kind: "Deployment"
spec: {
selector: matchLabels: {
"app.oam.dev/component": context.name
}
template: {
metadata: labels: {
"app.oam.dev/component": context.name
}
spec: {
containers: [{
name: context.name
image: parameter.image
if parameter["cmd"] != _|_ {
command: parameter.cmd
}
}]
}
}
}
}
parameter: {
image: string
cmd?: [...string]
}`,
},
},
},
}
compDef.SetName("custom-component")
return k8sClient.Create(context.Background(), compDef)
}
2. 使用KubeVela SDK
package main
import (
"context"
"fmt"
"github.com/kubevela/workflow/api/v1alpha1"
"github.com/kubevela/workflow/pkg/cue/packages"
"github.com/kubevela/workflow/pkg/cue/process"
"github.com/kubevela/workflow/pkg/executor"
"github.com/kubevela/workflow/pkg/types"
)
func runWorkflow() error {
ctx := context.Background()
pd := packages.NewPackageDiscover()
proc := process.NewContextProcessor(pd)
wf := &v1alpha1.Workflow{
Steps: []v1alpha1.WorkflowStep{
{
Name: "step1",
Type: "my-step",
Properties: map[string]interface{}{
"param1": "value1",
},
},
},
}
exec := executor.NewWorkflowExecutor(wf, proc, pd)
_, err := exec.Execute(ctx, &types.WorkflowExecuteOptions{
Namespace: "default",
})
return err
}
最佳实践
- 模块化设计:将应用拆分为多个组件,每个组件专注于单一功能
- 重用特性:为常见需求(如监控、日志)创建可重用的Trait
- 渐进式交付:利用工作流实现金丝雀发布、蓝绿部署等策略
- 策略管理:使用Policy定义部署策略(如资源限制、节点选择)
调试与监控
// 获取应用状态
func getAppStatus(k8sClient client.Client, name, namespace string) error {
app := &v1beta1.Application{}
err := k8sClient.Get(context.Background(), client.ObjectKey{Name: name, Namespace: namespace}, app)
if err != nil {
return err
}
fmt.Printf("Application status: %+v\n", app.Status)
for _, comp := range app.Status.Services {
fmt.Printf("Component %s health status: %s\n", comp.Name, comp.Healthy)
}
return nil
}
KubeVela 提供了强大的抽象能力,使得开发者可以专注于应用本身而非底层基础设施。通过其插件化架构,可以轻松扩展功能以满足各种云原生场景需求。