开发 k8s 管理平台 - k8sailor 14. 一些前后端代码优化

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 开发 k8s 管理平台 - k8sailor 14. 一些前后端代码优化

开发 k8s 管理平台 - k8sailor 14. 一些前后端代码优化

原文地址: https://tangx.in/posts/books/k8sailor/chapter02/14-some-optimize/
tag: https://github.com/tangx/k8sailor/tree/feat/14-some-optimize

将 LabelSelector 转换为 Selector

client-go 提供了一个方法, 可以将 Resource 中的 LabelSelector 转换为 Selector, 并且 Selector 结构提供了一些常用的方法。 如 String

import (
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func() {
    selector, _ := metav1.LabelSelectorAsSelector(dep.Spec.Selector)
    x := selector.String()
    fmt.Println(x)
}()

因此在使用 GetXXXByLabels 时, api 层 可以考虑 接收 map[string]string 类型的参数。 而在 biz 层应该将 不同类型 的参数 统一 转换为格式为 key1=value1,key2=value2string 类型参数。 在 dao 层只接收 string 类型的 string。 这样就实现了前后一致性的问题。

自动刷新前端数据

在 vue 中, 如果数据是 响应式 数据, 那么当数据发生变化后, vue 会自动对页面进行刷新。

因此为了实现页面自动刷新, 需要保障:

  1. 循环获取新数据
  2. 解决新数据与老数据 内容一致,顺序不一致 导致的页面刷新。

循环任务

使用 while 循环请求接口不断请求数据, 需要注意的是

  1. 循环一定要设置 间隔时间, typescript 中没有 sleep 函数, 可以使用 Promise 替代实现
  2. 一定要设置 循环开关, 否则循环代码将一直在浏览器中的 后台任务 执行。 并且刷新一次就开启一个后台任务, 如果不加以限制, 机器风扇呜呜呜的转。 琢磨琢磨。
  3. 循环开关 可以放到页面的 onMount() / onUnMount() 两个 生命周期钩子 中实现。

let onOff = reactive({
  loop: false
})

const getAllByNamespaceLoop = async function () {
  while (onOff.loop) {
    let f = getAllByNamespace("default")

    // 间隔时间, ts 中没有 sleep 函数, 所以使用 Promise 实现
    await new Promise(f => setTimeout(f, 2000));
  }
}

onMounted(() => {
  onOff.loop = true
  console.log("onMounted: onOFF.loop", onOff.loop);

  getAllByNamespaceLoop()
})

onUnmounted(() => {
  onOff.loop = false

  console.log("onUnmounted: onOFF.loop", onOff.loop);
})

前端数据排序

typescript 中, 数组 Array 有一个方法 sort( fn(n1,n2):number ), 接收一个 排序函数 作为传参。

排序函数 接收 两个参数 表示元素, 返回一个 数字 类型表示是否交换位置。

  // 对数组进行排序, 避免返回结果数据相同但顺序不同时, vue 不断重新渲染。
  let _items = resp.data.sort(
    (n1: Deployment, n2: Deployment) => {
      if (n1.name >= n2.name) {
        return 1
      }
      return -1
    }
  )
https://stackoverflow.com/a/21689268

使用 informer 订阅 k8s event

使用 infromer 订阅 Core/V1 的 event 事件, 与 EventsV1 的 event 事件略有区别, 大体一致。

    events, err := clientset.EventsV1().Events("default").List(ctx, v1.ListOptions{})
    events2, err := clientset.CoreV1().Events("default").List(ctx, v1.ListOptions{})

提取 event 事件的如下信息

  "involvedObject": {
    "kind": "Pod",
    "namespace": "default",
    "name": "failed-nginx-6df5766f6d-vjn9n",
    "uid": "8726d44b-06b1-4d1c-9bad-efebf3fbb556",
    "apiVersion": "v1",
    "resourceVersion": "685855",
    "fieldPath": "spec.containers{nginx}"
  },
  "reason": "BackOff",
  "message": "Back-off pulling image \"nginx:alpine-11\"",
  "source": {
    "component": "kubelet",
    "host": "tangxin-test"
  },

并封装成一个 map[string]Message 的格式

PodEvent["pod-namesapce-podname"] = Message{
    Reason: "BackOff",
    Message: "Back-off pulling image \"nginx:alpine-11\"",
}

defineProps 传入自定义类型

setup 语法中怎么使用 props 传递值

https://v3.vuejs.org/api/sfc-script-setup.html#defineprops-and-defineemits

传入一个对象

https://v3.vuejs.org/guide/component-props.html#passing-an-object
<blog-post
  :author="{
    name: 'Veronica',
    company: 'Veridian Dynamics'
  }"
