开发 k8s 管理平台 - k8sailor 06. 使用 api/biz/dao 分层结构管理数据请求,获取 deployment 数据

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 开发 k8s 管理平台 - k8sailor 06. 使用 api/biz/dao 分层结构管理数据请求,获取 deployment 数据

开发 k8s 管理平台 - k8sailor 06. 使用 api/biz/dao 分层结构管理数据请求,获取 deployment 数据

原文地址: https://tangx.in/posts/books/k8sailor/chapter02/06-get-all-deployments/
tag: https://github.com/tangx/k8sailor/tree/feat/06-get-all-deployments
client ->
apis ->
    biz ->
    dao ->

将业务逻辑部分分为经典三层,想法是这样的,可能实现有错误。

  1. apis 接入层: 只用于管理 http 请求与交互。
  2. biz 业务层: 用于处理 api 层来的请求, 封装原始数据
  3. dao 数据访问层: 与数据库, cluster 等交互。 存取数据。

重新调整目录结构

  1. 新创建 /internal 目录用于存放业务信息
  2. /internal 目录下新创建 业务层 /internal/bizk8s dao 层 /internal/k8sdao
  3. apis 接入层 从原来的 /cmd/k8sailor/apis 移动到了 /internal/apis

使用 jarvis, 删除 cobra flags

  1. 统一使用 jarvis 进行变量管理, 因此删除了 global/config.gok8s/cluster.go 原来的 flag 相关变量声明使用的代码
  2. cobra cmd 命令相关代码依旧保留, 感觉以后会用到。
  3. 将原来的 /pkg/k8s 重命名为 /pkg/confk8s, 命名风格更加统一。

获取 deployments 信息

  1. api 处理用户请求参数, 请求 biz Operator 方法
  2. biz Operator, 请求 k8sdao Operator, 并 处理/过滤 原始数据
  3. k8sdao 与 cluster 交互, 返回原始数据。
有点问题, 三个模块, 三次同名方法。 有点麻烦。

kubernete.ClientSet 客户端

/cmd/k8sailor/global/config.go 中声明 KubeClient

并在 /internal/k8sdao/clientset.go 包中赋值给新变量名保存, 使用短名字方便后续调用。

var clientset = global.KubeClient.Client()

在 dao 层获取 deployment 数据

/internal/k8sdao/deployments.go 中, 封装了一个 获取指定 namespace 所有 Pod 的方法。 并返回给下游

func GetAllDeployments(namespace string) ([]appsv1.Deployment, error) {
    ctx := context.TODO()
    opts := metav1.ListOptions{}
    v1Deps, err := clientset.AppsV1().Deployments(namespace).List(ctx, opts)
    if err != nil {
        return nil, err
    }

    return v1Deps.Items, nil
}

在 biz 层提取 dao 层原始数据

业务层 , 调用 dao 层的 api 获取 k8s cluster 的原始数据, 并根据业务世纪需求提取必要信息形成 新的业务层的 Deployment 对象, 并返回给用户。

之前还真不知道, deployment 中有如此多的 replicas 字段(这里还没列举完)

type Deployment struct {
    Name      string `json:"name"`
    Namespace string `json:"namespace"`

    // Replicas 实际期望的 pod 数量
    Replicas int32 `json:"replicas"`

    // 镜像列表
    Images []string `json:"images"`

    Status DeploymentStatus `json:"status"`
}
type DeploymentStatus struct {
    // 标签匹配的 Pod 数量
    Replicas int32 `json:"replicas"`
    // 可用 pod 数量
    AvailableReplicas int32 `json:"availableReplicas"`
    // 不可用数量
    UnavailableReplicas int32 `json:"unavailableReplicas"`
}

同样是在这里, 定义了业务层中 每个方法 的请求参数。

type GetAllDeploymentsInput struct {
    Namespace string `query:"namespace"`
}
// GetAllDeployments 获取 namespace 下的所有 deployments
func GetAllDeployments(input GetAllDeploymentsInput) ([]Deployment, error) {
    v1Deps, err := k8sdao.GetAllDeployments(input.Namespace)
// ... 省略
}

apis 接入层处理用户请求, 返回用户需要的数据

在 apis 接入层中, 定义了各个请求的 方法、路由和处理器(hanlder)

同时也将用户请求绑定到 biz 中的 方法请求参数 上。

