创建k8s operator
目录
1.前提条件
2.进一步准备
2.1.安装golang
2.2.安装code(vscode的linux版本)
2.3.安装kubebuilder
3.开始创建Operator
3.1.什么是operator?
3.2.GV & GVK & GVR
3.3.创建operator
3.3.1. 生成工程框架
3.3.2.生成api(GVK)
3.3.3.实现代码逻辑,更新yaml定义
3.3.3.1.实现CR
3.3.3.2.(依据代码定义)更新yaml
3.3.3.3.实现controller的Reconcile的方法
3.3.4.安装CRD
3.3.5.本地运行
3.3.5.1.运行项目
3.3.5.2.测试
3.3.5.1.1.准备测试CRD的yaml配置
3.3.5.1.2.使用kubectl apply将CRD 实例部署到集群中
3.3.5.3.停止运行
3.3.5.3.1.删除自定义的CRD实例
3.3.5.3.1.停止工程运行
3.3.6.集群运行测试
3.3.6.1.修改Makefile
3.3.6.2.将应用部署到k8s集群上
3.3.6.3.测试
3.3.6.4.停止运行
参考文章
1.前提条件
使用kind搭建本地k8s集群之后,会准备好以下内容:
- 本地多节点集群
- kubectl 客户端命令工具
- Lens k8s dashboard 可视化客户端工具
2.进一步准备
2.1.安装golang
按教程安装
当前安装版本是:1.17.2
2.2.安装code(vscode的linux版本)
这里有两种方式,一种是已经在windows上安装了vscode的情况下,希望在子系统的Ubuntu中也能使用vscode,一种是直接在Ubuntu安装Vscode。
我这里使用的第一种,按官方教程安装。如果是第二种,请按此方法安装。
# 使用命令打开vscode
code .
WSL2和Win10的文件夹是互通的,当然可以直接在Win10中双击打开VScode,然后打开对应的项目路径,但是这样就有个缺点,无法在Terminal中使用一些Unbuntu的命令,有时候问题不大,但我们操作k8s的客户端是基于kubectl的,这个是使用这种方式的最重要原因,后续调试需要的必须条件。
2.3.安装kubebuilder
按官方文档安装
os=$(go env GOOS)
arch=$(go env GOARCH)# download kubebuilder and extract it to tmp
curl -L https://go.kubebuilder.io/dl/2.2.0/${os}/${arch} | tar -xz -C /tmp/# move to a long-term location and put it on your path
# (you'll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else)
sudo mv /tmp/kubebuilder_2.2.0_${os}_${arch} /usr/local/kubebuilder
export PATH=$PATH:/usr/local/kubebuilder/bin
校验kubebuilder安装后的情况
3.开始创建Operator
3.1.什么是operator?
我理解就是K8s的核心组件无法满足一些特定需求,而提供给开发者一个自定义资源的机会。当然,在我参考的文章中,也有比较系统的描述。但是从我的角度,确实比较易懂的解释就是这样的。既然是自定义资源,那我们需要知道一个资源需要有那些要素,这样才能定义
3.2.GV & GVK & GVR
-
GV: Api Group & Version
- API Group 是相关 API 功能的集合
- 每个 Group 拥有一或多个 Versions
-
GVK: Group Version Kind
- 每个 GV 都包含 N 个 api 类型,称之为
Kinds
,不同Version
同一个Kinds
可能不同
- 每个 GV 都包含 N 个 api 类型,称之为
-
GVR: Group Version Resource
Resource
是Kind
的对象标识,一般来Kind
和Resource
是1:1
的,但是有时候存在1:n
的关系,不过对于 Operator 来说都是1:1
的关系
我们看个例子
apiVersion: apps/v1 # 这个是 GV,G 是 apps,V 是 v1
kind: Deployment # 这个就是 Kind
metadata: # 这个是当前这种资源的媒体信息,你可以理解为detail infoname: local-path-provisionernamespace: local-path-storage...
spec: # spec就是Resource了,GVR中的R...
3.3.创建operator
3.3.1. 生成工程框架
# 创建工程文件夹
mkdir create-crd-demo
# 使用kubebuilder初始化一个项目框架
# --domain: 资源域名,结合后续步骤进一步理解一下
# --repo: project是一个golang工程,go工程使用package管理,这个是go.mod的module信息,如果该工程要作为其他工程的导入包,那这个就要填可访问的repo路径才可以,此处只要不是没意义的就可以了。
kubebuilder init --domain geoff.crd.demo --repo k8s-operator/kubebuilder-crd-demo
具体的工程目录如下:
.
├── Dockerfile # 工程Dockerfile,构建镜像的时候使用
├── Makefile # 定义make命令集合,将一些命令定义成一个function XXX, 然后make XXX执行命令。
├── PROJECT # 项目信息
├── README.md # 工程说明
├── config # 这个是生成CRD所需要的yaml定义,使用Kustomize管理
│ ├── default # 一些默认配置
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager # 部署CRD所需的 yaml
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus # Prometheus监控相关配置,demo应该用不到
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ └── rbac # 部署所需的 rbac 授权 yaml
│ ├── auth_proxy_client_clusterrole.yaml
│ ├── auth_proxy_role.yaml
│ ├── auth_proxy_role_binding.yaml
│ ├── auth_proxy_service.yaml
│ ├── kustomization.yaml
│ ├── leader_election_role.yaml
│ ├── leader_election_role_binding.yaml
│ ├── role_binding.yaml
│ └── service_account.yaml
├── go.mod # 项目直接依赖(直接)
├── go.sum # 项目全部依赖(直接+间接)
├── hack
│ └── boilerplate.go.txt
└── main.go # 项目程序启动入口
3.3.2.生成api(GVK)
刚才只是创建一个工程框架,一个壳子,接下来,我们创建一个api
# 创建k8s的api (GVK)
kubebuilder create api --group apps --version v1 --kind CustomeCrdDemo
我们注意到,工程目录多出了一些文件夹
.
├── Dockerfile
├── Makefile
├── PROJECT
├── README.md
├── api # 新生成的和api(GVK)相关的定义
│ └── v1
│ ├── customecrddemo_types.go # 这里是定义 spec 的地方
│ ├── groupversion_info.go # GV 的定义,一般无需修改
│ └── zz_generated.deepcopy.go # 和deepcopy相关的方法
├── bin
│ └── controller-gen # 和go generater tool
├── config
│ ├── crd # 自动生成的CRD文件,不用修改这里,只需要修改了v1中的go文件,之后执行make generate会更新当前目录的yaml定义文件
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_customecrddemoes.yaml
│ │ └── webhook_in_customecrddemoes.yaml
│ ├── default
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ ├── rbac
│ │ ├── auth_proxy_client_clusterrole.yaml
│ │ ├── auth_proxy_role.yaml
│ │ ├── auth_proxy_role_binding.yaml
│ │ ├── auth_proxy_service.yaml
│ │ ├── customecrddemo_editor_role.yaml
│ │ ├── customecrddemo_viewer_role.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── role_binding.yaml
│ │ └── service_account.yaml
│ └── samples # 这里是CRD示例文件,可以使用`kubectl apply -f`用来部署到集群当中
│ └── apps_v1_customecrddemo.yaml
├── controllers
│ ├── customecrddemo_controller.go # 在这里实现 CRD controller的逻辑
│ └── suite_test.go # 这里写测试
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
└── main.go
3.3.3.实现代码逻辑,更新yaml定义
3.3.3.1.实现CR
到上面部分为止,我们已经通过kubebuilder生成了CRD所需的项目框架,接下来我们进行自定义开发,此时我们使用VScode来开发吧
# 在当前目录下打开VScode
code .
我们随便增加CRD的spec字段,增加ResourceName、AdditionalInfo。这字段会在之后生成的yaml文件中的spec字段体现。
//……
// CustomeCrdDemoSpec defines the desired state of CustomeCrdDemo
type CustomeCrdDemoSpec struct {// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster// Important: Run "make" to regenerate code after modifying this file// Foo is an example field of CustomeCrdDemo. Edit customecrddemo_types.go to remove/update// Foo string `json:"foo,omitempty"`// 资源名称ResouresName string `json:"resourceName,omitempty"`// 附加信息AdditionalInfo string `json:"additionalInfo,omitempty"`
}
//……
3.3.3.2.(依据代码定义)更新yaml
执行命令更新yaml,这里我们直接在VScode的Terminal中执行就可以了,不需要在WSL2上执行命令,方便开发。
# 重新生成yaml文件
make manifests generate
更新yaml,struct上字段备注成为了description,是有意义的
# 新生成的yaml文件:config/crd/bases/apps.geoff.crd.demo_customecrddemoes.yaml
……
spec:description: CustomeCrdDemoSpec defines the desired state of CustomeCrdDemoproperties:additionalInfo:description: 附加信息type: stringresourceName:description: 资源名称type: string
……
其中,yaml的路径和生成项目时设置的--domain是有关系的。
3.3.3.3.实现controller的Reconcile的方法
不做复杂的实现,只增加日志打印。
// For more details, check Reconcile and its Result here:
// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.11.2/pkg/reconcile
func (r *CustomeCrdDemoReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {log := log.FromContext(ctx)// TODO(user): your logic herelog.Info("=========================== Create a new CRD instance ===========================")return ctrl.Result{}, nil
}
3.3.4.安装CRD
# 往k8s安装CRD的定义
make install
3.3.5.本地运行
3.3.5.1.运行项目
# 运行工程应用
make run
运行之后,项目成功跑起来了,没有报错就算是成功了。
3.3.5.2.测试
3.3.5.1.1.准备测试CRD的yaml配置
我们自己定义的struct有两个字段,一个是resourceName、AdditionalInfo,我们要实现一个CRD的实例dem哦,目前项目工程路径:config/samples/xxx.yaml下有个自动生成的CRD模板,我们按照定义需要给这两个字段配置信息。
apiVersion: apps.geoff.crd.demo/v1
kind: CustomeCrdDemo
metadata:name: customecrddemo-sample
spec:# TODO(user): Add fields hereresourceName: "my-crd-instance-1"AdditionalInfo: "这是我测试的第一个CRD资源实例"
3.3.5.1.2.使用kubectl apply将CRD 实例部署到集群中
# 使用kubectl apply一个CRD实例
# 其中项目目录下config/samples/xxx.yaml是make generate mainfests生成的
kubectl apply -f ./config/samples/apps_v1_customecrddemo.yaml
3.3.5.3.停止运行
3.3.5.3.1.删除自定义的CRD实例
# 删除了刚刚的CRD demo实例
kubectl delete -f config/samples/
3.3.5.3.1.停止工程运行
直接在Vscode的Terminal中执行:Ctrl+C即可停止项目运行
3.3.6.集群运行测试
上一章节,我们看到可以在本地run了project,直接看到当CRD被部署后,直接触发了我们controller中实现的日志。实际上,我们开发好了之后,这个operator application是要部署到k8s集群上的,主要controller的实现逻辑,这样CRD才能起作用。如何操作其实工程的README.md也有说明的,可以先看看。
3.3.6.1.修改Makefile
# 本地集群的名称
KUBE_CLUSTER = k8s-local-dev ……# 增加一个function,将本地的image上传到Kind的容器中
.PHONY: kind-load
kind-load: ## load the local image to the kind clusterkind load docker-image ${IMG} --name ${KUBE_CLUSTER}……
3.3.6.2.将应用部署到k8s集群上
以下是部署到集群的步骤:构建镜像、上传到集群容器中、部署
其中IMG是一个可以自行设置镜像名的变量,此处为:k8s-crd-demo:1.0。
按如下命令执行后,即可在k8s集群中看到部署的CRD controller应用。
# 构建镜像(有时候会失败,可能是网络问题,多试几遍),IMG需要指定,不然后面部署还是有问题
make docker-build IMG=k8s-crd-demo:1.0
# local镜像上传到Kind创建的k8s集群所在的所有node中(如果本地是)
make kind-load IMG=k8s-crd-demo:1.0
# 部署controller
make deploy IMG=k8s-crd-demo:1.0
在这个过程中,bin/目录存在一些二进制的工具包,可以先删除,是之前make run时下载的,有可能会报错。
3.3.6.3.测试
同上面3.3.5.2,直接测试即可
3.3.6.4.停止运行
# undeploy controller
make undeploy
# 卸载CRD
make uninstall
参考文章
如何在 Ubuntu 20.04 上安装 Go-腾讯云开发者社区-腾讯云
开始通过 WSL 使用 VS Code | Microsoft Learn
快速入门 - Kubebuilder 中文文档
3. KubeBuilder 简明教程 - Mohuishou
相关文章:
创建k8s operator
目录 1.前提条件 2.进一步准备 2.1.安装golang 2.2.安装code(vscode的linux版本) 2.3.安装kubebuilder 3.开始创建Operator 3.1.什么是operator? 3.2.GV & GVK & GVR 3.3.创建operator 3.3.1. 生成工程框架 3.3.2.生成api(GVK) …...
python模拟登入某平台+破解验证码
概述 python模拟登录平台,遇见验证码识别!用最简单的方法seleniumda破解验证码,来自动登录平台 详细 python用seleniumxpath模拟登录破解验证码 先随便找个小说平台用户登陆 - 书海小说网用户登陆 - 书海小说网用户登陆 - 书海小说网 准…...
【图像分割】理论篇(2)经典图像分割网络基于vgg16的Unet
UNet 是一种用于图像分割任务的深度学习架构,最早由 Olaf Ronneberger、Philipp Fischer 和 Thomas Brox 在2015年的论文 "U-Net: Convolutional Networks for Biomedical Image Segmentation" 中提出。UNet 在医学图像分割等领域取得了显著的成功&#x…...
vue插入重复的html内容
vue添加重复的html内容是通过绑定一个数组来v-for循环实现的。 效果展示: 首先创建数组,里面为重复内容的数量,里面默认存在一个初始值。 然后通过v-for来绑定这个数组,循环数据。 通过添加点击事件,来增加或删除数组…...
计算机网络-物理层(三)-信道的极限容量
计算机网络-物理层(三)-信道的极限容量 当信号在信道中传输失真不严重时,在信道的输出端,这些信号可以被识别 当信号在信道中,传输失真严重时,在信道的输出端就难以识别 造成失真的因素 码元传输速率信号传输距离噪声干扰传输媒…...
Http/Websocket协议的长连接和短连接的错误认识详细解读(史上最通俗)
从一个问题聊起: Http/Websocket 都称为一种协议,能用现实中的例子来解释协议吗? AI 举例: 您(客户端): 您坐在餐厅桌子上,想点一份菜单。 服务员(服务器)…...
两两交换链表中的节点
你存在,我深深的脑海里~ 题目: 示例: 思路: 这个题有点类似于反转一个单链表,不同的地方在于这个题不全反转,所以我们不同的地方在于此题多用了一个prve指针保存n1的前一个节点,以及头的改变&a…...
HTTP与RPC的取舍
HTTP与RPC的取舍 HTTP和RPC都是常用的网络通信协议,它们各有优劣。选择何种协议,主要取决于应用的需求和场景。 HTTP和RPC都有各自的优点和缺点,首先我们对两种协议进行一个总结。 HTTP协议图 HTTP的优点: 广泛的支持࿱…...
微前端学习(上)
一、课程目标 微前端概念;现有方案利弊;Single-spa实现原理;掌握使用qiankun搭建微应用;二、课程大纲 微前端背景现在web应用面临的问题微前端的价值微前端应用具备哪些能力微前端解决方案有哪些基于qiankun的实践1、微前端背景 2014年: Martin Fowler和James Lewis共同提…...
【Axure视频教程】标签版多选下拉列表
今天教大家在Axure里如何制作标签版多选下拉列表的原型模板,该模板用中继器制作,制作完成后使用也方便,只需要在中继器表格里维护选项信息,即可自动生成交互效果,包括显示隐藏选项列表,选中和取消选中选项&…...
Sharepoint2013必备软件安装路径
SP2013是最后一个有foundation版本的,后续各个版本都是server版,要买lisence。免费的可以用,但安装组件有些链接已经失效了,自己手动下载的路径备份一下,已经下载好的完整版,在文章最后可以直接下载&#x…...
C++day4(关系运算符的重载)
关系运算符重载的作用:可以让两个自定义类型对象进行对比操作。 代码实现关系运算符的重载: #include <iostream>using namespace std;class Person {// friend const Person operator(const Person &L, const Person &R); private:int …...
农业水价综合改革系统主要组成
一、系统概述 农业水价改革灌区信息化系统主要由感知采集层、网络传输层、系统应用层等部分组成。通过无线技术、感知层技术与新型应用的有效结合,可以用于各种业务的传送,充分满足灌区监测站间的物与物互联,农业生产的自动化和信息化相结合。…...
使用批处理文件(.bat)启动多个CMD窗口并执行命令
由于每次启动本机的mongodb和kafka,都需要进入相关目录进行启动,操作相对繁琐,于是想起了批处理来帮忙一键启动。 在桌面新建一个txt文件,改后缀名为.bat,并加上下面的代码。 cd /d D:\env-java\mongodb-win32-x86_64…...
开源项目-会议室预约管理系统
哈喽,大家好,今天给大家带来一个开源项目-会议室管理系统。项目基于SpringBoot+VUE开发。 会议室管理系统主要分为 前台会议室预约管理系统 和 会议室后台管理系统 两部分 前台会议室预约管理系统主要有申请会议室,预约进程,查看历史会议三部分 后台管理系统主要有会议室…...
Flask路由注册route的几种方式
前言 Flask路由注册的三种方式: app.routeapp.add_url_rule蓝图 app.route(添加变量) from flask import Flaskapp Flask(__name__) app.config.from_pyfile(config/base_setting.py) app.route("/") def hello():return "…...
Elasticsearch 查询之Function Score Query
前言 ES 的主查询评分模式分为两种,是信息检索领域的重要算法: TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分(relevance scoring)算法。在此之前,Elasticsearch 使…...
【3D激光SLAM】LOAM源代码解析--scanRegistration.cpp
系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…...
解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题
解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题 LLM(Large Language Model)通常拥有大量的先验知识,使得其在许多自然语言处理任务上都有着不错的性能。 但,想要直接利用 LLM 完成…...
Apipost:提升API开发效率的利器
在数字化时代,API已经成为企业和开发者实现业务互通的关键工具。然而,API的开发、调试、文档编写以及测试等工作繁琐且复杂。Apipost为这一问题提供了完美的解决方案。 Apipost是一款专为API开发人员设计的协同研发平台,旨在简化API的生命周…...
论文解读:Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions
发布时间:2022.4.4 (2021发布,进过多次修订) 论文地址:https://arxiv.org/pdf/2112.08088.pdf 项目地址:https://github.com/wenyyu/Image-Adaptive-YOLO 虽然基于深度学习的目标检测方法在传统数据集上取得了很好的结果…...
springboot 基于JAVA的动漫周边商城的设计与实现64n21
动漫周边商城分为二个模块,分别是管理员功能模块和用户功能模块。管理员功能模块包括:文章资讯、文章类型、动漫活动、动漫商品功能,用户功能模块包括:文章资讯、动漫活动、动漫商品、购物车,传统的管理方式对时间、地…...
uniapp - 全平台兼容实现上传图片带进度条功能,用户上传图像到服务器时显示上传进度条效果功能(一键复制源码,开箱即用)
效果图 uniapp小程序/h5网页/app实现上传图片并监听上传进度,显示进度条完整功能示例代码 一键复制,改下样式即可。 全部代码 记得改下样式,或直接...
第 7 章 排序算法(2)(冒泡排序)
7.5冒泡排序 7.5.1基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部…...
软件测试技术之可用性测试之WhatsApp Web
Tag:可行性测试、测试流程、结果分析、案例分析 WhatsApp是一款面向智能手机的网络通讯服务,它可以通过网络传送短信、图片、音频和视频。WhatsApp在全球范围内被广泛使用,是最受欢迎的即时聊天软件。 虽然,在电脑上使用WhatsAp…...
制作 Mikrotik CHR AWS AMI 镜像
文章目录 制作 Mikrotik RouterOS CHR AWS AMI 镜像前言前期准备配置 Access Key安装配置 AWS CLI创建 S3 bucket上传 Mikrotik CHR 镜像trust-policy配置role-policy 配置创建 AMI导入镜像查看导入进度导入进度查看注册镜像参考:制作 Mikrotik RouterOS CHR AWS AMI 镜像 前言…...
科技成果鉴定测试有什么意义?专业CMA、CNAS软件测评公司
科技成果鉴定测试是指通过一系列科学的实验和检测手段,对科技成果进行客观评价和鉴定的过程。通过测试,可以对科技成果的技术优劣进行评估,从而为科技创新提供参考和指导。 一、科技成果鉴定测试的意义 1、帮助客户了解科技产品的性能特点和…...
知识储备--基础算法篇-排序算法
1.知识--时间复杂度和空间复杂度 1.2时间复杂度 一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。 1.3空间复杂度 空间复杂度不是程序占用了多少bytes的空间,空间复杂度算的是变量的个…...
Qt+C++动力监控动画仿真SCADA上位机
程序示例精选 QtC动力监控动画仿真SCADA上位机 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对<<QtC动力监控动画仿真SCADA上位机>>编写代码,代码整洁,规则…...
Flask 单元测试
如果一个软件项目没有经过测试,就像做的菜里没加盐一样。Flask 作为一个 Web 软件项目,如何做单元测试呢,今天我们来了解下,基于 unittest 的 Flask 项目的单元测试。 什么是单元测试 单元测试是软件测试的一种类型。顾名思义&a…...
关于官方网站建设情况的汇报/广告推广策划方案
DedeCMS Error:Tag disabled:"php" more...! 问:DedeCMS Error:Tag disabled:"php" more...! 解决办法:查找你的模板里是否使用了:{dede:php}**{/dede:php} 这样的代码,如果有,清除…...
网站上动态图片怎么做/网站维护一般都是维护什么
http://www.lydsy.com/JudgeOnline/problem.php?id2020 和背包差不多 同样滚动数组 f[j]表示当前位置j份食物的最小价值 f[j]min(f[j-l]l*c) 1<l<f 而且在每一步走的时候 f[j]j 然后就行了。。 #include <cstdio> #include <cstring> #include <cmath>…...
教学网站开发应用指导方案/seo的主要工作是什么
文章目录前言1 RFM模型介绍2 代码实践(1) 导入库(2) 读取数据(3) 数据审查(4) 数据预处理,去除缺失值和异常值(5) 确定RFM划分区间(6)计算RFM因子权重(7)RFM计算过程(8) 保存结果到excel总结**小小结**:3 案例数据结论…...
网站怎么收录/长沙优化排名推广
Tab 使选中的代码向右 Shift Tab 使选中的代码向左...
精品网站设计/海外网络推广方案
转自 (http://www.cnblogs.com/armlinux/archive/2010/08/30/2396931.html)一、开发环境主 机:VMWare--Fedora 9开发板:Mini2440--64MB Nand, Kernel:2.6.30.4编译器:arm-linux-gcc-4.3.2二、背景知识1. LCD工作的硬件…...
网络营销公司都做什么的/网站如何优化流程
1. PostgreSQL基于非易失性内存优化探索-07/22Intel于2019年首次完成PCM商品化,其3D XPoint傲腾系列持久内存新硬件具有可字节寻址、非易失、大容量、堪比内存的速度特性,这种新硬件的出现必将推动存储生态的进一步变革。传统关系型数据库例如MySQL、Pos…...