></blog-post>

如何传递自定义类型

https://v3.vuejs.org/api/options-data.html#props

Props 支持 默认 的几种类型(全都是 vue 自定义的 interface,所以首写字母都是大写)。 以及自定义的类型

type: can be one of the following native constructors: String, Number, Boolean, Array, Object, Date, Function, Symbol, any custom constructor function or an array of those. Will check if a prop has a given type, and will throw a warning if it doesn't. More information on prop types.

defineProps 使用 PropType 实现自定义类型支持

https://v3.vuejs.org/guide/typescript-support.html#annotating-props
import { defineComponent, PropType } from 'vue'

interface Book {
  title: string
  author: string
  year: number
}

const Component = defineComponent({
  props: {
    name: String,
    id: [Number, String],
    success: { type: String },
    callback: {
      type: Function as PropType<() => void>
    },

    // 使用对象模式表述属性
    book: {
      // 注意这里, 使用 PropType 定义 Constructor
      type: Object as PropType<Book>,
      required: true
    },
    metadata: {
      type: null // metadata is typed as any
    }
  }
})
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3月前
|
Kubernetes 开发工具 Docker
微服务实践k8s与dapr开发部署实验(2)状态管理
微服务实践k8s与dapr开发部署实验(2)状态管理
89 3
微服务实践k8s与dapr开发部署实验(2)状态管理
|
10天前
|
Kubernetes 网络协议 Python
运维开发.Kubernetes探针与应用
运维开发.Kubernetes探针与应用
33 2
|
24天前
|
存储 Kubernetes 容器
k8s卷管理-2
k8s卷管理-2
16 2
|
24天前
|
存储 Kubernetes 调度
k8s卷管理-1
k8s卷管理-1
13 2
|
1月前
|
Kubernetes 持续交付 Python
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。
Kubernetes(通常简称为K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。
|
1月前
|
人工智能 运维 Cloud Native
|
13天前
|
监控 Kubernetes 开发者
不容忽视的实力!Rancher:容器编排平台的领军者,引领行业风潮无人不知无人不晓!
【8月更文挑战第6天】Rancher是容器编排领域的领航者,提供开源容器管理平台,简化Kubernetes操作,支持多集群管理及DevOps工具集成。其直观界面便于部署、监控容器化应用,并提供应用商店加速部署流程。Rancher具备高度灵活性与安全性,支持自动化备份、恢复及容器迁移,确保业务连续性。通过持续创新与社区合作,Rancher引领行业发展,赋能开发者实现高效软件交付。
30 0
|
19天前
|
Kubernetes Cloud Native 搜索推荐
探索云原生技术:Kubernetes在现代应用部署中的角色打造个性化移动体验:从开发到操作系统定制
【7月更文挑战第31天】本文深入探讨了云原生技术的核心组件之一——Kubernetes,并分析了其在现代云计算环境中的关键作用。通过实际代码示例和案例分析,文章揭示了Kubernetes如何优化资源管理、提高部署灵活性以及增强服务的可靠性。读者将获得对Kubernetes操作实践的直观理解,并认识到采用云原生架构对企业数字化转型的推动力。
35 0
|
1月前
|
存储 弹性计算 运维
阿里云容器服务Kubernetes版(ACK)部署与管理体验评测
阿里云容器服务Kubernetes版(ACK)是一个功能全面的托管Kubernetes服务,它为企业提供了快速、灵活的云上应用管理能力。
111 2
|
2月前
|
Kubernetes 算法 API
K8S 集群认证管理
【6月更文挑战第22天】Kubernetes API Server通过REST API管理集群资源,关键在于客户端身份认证和授权。