kind kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?

文章目录
- 1. Prometheus 简介
- 2. Prometheus 优势
- 3. Prometheus 架构图
- 4. Prometheus-Operator 简介
- 5. Prometheus-Operator 架构图
- 6. 环境准备
- 7. Kind 部署 Kubernetes
- 7.1 安装 Ingress-nginx 组件
- 7.2 安装 Metric Server 组件
- 8. helm 快速安装 Prometheus-Operator
- 9. 定制 Prometheus-Operator helm charts
- 9.1 获取镜像方法
- 9.2 定制内容
- 9.3 打包
- 9.4 推送 helm package 至 GitHub Package
- 9.5 推送 helm package 至私有 harbor
- 10. helm 安装定制化的 kube-prometheus-stack
- 11. 域名访问
- 12. 清理应用
1. Prometheus 简介
Prometheus 是由前 Google 工程师从 2012 年开始在 Soundcloud 以开源软件的形式进行研发的系统监控和告警工具包,自此以后,许多公司和组织都采用了 Prometheus 作为监控告警工具。Prometheus 的开发者和用户社区非常活跃,它现在是一个独立的开源项目,可以独立于任何公司进行维护。为了证明这一点,Prometheus 于 2016 年 5 月加入 CNCF 基金会,成为继 Kubernetes 之后的第二个 CNCF 托管项目。
2. Prometheus 优势
- 由指标名称和和键/值对标签标识的时间序列数据组成的多维数据模型。
- 强大的查询语言 PromQL。
- 不依赖分布式存储;单个服务节点具有自治能力。
- 时间序列数据是服务端通过 HTTP 协议主动拉取获得的。
- 也可以通过中间网关来推送时间序列数据。
- 可以通过静态配置文件或服务发现来获取监控目标。
- 支持多种类型的图表和仪表盘
3. Prometheus 架构图

组件说明:
Prometheus Server: 用于收集和存储时间序列数据;Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server;PushGateway: pushgateway是采用被动推送来获取监控数据的 prometheus 插件,它可以单独运行在任何节点上,并不一定要运行在被监控的客户端。而后通过用户自定义编写的脚本把需要监控的数据发送给 pushgateway,pushgateway再将数据推送给prometheus server;Exporters: 负责监控机器运行状态,提供被监控组件信息的 HTTP 接口被叫做 exporter;Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警;Grafana:一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测工具,它可以大大帮助我们简化监控的复杂度,我们只需要提供需要监控的数据,它就可以帮助生成各种可视化仪表,同时它还有报警功能,可以在系统出现问题时发出通知。
4. Prometheus-Operator 简介
-
Kubernetes Operator 是由 CoreOS 公司开发的,用来扩展 Kubernetes API,特定的应用程序控制器,它用来创建、配置和管理复杂的有状态应用,如数据库、缓存和监控系统。Operator基于 Kubernetes 的资源和控制器概念之上构建,但同时又包含了应用程序特定的一些专业知识,比如创建一个数据库的Operator,则必须对创建的数据库的各种运维方式非常了解,创建Operator的关键是CRD(自定义资源)的设计。
-
Kubernetes CRD 是对 Kubernetes API 的扩展,Kubernetes 中的每个资源都是一个 API 对象的集合,例如我们在 YAML文件里定义的那些spec都是对 Kubernetes 中的资源对象的定义,所有的自定义资源可以跟 Kubernetes 中内建的资源一样使用 kubectl 操作。
-
Prometheus Operator 提供 Kubernetes 原生部署和管理
Prometheus及相关监控组件。该项目的目的是为 Kubernetes 集群简化和自动化基于 Prometheus 的监控堆栈的配置。
Prometheus Operator 特性:- Kubernetes 自定义资源:使用 Kubernetes 自定义资源部署和管理 Prometheus、Alertmanager 及相关组件。
- 简化的部署配置:配置 Prometheus 的基础知识,例如版本、持久性、保留策略和本地 Kubernetes 资源的副本。
- Prometheus Target Configuration:根据熟悉的Kubernetes标签查询,自动生成监控目标配置;无需学习普罗米修斯特定的配置语言。
5. Prometheus-Operator 架构图

