快来看看,这里有你需要的 Kubernetes 模型!

在之前的几次更新中,我们为 KCL 语言增加了包管理的能力,解决了如何获取和发布三方库的问题。随之而来的新问题是,在开发程序的过程中,小伙伴们往往不确定该使用哪个库解决自己的问题。在通过包管理工具使用三方库之前,需要结合具体需求和各种三方库的能力去挑选合适的库使用。因此,我们借助 ArtifactHub(artifacthub.io) 构建了一个 KCL 三方库的市场,在这个市场中,有需求的朋友们能够根据自己的需求自由选择自己需要的三方库,有想法愿意分享的朋友们,也可以在这个市场中与大家分享。接下来,我们将通过一个简单的发布应用的案例来近距离感受一下如何在 ArtifactHub 上检索 KCL 三方库,并结合库文档的内容进行 KCL 程序开发。

前置工作

安装环境

启动 minikube

使用以下命令启动minikube

ini 复制代码
minikube start --cache-images=true  

如果您的 minikube 中没有安装 Ingress 控制器,您可以使用如下命令安装:

bash 复制代码
minikube addons enable ingress

HelloWorld 案例

首先,我们可以准备一个简单的 js 应用。

js 复制代码
const express = require('express');
const app = express();
const port = 8080;

// 定义一个响应 GET 请求的路由
app.get('/', (req, res) => {
  res.send('欢迎来到我的Web应用程序!');
});

// 启动服务器
app.listen(port, () => {
  console.log(`Web app listening http://localhost:${port}`);
});

并且为这个应用准备一个镜像,并将镜像上传到镜像中心。

sql 复制代码
FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 8080

CMD [ "node", "app.js" ]

本文的案例中我们将使用镜像地址 ghcr.io/test/my-web-app:1.0 来展示具体的内容。``完成了准备工作,我们就可以使用 KCL 编写对应的发布代码了。

使用 ArtifactHub 搜索您需要的包

首先,我想要将我的 my-web-app 应用发布,我需要借助 k8s 的三方库完成我的工作。直接在 ArtifactHub 中搜索 k8s关键字,可以看到目前提供的 k8s 的三方库。

k8s 模型的主页中,您可以找到关于 k8s 包的文档,不同版本等更加详细的内容。

右侧的 INSTALL 按钮为您提供了安装 k8s三方库的方式。

我们这里是使用 k8s作为包的依赖,因此如下命令进行安装:

shell 复制代码
kcl mod add k8s:1.28

接下来,我们需要编写发布应用对应的 deployment, serviceingress 三个部分。这里需要使用到我们刚才添加的 k8s包中的 Deployment, ServiceIngress三个 schema

更多关于 schema 的内容可以查阅。

如果您对这三个内容不太了解,您可以直接在模型的详情页进行搜索。以 Deployment 为例,您可以在文档中看到更加详细的信息。

根据文档的内容,我们可以在 main.k文件中编写如下 deployment

python 复制代码
import k8s.api.apps.v1 as d

deploment = d.Deployment {
    metadata.name = "web-app-deployment"
    spec = {
        selector.matchLabels = {app = "web-app"}
        template = {
            metadata.labels = {app = "web-app"}
            spec.containers = [{
                name = "web-app"
                image = "ghcr.io/test/my-web-app:1.0"
                ports = [{containerPort = 80}]
            }]
        }
    }
}

关于 Service, 可以查到相关文档:

对应的 service内容如下:

shell 复制代码
import k8s.api.core.v1 as s
service = s.Service {
    metadata.name = "web-app-service"
    spec.selector = {"app": "web-app"}
    spec.ports = [{
        port: 80
        targetPort: 8080
    }]
}

关于 Ingress, 可以查到相关文档

对应的 ingress内容如下:

python 复制代码
import k8s.api.networking.v1 as i

ingress = i.Ingress {
    metadata.name = "web-app-ingress"
    spec.rules = [
        {
            host: "web-app.example.com"
            http.paths = [
                {
                    path: "/"
                    pathType: "Prefix"
                    backend.service.name: "web-app-service"
                    backend.service.port: {
                        number: 8080
                    }
                }
            ]
        }
    ]
}

最后,在 main.k 文件中增加如下内容,将 deployment, service 和 ingress 渲染为 yaml 格式。

css 复制代码
manifests.yaml_stream([    deployment    service    ingress])

您可以使用如下命令编译对应的 KCL 程序,并且 apply。

arduino 复制代码
kcl run main.k | kubectl apply

进行到这里,我们已经在 ArtifactHub 的帮助下成功发布了应用 my-web-app。

最后,我们通过 kubectl 端口转发,来看一下发布的效果。使用以下命令进行转发。

bash 复制代码
kubectl port-forward service/web-app-service 8080:80

然后通过如下命令或者直接通过浏览器访问 http://localhost:8080 来访问我们发布的应用。

arduino 复制代码
curl http://localhost:8080

如果您通过 curl 命令行访问,您将会获得输出:

shell 复制代码
$ curl http://localhost:8080

欢迎来到我的Web应用程序!

如果您通过浏览器访问,您将会看到:

总结

本文通过一个简单的应用发布,为大家展示了如何在 ArtifactHub 上选择合适的 KCL 三方库,目前 ArtifactHub 上已经提供超过 150 个 KCL 三方库供大家选择,快来看看有没有你需要的 KCL 模型吧 !

在本文提供的案例中,我们用 KCL 编写了发布应用的程序。在后续的更新中,我们将进一步通过动态参数等特性对本文中的 KCL 程序进行抽象以及使用更多的应用模型介绍如 Open Application Model (OAM) 等,并且打包成一个单独的模块发布到 ArtifactHub 中,如果您也有想要与他人分享的 KCL 模块,我们将继续更新详细的步骤和指南,帮助您成功发布您的包。敬请期待!

此外欢迎各位小伙伴进行模型共建!❤️:github.com/kcl-lang/mo...

相关推荐
小白不想白a9 小时前
【k8s】k8s安装与集群部署脚本
云原生·容器·kubernetes
我来找弟弟9 小时前
open Euler--单master部署集群k8s
云原生·容器·kubernetes
数据智能老司机12 小时前
AI 原生软件交付——混沌工程与服务可靠性
aigc·devops·aiops
数据智能老司机12 小时前
基于 Kubernetes 的平台工程——云原生应用的挑战
云原生·kubernetes·devops
数据智能老司机12 小时前
基于 Kubernetes 的平台工程——Kubernetes 上的平台化浪潮
kubernetes·云计算·devops
岚天start14 小时前
K8S中,kubectl cordon、uncordon、drain、taint的区别
云原生·容器·kubernetes·cordon·uncordon·taint·drain
昌sit!18 小时前
k8s基本概念
云原生·容器·kubernetes
斯普信专业组19 小时前
Kubernetes部署apisix的理论与最佳实践(四)
云原生·容器·kubernetes
郝同学的测开笔记19 小时前
告别硬编码:手把手教你用Secrets保护CronJob的阿里云AK/SK
云原生·kubernetes·测试