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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 开发 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搭建和管理企业级网站应用
相关文章
|
13天前
|
存储 Kubernetes Cloud Native
告别数据丢失的噩梦!PersistentVolume全攻略,让你轻松玩转Kubernetes数据持久化秘籍!
【8月更文挑战第25天】随着容器技术的发展,Kubernetes已成为云原生应用的主流部署平台。然而,数据持久化成为一个亟待解决的问题。Kubernetes通过PersistentVolume(PV)提供了解决方案。PV是一种存储资源对象,它抽象出底层存储技术(例如Ceph、GlusterFS或NFS),让用户仅需关注存储容量和访问模式等属性。PV由管理员创建与维护,Pod通过PersistentVolumeClaim(PVC)请求存储资源。本文详细介绍了PV的工作原理、配置方法及示例,帮助读者更好地理解和应用此功能。
30 2
|
14天前
|
存储 Kubernetes 安全
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
|
19天前
|
资源调度 Kubernetes API
在K8S中,能否实现不通过api-Server创建Pod?
在K8S中,能否实现不通过api-Server创建Pod?
|
19天前
|
存储 Kubernetes 调度
在k8S中,Pod如何实现数据持久化?数据共享?跨节点Pod如何实现数据共享?
在k8S中,Pod如何实现数据持久化?数据共享?跨节点Pod如何实现数据共享?
|
7天前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
31 0
|
14天前
|
存储 Kubernetes 调度
在K8S中,是怎么实现数据持久化的?
在K8S中,是怎么实现数据持久化的?
|
15天前
|
Kubernetes 负载均衡 API
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
|
15天前
|
Kubernetes 安全 Linux
在K8S中,calico和cilium这两种cni有什么区别?cailico的ipip模型和ciliume的vxlan模型,两种不通模型性能也不同,它们怎么处理数据的?
在K8S中,calico和cilium这两种cni有什么区别?cailico的ipip模型和ciliume的vxlan模型,两种不通模型性能也不同,它们怎么处理数据的?
|
15天前
|
域名解析 Kubernetes 负载均衡
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
|
17天前
|
Kubernetes 关系型数据库 MySQL
k8s练习--通过NFS+PV+PVC+POD,部署一个MySQL服务,并将MySQL的数据进行持久化存储
本文档介绍了如何使用Kubernetes (K8s)、NFS、PersistentVolume (PV)、PersistentVolumeClaim (PVC)和Pod来部署并实现MySQL服务的数据持久化存储。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的强大平台。NFS作为一种网络文件系统协议,能够使Kubernetes集群中的Pod跨节点访问共享文件。PV和PVC机制则提供了持久化的存储解决方案,确保数据即使在Pod生命周期结束后仍得以保留。
下一篇
DDNS