这篇文章我将在kind部署的kubernets集群内通过 helm 工具安装定制化的 Prometheus-Operator 。
6. 环境准备
- 安装系统 Centos 8.2
- 初始化 Centos 8.2
- 安装 Podman,它是 Podman 最初由红帽工程师联合开源社区一同开发的无守护进程的下一代容器管理工具,即 Docker 替代者。
- 安装 Kubectl
安装 Kind, 它是一个 Kubernetes 孵化项目,一套开箱即用的 Kubernetes 环境搭建方案。顾名思义,就是将 Kubernetes 所需要的所有组件,全部部署在一个 Docker 容器中。
curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.17.0/kind-linux-amd64
chmod +x ./kind
mv ./kind /usr/local/bin/kind
- 安装 helm 命令
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
或者
$ wget https://get.helm.sh/helm-v3.11.0-linux-amd64.tar.gz
$ tar -xzvf helm-v3.11.0-linux-amd64.tar.gz
$ cp linux-amd64/helm /usr/local/bin/
$ helm version
version.BuildInfo{Version:"v3.11.0", GitCommit:"d14138609b01886f544b2025f5000351c9eb092e", GitTreeState:"clean", GoVersion:"go1.17.5"}
7. Kind 部署 Kubernetes
config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-planekubeadmConfigPatches:- |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"extraPortMappings:- containerPort: 80hostPort: 80protocol: TCP- containerPort: 443hostPort: 443protocol: TCP
创建 K8s 集群:
$ kind create cluster --config config.yaml
enabling experimental podman provider
Creating cluster "kind" ...✓ Ensuring node image (kindest/node:v1.25.3) 🖼✓ Preparing nodes 📦✓ Writing configuration 📜✓ Starting control-plane 🕹️✓ Installing CNI 🔌✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:kubectl cluster-info --context kind-kindHave a nice day! 👋
7.1 安装 Ingress-nginx 组件
kubectl create -f https://ghproxy.com/https://raw.githubusercontent.com/lyzhang1999/resource/main/ingress-nginx/ingress-nginx.yaml
7.2 安装 Metric Server 组件
系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存、磁盘、CPU和网络的使用率等信息。Metric Server组件是实现服务自动扩容不可或缺的组件。
kubectl apply -f https://ghproxy.com/https://raw.githubusercontent.com/lyzhang1999/resource/main/metrics/metrics.yaml
等待 Metric 工作负载就绪
kubectl wait deployment -n kube-system metrics-server --for condition=Available=True --timeout=90s
Metric Server 就绪后,我们通过 kubectl autoscale 命令来为 Deployment 创建自动扩容策略。但这篇不是重点。
8. helm 快速安装 Prometheus-Operator
默认安装方式:
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm upgrade prometheus prometheus-community/kube-prometheus-stack \
--namespace prometheus --create-namespace --install \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=falseRelease "prometheus" does not exist. Installing it now.
......
STATUS: deployed
但我本地的 linux 环境会有没有“科学网络”,所以部署实际会卡住很长一段时间,最后报:Error: failed pre-install: timed out waiting for the condition,查看 pod 报以下错误:
$ k get pods -n prometheus
NAME READY STATUS RESTARTS AGE
prometheus-kube-prometheus-admission-create-7494p 0/1 ImagePullBackOff 0 6m20s$ k get pods -n prometheus prometheus-kube-prometheus-admission-create-7494p -oyaml
.......state:waiting:message: Back-off pulling image "registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0"reason: ImagePullBackOff
........
没有真正的全球互联网,我们无法拉取 registry.k8s.io。需要对重新定制自己的 prometheus helm charts
9. 定制 Prometheus-Operator helm charts
9.1 获取镜像方法
但由于隐形墙的原因,我们无法下载拉取以下:
registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.0
所以,你可以获取registry.k8s.io的方法:
- 购买国外
VPS拉取镜像推送至DockerHub - 通过配置代理拉取镜像,需施展要魔法技能。
- 去 DockerHub、quay.io 寻找他人推送的对应版本的镜像。
- 利用 Github Action 实现镜像自动迁移。fork来自@togettoyou YYDS
这里我由于只是用于测试,直接从 DockerHub 获取他人已经推送好的镜像,当然,这种方法不敢保证别人已经做过改动,存在风险,生产谨慎使用。
9.2 定制内容
- 下载 kube-prometheus-stack-45.2.0.tgz
wget https://github.com/prometheus-community/helm-charts/releases/download/kube-prometheus-stack-45.2.0/kube-prometheus-stack-45.2.0.tgz
tar -zxvf kube-prometheus-stack-45.2.0.tgz
修改镜像版本
registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0改为docker.io/ghostwritten/kube-webhook-certgen:v1.3.0registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.8.0改为docker.io/ghostwritten/kube-state-metrics:v2.8.0
具体操作:第一步:cd kube-prometheus-stack目录,vim values.yaml文件
1872 registry: registry.k8s.io
1873 repository: ingress-nginx/kube-webhook-certgen
1874 tag: v1.3.0
修改为:
1872 registry: docker.io
1873 repository: ghostwritten/kube-webhook-certgen
1874 tag: v1.3.0
第二步:vim charts/kube-state-metrics/values.yaml
3 image:4 repository: registry.k8s.io/kube-state-metrics/kube-state-metrics
修改为:
3 image:4 repository: docker.io/ghostwritten/kube-state-metrics
第三步:为了和官方 prometheus helm charts 做一个区分需要修改一下 helm charts的名字。打开vim Chart.yaml
50 name: kube-prometheus-stack
修改为:
50 name: ghostwritten-kube-prometheus-stack
9.3 打包
$ cd ../
$ helm package ./kube-prometheus-stack
Successfully packaged chart and saved it to: /root/ghostwritten-kube-prometheus-stack-45.2.0.tgz
9.4 推送 helm package 至 GitHub Package
登陆 github 创建一个Token,你可以在这个链接创建,并勾选 write:packages 权限。

