知识库-什么是MVP(最小可行性产品)及如何构建和验证MVPMVP 是什么?
MVP(最低可行产品,Minimum Viable Product),是美国作家埃里克·莱斯在他的著作《精益创业》里提到的概念,即通过做能满足最基本功能的产品,不断接受用户反馈,快速迭代,直到做出真正符合需求的好产品。
三个基本特征
最小(Minimum)––只有必要的基本功能–只有核心,没有繁琐。
可行(Viable)––这些基本功能必须满足用户的需求。
产品(Product)––一个产品,一个能让用户分享他们对未来发展的反馈意见的东西。
最小可行产品(MVP)与原型(Prototype)初学者往往将原型(Prototype)和最小可行产品(MVP)产生混淆,认为原型就是MVP。其实MVP 和原型是两个不同的概念。 事实上,按照精益创业方法论,它们是产品的两个不同阶段。
产品的不同阶段:
原型设计(Protoyping)
最小化可行产品(MVP)
市场适应性(Product-market fit)
规模化(Scaling)
最小可行产品(MVP) 与原型(Prototype)的主要区别在于MVP是 ...
知识库-术语集合
::bookmark: 通过 ChatGPT 增强
大数据 (Big Data)大数据指的是数据集的体量、种类和处理速度超过了传统数据库软件的能力范围。大数据技术包括数据的采集、存储、处理和分析等各个方面,旨在从大量复杂的数据中提取有价值的信息和洞察。大数据的特点可以总结为“4V”:
Volume(数据量):数据的规模巨大,通常以PB(拍字节)甚至ZB(泽字节)为单位。
Variety(多样性):数据类型多样,包括结构化数据(如数据库中的表格数据)、半结构化数据(如JSON、XML)和非结构化数据(如文本、视频、音频)。
Velocity(速度):数据产生和处理的速度非常快,要求实时或近实时的数据处理能力。
Veracity(真实性):数据质量和准确性不一,需要有效的数据清洗和验证技术。
技术说明:
Hadoop:一个分布式计算框架,利用HDFS(Hadoop分布式文件系统)存储数据,并使用MapReduce进行数据处理。
Spark:一个快速、通用的分布式计算系统,提供内存计算能力,适用于大数据处理、机器学习和实时数据处理。
NoSQL数据库:如MongoDB ...
Hexo-vercel托管博客(静态)背景在[hexo的github-pages文档](GitHub Pages | Hexo) 中有一个github actions的示例,但是其中配置的做法并不科学。它把源代码项目和html项目放到了一个仓库中,用不同的分支来区分,然后还部署到了github pages,github pages必须使用公开仓库。这就导致了网站的源代码和html代码都暴露了,你的所有配置将被一览无余
最佳实践是源代码仓库设置为私有,通过hexo deploy(或者由github action自动化)部署到html仓库。html仓库如果使用github pages部署,必须设置为公开,但通过vercel或者其他托管网站部署则可以设置为私有。
静态代码生成代码 repo 导入 vercel打开vercel官网,注册并登录,关联github账号,新建项目,选择html项目(注意不是源码项目)即可一键部署到vercel。
导入过程中,选择 other 模板即可,默认 ci 命令不用改,Root Directory 也不用改,导入完成后就会自动帮你 deploy。
在导入项目管 ...
Kubernetes
未读K8S-教程—Kubelet垃圾回收机制揭秘为了保证节点资源充足,Kubelet 提供了 Pod 驱逐和垃圾回收功能来保证节点资源不被消耗干净。
Pod 驱逐:当节点资源不足时会根据 Qos 优先级驱逐 Pod 直到清理出足够资源
垃圾回收:清理不需要的容器和镜像以回收资源
Pod 驱逐相关下一篇再分析,今天主要分析 Kubelet 的垃圾回收功能。
相关配置从代码层面来看,Kubelet 中使用两个后台 goroutine 来实现垃圾回收功能。
kubelet 默认开启了垃圾回收功能,kubelet 对容器进行垃圾回收的频率是每分钟一次,对镜像进行垃圾回收的频率是每五分钟一次。
除了间隔时间之外,具体清理逻辑可以通过以下参数进行配置:
kubelet 容器垃圾回收的参数:
--maximum-dead-containers-per-container: 每个 pod 可以保留几个死亡的容器, 默认为 1, 也就是每次把挂掉的容器清理掉.
--maximum-dead-containers: 一个节点上最多有多少个死亡的容器, 默认为 -1, 表示节点不做限制.
--minimu ...
Kubernetes
未读K8S-教程—PV从创建到挂载概述本文主要分析以下两个步骤:
1)PV 的创建:即在 k8s 中创建一个 pv 对象
2)PV 的挂载:即创建 Pod 指定使用该 PVC,Pod 启动后 PV 被挂载到 Pod 中
其中创建部分又可以分为两种:
静态供应:即管理员手动创建 PV
动态供应:由 k8s 根据 PVC 自动创建对应 PV
主流的方式为 动态供应,毕竟管理员无法预估集群使用者需要什么样的 PV,也就不可能提前创建好一模一样的 PV,开发人员又可能不了解存储,无法自己创建,最终只能等 Pod 启动时在通知管理员创建 PV ,这样就太麻烦了。
PV 的创建创建 PVC
这里需要注意 storageClassName,
cat > pvc.yaml << EOFapiVersion: v1kind: PersistentVolumeClaimmetadata: name: csi-test-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 1 ...
Kubernetes
未读K8S-创建集群-使用KubeClipper创建集群什么是 KubeClipperKubeClipper 旨在提供易使用、易运维、极轻量、生产级的 Kubernetes 多集群全生命周期管理服务,让运维工程师从繁复的配置和晦涩的命令行中解放出来,实现一站式管理跨区域、跨基础设施的多 K8S 集群。
KubeClipper 的 3个优势:
1)易使用:图形化页面
提供 Web 控制台,通过点点鼠标即可创建一个 k8s 集群
2)极轻量:架构简单,少依赖
不依赖 ansible,使用方便
3)生产级:易用性和专业性兼顾
提供在线、离线、代理方式部署以及多版本 K8S、CRI、CNI 选择
提供了离线部署方式对国内用户极为友好,毕竟网络才是国内用户装 k8s 的一大难题。
关于该项目的更多信息见:Github Repo 以及官方的这篇介绍文章:KubeClipper——轻量便捷的 Kubernetes 多集群全生命周期管理工具
一句话概括:KubeClipper 是一个轻量便捷的 Kubernetes 多集群全生命周期管理工具。
快速开始准备工作KubeClipper 本身并 ...
DevTools
未读Tools-开发画图工具Excalidrawhttps://excalidraw.com
Graphvizhttps://graphviz.org
PlatUMLhttps://platuml.com/zh/
Matplotlibhttps://matplotlib.org
Kubernetes
未读K8S-Helm打包成OCI格式HELM_CHART ?= charts/tomcatHELM_CHART_NAME = tomcatHELM_CHART_VERSION ?= $(VERSION)ifeq ($(findstring v,$(HELM_CHART_VERSION)),v) HELM_CHART_SEM_VERSION := $(patsubst v%,%,$(HELM_CHART_VERSION))else HELM_CHART_SEM_VERSION = $(HELM_CHART_VERSION)endifHELM_PUSH_FLAGS ?= ""HELM_REGISTRY_SERVER = "".PHONY: helm-packagehelm-package: ## Helm package @echo "HELM_CHART_VERSION: $(HELM_CHART_VERSION)" @echo "HELM_CHART_SEM_VERSION: ...
Kubernetes
未读K8S-Helm-在模板内部访问文件(读取监控面板json文件)
将 grafana dashboard 监控面板数据文件引入到模板中
方法一: 读取指定目录下文件内容{{- if .Values.controller.dashboard.enabled -}}apiVersion: v1kind: ConfigMapmetadata: name: controller-dashboarddata: "trms-dashboard.json": | {{ .Files.Get "dashboards/trms-controller-dashboard.json" | indent 4}}{{- end }}
方法二: 使用了tuple方法创建了一个可遍历的文件列表
:warning: controller-dashboard.json文件需要在 chart 根目录下
{{- if .Value ...
K8S-envtest中将rest.Config转成clientcmd.Config
在on k8s的 apiserver中使用 envtest 进行e2e 测试,正在使用 envtest 来创建 Kubernetes 测试环境,envtest 应该已经帮你创建了一个临时的 Kubernetes 集群和相应的 kubeconfig
在这种情况下,testEnv.Start() 返回的是 *rest.Config 类型的对象,表示与创建的临时 Kubernetes 集群通信的配置。
如果你希望将这个 *rest.Config 对象设置为环境变量 KUBECONFIG,你需要将它序列化为 kubeconfig 文件,然后再设置为环境变量。
var kubeConfig *rest.Configvar kubeClient client.Clientvar testEnv *envtest.Environmentvar ctx context.Contextconst ( baseDomain = "http://127.0.0.1:8888" baseURL = ...
VersionControl
未读Git-如何删除git中的第一个提交背景常见的情形是在你开始工作时忘记运行 git config 来设置你的名字与邮箱地址, 或者你想要开源一个项目并且修改,如果是个人项目,可以尝试使用最新 commit强制刷新之前的提交记录
操作重新设置基数将在一定程度上发挥作用。然而,第一次(按时间顺序是最早的git提交)总是会有问题,因为它没有父级,所以这将会出错。
对我来说,这些答案都不能完全解决这个问题。但是经过大量的搜索和反复的尝试,我发现这是可行的!
git update-ref -d HEAD # 执行完之后变成全新的 workspace,需要执行 add && commitgit add . && git commit -s -m "Chore: template project"git push -f origin main # 强制提交
来自 ChatGPT(未实操)如果你已经执行了 git update-ref -d HEAD 来删除了 HEAD 引用,那么你可能需要进行以下步骤来删除 repo 的第一个 commit ...
VersionControl
未读Git-rebase-合并多个已经push的commit背景开发过程中,本地通常会有无数次 commit ,可以合并“相同功能”的多个 commit,以保持历史的简洁。
git rebase# 从HEAD版本开始往过去数3个版本$ git rebase -i HEAD~3# 合并指定版本号(不包含此版本)$ git rebase -i [commitid]
说明:
-i(--interactive):弹出交互式的界面进行编辑合并
[commitid]:要合并多个版本之前的版本号,注意:[commitid] 本身不参与合并
指令解释(交互编辑时使用):
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like “squash”, but discard this com ...