func handlerGetAllDeployments(c *gin.Context) {
    params := &deployment.GetAllDeploymentsInput{}
    // 绑定用户请求参数
    err := ginbinder.ShouldBindRequest(c, params)
    if err != nil {
        httpresponse.Error(c, http.StatusBadRequest, err)
        return
    }
    // ...省略
}

ginbinder 是针对 gin 框架封装的一个请求数据绑定库, 可以方便的将 http request 中的请求参数 一次性全部 绑定到 接收者(params)

跑起来

使用 make httpserver 命令启动 server 服务

[GIN-debug] GET    /k8sailor/v0/ping         --> github.com/tangx/k8sailor/internal/apis.RootGroup.func1 (3 handlers)
[GIN-debug] GET    /k8sailor/v0/deployments/ --> github.com/tangx/k8sailor/internal/apis.handlerGetAllDeployments (3 handlers)
[GIN-debug] GET    /k8sailor/v0/deployments/:name --> github.com/tangx/k8sailor/internal/apis.DeploymentRouterGroup.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8088

使用 vscode REST client 请求 /k8sailor/v0/deployments/ 接口

### GET all deployments
GET http://127.0.0.1:8088/k8sailor/v0/deployments?namespace=default

结果与期望一致

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Fri, 24 Sep 2021 18:05:39 GMT
Content-Length: 336
Connection: close

{
  "code": 0,
  "data": [
    {
      "name": "my-nginx-1",
      "namespace": "default",
      "replicas": 1,
      "images": [
        "nginx:alpine"
      ],
      "status": {
        "replicas": 1,
        "availableReplicas": 1,
        "unavailableReplicas": 0
      }
    },
    {
      "name": "my-nginx-2",
      "namespace": "default",
      "replicas": 2,
      "images": [
        "nginx:alpine"
      ],
      "status": {
        "replicas": 2,
        "availableReplicas": 2,
        "unavailableReplicas": 0
      }
    }
  ],
  "error": ""
}

Next

现在数据有了, 接下来要使用 vue3+typescript 在前端展示了。 想想都头疼。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1天前
|
JSON 前端开发 API
【淘系】商品详情属性解析(属性规格详情图sku等json数据示例返回参考),淘系API接口系列
在淘宝(或天猫)平台上,商品详情属性(如属性规格、详情图、SKU等)是商家在发布商品时设置的,用于描述商品的详细信息和不同规格选项。这些信息对于消费者了解商品特性、进行购买决策至关重要。然而,直接通过前端页面获取这些信息的结构化数据(如JSON格式)并非直接暴露给普通用户或开发者,因为这涉及到平台的商业机密和数据安全。 不过,淘宝平台提供了丰富的API接口(如淘宝开放平台API),允许有资质的开发者或合作伙伴通过编程方式获取商品信息。这些API接口通常需要注册开发者账号、申请应用密钥(App Key)和秘钥(App Secret),并遵守淘宝的API使用协议。
|
4天前
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
18 1
|
6天前
|
弹性计算 运维 Kubernetes
Kubernetes(K8S) Controller - Deployment 介绍
Kubernetes(K8S) Controller - Deployment 介绍
8 1
|
1天前
|
Kubernetes 容器 Perl
在k8S中,deployment升级策略是什么?
在k8S中,deployment升级策略是什么?
|
1天前
|
Kubernetes API Perl
在k8S中,deployment升级过程是什么?
在k8S中,deployment升级过程是什么?
|
1天前
|
机器学习/深度学习 缓存 数据处理
《零基础实践深度学习》2.3.3 校验数据有效性 基于飞桨Dataset和DataLoader API完成数据处理
这篇文章详细介绍了在深度学习任务中进行数据处理的步骤,包括数据校验、封装数据读取与处理函数、使用飞桨Dataset和DataLoader API完成数据加载,以及数据增强/增广的方法和实践,旨在确保数据的有效性和提高模型训练效果。
6 0
|
6天前
|
Kubernetes Java Shell
Kubernetes(K8S) Deployment 升级和回滚
Kubernetes(K8S) Deployment 升级和回滚
7 0
|
23小时前
|
Kubernetes 网络安全 Docker
在k8S中,Worker节点加入集群的过程是什么?
在k8S中,Worker节点加入集群的过程是什么?
|
23小时前
|
Kubernetes 安全 数据安全/隐私保护
在k8S中,如何保证集群的安全性?
在k8S中,如何保证集群的安全性?
|
23小时前
|
存储 Kubernetes 监控
在K8S中,worke节点如何加入K8S高可用集群?
在K8S中,worke节点如何加入K8S高可用集群?

推荐镜像

更多