点击“Genarate token”按钮生成 Token 并复制。

$ helm registry login -u ghostwritten https://ghcr.io
Password: <复制 github_token>
Login Succeeded
推送
$ helm push ghostwritten-kube-prometheus-stack-45.2.0.tgz oci://ghcr.io/ghostwritten/helm
Pushed: ghcr.io/ghostwritten/helm/ghostwritten-kube-prometheus-stack:45.2.0
Digest: sha256:eecc4fcfc2dd3a65dedb692bfbfcd49d1e420e99e2b13aded22b136dae25e146
查看位置 ghostwritten-kube-prometheus-stack-45.2.0.tgz 存放位置


9.5 推送 helm package 至私有 harbor
- Centos 部署 harbor 镜像仓库实践
harbor 默认仓库内没有Helm Charts栏,需要执行以下命令即可:
docker-compose stop
./install.sh --with-chartmuseum
拷贝证书:
scp -r /etc/docker/certs.d/harbor.fumai.com root@192.168.10.29:/etc/containers/certs.d/
/etc/hosts 文件配置 192.168.10.81 harbor.fumai.com
登陆
$ podman login -u admin -p Harbor12345 harbor.fumai.com
Login Succeeded!$ helm registry login --insecure harbor.fumai.com
Username: admin
Password:
Login Succeeded
或者
$ helm registry login --insecure harbor.fumai.com -u admin -p Harbor12345
WARNING: Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded
跟配置 Docker 仓库一样,配置 Helm 仓库也得提前配置证书,首先进入 ca 签名目录
yum install ca-certificates
cp /etc/containers/certs.d/harbor.fumai.com/ca.crt /etc/pki/ca-trust/source/anchors/
执行更新命令,使证书生效:
update-ca-trust extract
harbor 界面新建一个项目,名字为 helm

