开发 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 在前端展示了。 想想都头疼。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes 开发工具 Docker
微服务实践k8s与dapr开发部署实验(2)状态管理
微服务实践k8s与dapr开发部署实验(2)状态管理
75 3
微服务实践k8s与dapr开发部署实验(2)状态管理
|
12天前
|
Prometheus Kubernetes Cloud Native
云原生周刊:Argo Rollouts 支持 Kubernetes Gateway API 1.0 | 2024.7.1
探索开源世界:Kubetools的推荐系统[Krs](https://github.com/kubetoolsca/krs)助力K8s优化,追踪K8s组件清单,指引IAC集成。阅读建议: Prometheus与Thanos的进化故事,Adidas容器平台管理经验,K8s请求实现详解。关注云原生:Argo Rollouts支持Gateway API 1.0,Kubewarden v1.14强化策略与镜像安全。
|
2月前
|
存储 Kubernetes API
使用Kubernetes管理容器化应用的深度解析
【5月更文挑战第20天】本文深度解析Kubernetes在管理容器化应用中的作用。Kubernetes是一个开源平台,用于自动化部署、扩展和管理容器,提供API对象描述应用资源并维持其期望状态。核心组件包括负责集群控制的Master节点(含API Server、Scheduler、Controller Manager和Etcd)和运行Pod的工作节点Node(含Kubelet、Kube-Proxy和容器运行时环境)。
|
11天前
|
存储 弹性计算 运维
阿里云容器服务Kubernetes版(ACK)部署与管理体验评测
阿里云容器服务Kubernetes版(ACK)是一个功能全面的托管Kubernetes服务,它为企业提供了快速、灵活的云上应用管理能力。
75 2
|
23天前
|
Kubernetes 算法 API
K8S 集群认证管理
【6月更文挑战第22天】Kubernetes API Server通过REST API管理集群资源,关键在于客户端身份认证和授权。
|
26天前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
|
14天前
|
Kubernetes Java 应用服务中间件
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
10 0
|
2月前
|
弹性计算 Kubernetes 监控
【阿里云弹性计算】阿里云 ECS 与 Kubernetes 集成:轻松管理容器化应用
【5月更文挑战第28天】阿里云ECS与Kubernetes集成,打造强大容器管理平台,简化应用部署,实现弹性扩展和高效资源管理。通过Kubernetes声明式配置在ECS上快速部署,适用于微服务和大规模Web应用。结合监控服务确保安全与性能,未来将深化集成,满足更多业务需求,引领容器化应用管理新趋势。
218 2
|
28天前
|
Kubernetes Oracle 关系型数据库
实时计算 Flink版操作报错合集之用dinky在k8s上提交作业,会报错:Caused by: org.apache.flink.table.api.ValidationException:,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
140 0
|
2月前
|
Kubernetes Go Perl
k8s 怎么精准获取deployment关联的pods?
该内容是关于Kubernetes中通过标签获取Deployment管理的Pod的流程和代码示例。首先,Deployment创建ReplicaSets,然后ReplicaSets创建Pod。获取Pod的步骤包括:1) 使用标签选择器获取ReplicaSets;2) 过滤出属于特定Deployment的ReplicaSets;3) 通过标签选择器获取Pod;4) 过滤出属于特定ReplicaSets的Pod。提供的Go代码展示了如何实现这一过程。

推荐镜像

更多