将此项目添加 Helm 仓库:
$ helm repo add harbor --username admin --password Harbor12345 https://harbor.fumai.com/chartrepo/helm
"harbor" has been added to your repositories
查看 helm 本地库
helm repo list
NAME URL
prometheus-community https://prometheus-community.github.io/helm-charts
harbor https://harbor.fumai.com/chartrepo/helm
helm 默认不支持推送仓库,需要安装 helm-push 插件
$ helm plugin install https://github.com/chartmuseum/helm-push
Downloading and installing helm-push v0.10.3 ...
https://github.com/chartmuseum/helm-push/releases/download/v0.10.3/helm-push_0.10.3_linux_amd64.tar.gz
Installed plugin: cm-push
推送 ghostwritten-kube-prometheus-stack-45.2.0.tgz 至 harbor
$ helm cm-push ghostwritten-kube-prometheus-stack-45.2.0.tgz harbor
Pushing ghostwritten-kube-prometheus-stack-45.2.0.tgz to harbor...
Done.
已上传成功,效果图如下:

10. helm 安装定制化的 kube-prometheus-stack
我这里选择从刚刚上传的公共 github package上的ghostwritten-kube-prometheus-stack包进行安装。
helm upgrade prometheus oci://ghcr.io/ghostwritten/helm/ghostwritten-kube-prometheus-stack \
--version 45.2.0 \
--namespace prometheus --create-namespace --install \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
输出:
Release "prometheus" does not exist. Installing it now.
Pulled: ghcr.io/ghostwritten/helm/ghostwritten-kube-prometheus-stack:45.2.0
Digest: sha256:2d17d54b97cbd2ce45f34bf2d25b7d424cff43508054ea0232b7d2f485a5b7a2
NAME: prometheus
LAST DEPLOYED: Tue Feb 28 14:32:22 2023
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
NOTES:
ghostwritten-kube-prometheus-stack has been installed. Check its status by running:kubectl --namespace prometheus get pods -l "release=prometheus"Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
查看 helm 部署应用列表
$ helm list -n prometheus
NAME NAMESPACE REVISION UPDATED STATUS CHARTAPP VERSION
prometheus prometheus 1 2023-02-28 14:32:22.526037959 +0800 CST deployed ghostwritten-kube-prometheus-stack-45.2.0 v0.63.0
查看 pod 以及其他资源对象
$ kubectl --namespace prometheus get pods -l "release=prometheus"
NAME READY STATUS RESTARTS AGE
prometheus-ghostwritten-ku-operator-7c89d9649c-hl5sx 1/1 Running 0 49s
prometheus-kube-state-metrics-bf46f46cc-944cr 1/1 Running 0 49s
prometheus-prometheus-node-exporter-jbv7n 1/1 Running 0 49s$ k get all -n prometheus
NAME READY STATUS RESTARTS AGE
pod/alertmanager-prometheus-ghostwritten-ku-alertmanager-0 2/2 Running 1 (88m ago) 88m
pod/prometheus-ghostwritten-ku-operator-7c89d9649c-fvd4x 1/1 Running 0 88m
pod/prometheus-grafana-6f77bc5bc9-mnsn5 3/3 Running 0 88m
pod/prometheus-kube-state-metrics-bf46f46cc-dqbrm 1/1 Running 0 88m
pod/prometheus-prometheus-ghostwritten-ku-prometheus-0 2/2 Running 0 88m
pod/prometheus-prometheus-node-exporter-gkd29 1/1 Running 0 88mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)AGE
service/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 88m
service/prometheus-ghostwritten-ku-alertmanager ClusterIP 10.96.193.144 <none> 9093/TCP88m
service/prometheus-ghostwritten-ku-operator ClusterIP 10.96.112.10 <none> 443/TCP88m
service/prometheus-ghostwritten-ku-prometheus ClusterIP 10.96.110.97 <none> 9090/TCP88m
service/prometheus-grafana ClusterIP 10.96.86.245 <none> 80/TCP88m
service/prometheus-kube-state-metrics ClusterIP 10.96.205.51 <none> 8080/TCP88m
service/prometheus-operated ClusterIP None <none> 9090/TCP88m
service/prometheus-prometheus-node-exporter ClusterIP 10.96.154.79 <none> 9100/TCP88mNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/prometheus-prometheus-node-exporter 1 1 1 1 1 <none> 88mNAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/prometheus-ghostwritten-ku-operator 1/1 1 1 88m
deployment.apps/prometheus-grafana 1/1 1 1 88m
deployment.apps/prometheus-kube-state-metrics 1/1 1 1 88mNAME DESIRED CURRENT READY AGE
replicaset.apps/prometheus-ghostwritten-ku-operator-7c89d9649c 1 1 1 88m
replicaset.apps/prometheus-grafana-6f77bc5bc9 1 1 1 88m
replicaset.apps/prometheus-kube-state-metrics-bf46f46cc 1 1 1 88mNAME READY AGE
statefulset.apps/alertmanager-prometheus-ghostwritten-ku-alertmanager 1/1 88m
statefulset.apps/prometheus-prometheus-ghostwritten-ku-prometheus 1/1 88m
11. 域名访问
当然如果我们想要在外网访问这两个服务的话可以通过创建对应的 Ingress 对象或者使用 NodePort 类型的 Service,使用 NodePort 类型的服务,编辑prometheus-grafana 、 prometheus-k8sprometheus-ghostwritten-ku-prometheus 、prometheus-ghostwritten-ku-alertmanager这三个 Service,将服务类型(type)更改为 NodePort。但我更喜欢通过域名访问。
编写 prometheus-grafana-alertmanager-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: grafana-ingresslabels:app: ghostwritten-kube-prometheus-stack-prometheusannotations:kubernetes.io/ingress.class: nginx
spec:rules:- host: grafana.demo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: prometheus-grafanaport:name: http-web---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: prometheus-ingresslabels:app: ghostwritten-kube-prometheus-stack-prometheusannotations:kubernetes.io/ingress.class: nginx
spec:rules:- host: prometheus.demo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: prometheus-ghostwritten-ku-prometheusport:name: http-web
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: alertmanager-ingresslabels:app: ghostwritten-kube-prometheus-stack-prometheusannotations:kubernetes.io/ingress.class: nginx
spec:rules:- host: alertmanager.demo.comhttp:paths:- path: /pathType: Prefixbackend:service:name: prometheus-ghostwritten-ku-alertmanagerport:name: http-web
执行:
k apply -f prometheus-grafana-alertmanager-ingress.yaml
windows: C:\Windows\System32\drivers\etc\hosts 配置:
192.168.10.29 grafana.demo.com prometheus.demo.com alertmanager.demo.com
访问: http://prometheus.demo.com

访问:http://alertmanager.demo.com

访问:http://grafana.demo.com

因为我第一次登陆admin/admin, 并没有登陆成功,通过grafana-cli 命令修改 admin 密码为 admin:
$ grafana-cli admin reset-admin-password admin
INFO [02-28|10:24:48] Starting Grafana logger=settings version= commit= branch= compiled=1970-01-01T00:00:00Z
INFO [02-28|10:24:48] Config loaded from logger=settings file=/usr/share/grafana/conf/defaults.ini
INFO [02-28|10:24:48] Config overridden from Environment variable logger=settings var="GF_PATHS_DATA=/var/lib/grafana/"
INFO [02-28|10:24:48] Config overridden from Environment variable logger=settings var="GF_PATHS_LOGS=/var/log/grafana"
INFO [02-28|10:24:48] Config overridden from Environment variable logger=settings var="GF_PATHS_PLUGINS=/var/lib/grafana/plugins"
INFO [02-28|10:24:48] Config overridden from Environment variable logger=settings var="GF_PATHS_PROVISIONING=/etc/grafana/provisioning"
INFO [02-28|10:24:48] Config overridden from Environment variable logger=settings var="GF_SECURITY_ADMIN_USER=admin"
INFO [02-28|10:24:48] Config overridden from Environment variable logger=settings var="GF_SECURITY_ADMIN_PASSWORD=*********"
INFO [02-28|10:24:48] Path Home logger=settings path=/usr/share/grafana
INFO [02-28|10:24:48] Path Data logger=settings path=/var/lib/grafana/
INFO [02-28|10:24:48] Path Logs logger=settings path=/var/log/grafana
INFO [02-28|10:24:48] Path Plugins logger=settings path=/var/lib/grafana/plugins
INFO [02-28|10:24:48] Path Provisioning logger=settings path=/etc/grafana/provisioning
INFO [02-28|10:24:48] App mode production logger=settings
INFO [02-28|10:24:48] Connecting to DB logger=sqlstore dbtype=sqlite3
INFO [02-28|10:24:48] Starting DB migrations logger=migrator
INFO [02-28|10:24:48] migrations completed logger=migrator performed=0 skipped=464 duration=2.142374ms
INFO [02-28|10:24:48] Envelope encryption state logger=secrets enabled=true current provider=secretKey.v1Admin password changed successfully ✔
再次admin/admin 登陆成功,直接跳转修改密码,我修改新的密码为 12345678

终于可以正常访问了。

12. 清理应用
删除 prometheus 应用
k delete -f prometheus-grafana-alertmanager-ingress.yaml
helm delete prometheus -n prometheus
k delete ns prometheus
强制删除命名空间,创建 delete_ns.sh
#!/bin/bashNAMESPACE=$1
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
bash delete_ns.sh prometheus
参考:
- Prometheus Operator 初体验
相关文章:
kind kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?
文章目录1. Prometheus 简介2. Prometheus 优势3. Prometheus 架构图4. Prometheus-Operator 简介5. Prometheus-Operator 架构图6. 环境准备7. Kind 部署 Kubernetes7.1 安装 Ingress-nginx 组件7.2 安装 Metric Server 组件8. helm 快速安装 Prometheus-Operator9. 定制 Prom…...
流媒体付服务器 ZLMediaKit 学习记录
1.官方github:ZLMediaKit 依赖于 media-server 库 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init 之后 cd ZLMediaKit mkdir build…...
2023年了还不会写软件测试简历吗,那就来看这里吧,怎么样才能更容易让HR看到你的简历
作为软件测试的从业者,面试或者被面试都是常有的事。 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官,所以在这场博弈中࿰…...
第四阶段08-基于element-ui的vue2.0脚手架(续)
42. VUE脚手架项目嵌套路由 在配置路由(配置/src/router/index.js)时,如果配置的路由对象是routes常量的直接数组元素,则此路由配置的视图会显示在App.vue的<router-view/>中。 在设计视图时,可能会出现<ro…...
数据库设计规范
三范式首先,设计数据库,要尽可能的满足三范式,遵循三范式开发会减少数据冗余、提升系统可扩展性和查询性能。第一范式的目标是确保每列的原子性如果每列都是不可再分的最小数据单元(也称为最小的原子单元),…...
深入浅出PaddlePaddle函数——paddle.Tensor
分类目录:《深入浅出PaddlePaddle函数》总目录 Tensor是Paddle中最为基础的数据结构,有几种创建Tensor的不同方式: 用预先存在的数据创建1个Tensor,请参考paddle.to_tensor创建一个指定shape的Tensor,请参考paddle.on…...
docker删除已停止的容器
一、docker删除已停止的容器 1、根据容器的状态,删除Exited状态的容器 先停止容器、再删除镜像中的容器、最后删除none的镜像。执行命令如下: docker stop $(docker ps -a | grep "Exited" | awk {print $1 }) #停止容器 docker rm $(docke…...
JS#1 引入方式和基础语法
JavaScript(JS)是一门跨平台, 面向对象的脚本语言, 来控制网页行为的, 它能够是网页可交互一. 引入方式内部脚本与外部脚本内部脚本: 将JS代码定义在HTML页面中外部脚本: 将JS代码定义在外部JS文件中, 然后引入到HTML页面中注意: 在HTML中,JS代码必须位于<script></sc…...
面了一个测试工程师,明显感觉他背了很多面试题...
最近有朋友去字节面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…...
C#生成缩略图
using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System.Text;namespace learun.util{public enum ThumbnailMode{/// <summary>/// 指定宽度,高度按照比例缩放/// …...
算法 # SimHash 算法:文本相似度、文本去重、海量文本快速查询
SimHash SimHash 是 Google 发明的海量网页去重的高效算法,将原始的文本映射为 64 位的二进制串,然后通过比较二进制的差异进而表示原始文本内容的差异。 传统的 Hash 算法只负责将原始内容尽量均匀随机地映射为一个 hash 值,原理上相当于伪随机数产生算法。SimHash 本身属…...
Java程序设计-JSP程序设计-SSM校园二手交易系统
摘 要 网络的广泛应用给生活带来了十分的便利。所以把二手物品交易管理与现在网络相结合,利用java技术建设二手物品交易系统,实现二手物品交易的信息化。则对于进一步提高二手物品交易管理发展,丰富二手物品交易管理经验能起到不少的促进作用…...
springBoot 消息转换器和自定义消息转换器
public interface HttpMessageConverter<T> {/*** 能否以指定的类读取*/boolean canRead(Class<?> clazz, Nullable MediaType mediaType);/*** 能否以指定的类写*/boolean canWrite(Class<?> clazz, Nullable MediaType mediaType);/*** 返回支持是消息转…...
机器学习笔记之流形模型——标准流模型基本介绍
机器学习笔记之流形模型——标准流模型基本介绍引言回顾:隐变量模型的缺陷标准流(Normalizing Flow\text{Normalizing Flow}Normalizing Flow)思想分布变换的推导过程引言 本节将介绍概率生成模型——标准流模型(Normalizing Flow\text{Normalizing Flow}Normalizi…...
MIT:只需一层RF传感器,就能为AR头显赋予“X光”穿透视力
近年来,AR在仓库、工厂等场景得到应用,比如GlobalFoundries、亚马逊、菜鸟裹裹就使用摄像头扫描定位货品,并使用AR来导航和标记。目前,这种方案主要基于视觉算法,因此仅能定位视线范围内的目标。然而,在一些…...
对 Dom 树的理解
什么是 DOM 从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的,所以要将其转化为渲染引擎能够理解的内部结构,这个结构就是 DOM。 DOM 提供了对 HTML 文档结构化的表述。 在渲染引擎中,DOM 有三个层面的作用: …...
电商搜索入门
一、搜索用途通常一个电商平台里面的商品,少则几十万多则上千万甚至上亿的sku,在这么多的商品中,如何让用户可以快速查找到自己想要的商品,那么就需要用到搜索功能来实现。通过分析数据发现,接近40%的点击率是直接通过…...
4.3.1初阶数据结构(C语言)(无头不循环单链表)
1.完整的单链表注释: #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h>typedef int SLTDateType; // 重定义数据类型typedef struct SListNode // 定义结构体类型的节点 {SLTDateType data;str…...
一文深度解读音视频行业技术发展历程
从1948年的香农定律,到音视频的今天。IMMENSE、36氪|作者 北京时间2月28日凌晨,FIFA年度颁奖典礼在巴黎举行。梅西荣膺年度最佳球员,斯卡洛尼当选年度最佳男足主帅,马丁内斯荣获年度最佳男足门将!阿根廷因…...
面向对象拓展贴
1. 类和对象的内存分配机制 1.1 分配机制 Java 内存的结构分析 栈: 一般存放基本数据类型(局部变量)堆: 存放对象(Cat cat , 数组等)方法区:常量池(常量,比如字符串), 类加载信息示意图 [Cat (name, age, price)]…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
