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.0
registry.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.0
registry.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)]…...
Android仿QQ未读消息拖拽粘性效果
效果图原理分析首先是在指定某个位置画一个圆出来,手指按到这个圆的时候再绘制一个可以根据手指位置移动的圆,随着手指的移动两个圆逐渐分离,分离的过程中两圆中间出现连接带,随着两圆圆心距的增大,半径也是根据某一比…...
Linux 打包压缩解压指令 gzip bzip2 tar
总结自鸟哥Linux私房菜 Linux压缩文件的扩展名大多是:“.tar, .tar.gz, .tgz, .gz, .Z, .bz2, *.xz”, 不同压缩文件使用了不同的算法,不能通用压缩或解压 常见扩展名: *.Z compress 程序压缩的文件; *.zip zip 程序…...
系统升级丨分享返佣,助力商企实现低成本高转化营销
秉承助力传统经济数字化转型的长远理念 酷雷曼VR再次在VR全景营销中发力 创新研发“分享返佣”功能 进一步拓宽商企VR全景营销渠道 助力商企搭建低成本、高传播、高转化 的VR营销体系 01、什么是“分享返佣”? ●“分享返佣”即“推广”返佣,是酷…...
机试代码模板
文章目录进制转换高精度加/乘法搜索BFSDFS树二叉树遍历图Dijkstra算法Kruskal算法动态规划最长公共子序列(LCS)最长上升子序列(LIS)KMP算法进制转换 #include <iostream> #include <string> #include <cmath> #include <iomanip> #include <algori…...
Java性能优化-垃圾回收算法-理解CMS回收器
垃圾回收算法 理解 CMS回收器 三个基本操作 1.回收新生代(同时暂停所有的应用线程) 2.运行并发周期来清理老年代数据 3.如果有必要则FULL GC压缩老年代 当发生新生代回收 , 如果老年代没有足够的空间容纳晋升的对象则执行FULL GC,所有线程停…...
Oracle11G的表空间数据文件大小限制问题处理
1.表空间数据文件容量 oracle11g的表空间数据文件容量与DB_BLOCK_SIZE有关,在初始建库时,DB_BLOCK_SIZE要根据实际需要,设置为 4K,8K、16K、32K、64K等几种大小,ORACLE的物理文件最大只允许4194304个数据块(由操作系统…...
计算机三级|网络技术|备考指南|网络系统结构与设计的基本原则|1
一、网络系统结构与设计的基本原则宽带城域网的关键技术p1 p2 p3设计一个宽带城域网涉及“三个平台一个出口”,即网络平台、业务平台、管理平台和城市宽带出口。宽带城域网:宽带城域网划分为三个层次:核心层、汇聚层、接入层。核心层承担高速…...
基于 TI Sitara系列 AM64x核心板——程序自启动说明
前 言 本文主要介绍AM64x的Cortex-A53、Cortex-M4F和Cortex-R5F核心程序自启动使用说明。默认使用AM6442进行测试演示,AM6412测试步骤与之类似。 本说明文档适用开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.5.5 Linux开发环境:Ubun…...
自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第一部分
我是去年9月22日才正式学习Java的,因为在国营单位工作了4年,在天津一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你…...
微电影广告的内容突破方案
微电影作为新媒体时代背景的产物,深受大众的欢迎,同时,微电影广告在微电影模式环境下应运而生,以自己独特的传播优势,俘获了大量企业主的青睐,也获得了广大青年群体的喜爱。微电影广告欲确保可持续发展&…...
wordpress标签云修改/免费收录链接网
图的遍历:从给定图中任意指定的顶点(称初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。如果给定图是连通的无向图或者是强连通的有向图…...
兰州关键词网络推广/网站手机优化
原文地址:https://wenku.baidu.com/view/9d4051f4700abb68a982fb4e.html 嵌入式常见英文缩写和英文词汇 ( 搜集中 ) 英文缩写 ARM : Advanced RISC Machine AAPCS : ARM Architecture Process call standard ARM 体系结构过程调用标准 R…...
做网站需要人员/青岛seo软件
肯定有很多人很奇怪电脑程序是如何运行起来的吧。这其中涉及到了电子计算机最底层的原理,大家能够了解的更为全面一些。我在这里就简单而形象的为大家讲一讲这其中的机理。 第三次工业革命与前两次工业革命有着一个本质的不同,因为前两次工业革命都涉及…...
东莞机械建站如何/微信软文推广怎么做
一、如果是已经声明存在的变量或者对象,就不用加引号。 比如var namedocument.getElementById("name"); $(name)或者$(this)。 二、document、this、window 这些都是系统对象 可以直接使用, 所以不用加引号。 三、加引号的一般是元素标签有i…...
做瞹视频网站/百度怎么优化排名
C/C语言概述 将介绍 C/C语言的基本语法,但由于篇幅所限,不涉及面向对象的内容。本书中的所有程序,都没有使用面向对象的编程方法,但都应保存为 .cpp 文件,按 C的语法进行编译。实际上,如果不涉及面向对象的…...
查询网站空间的服务商/重庆seo网站管理
题库来源:安全生产模拟考试一点通公众号小程序 2022年T电梯修理考试练习题系T电梯修理复习题的新全考试题型!2022年T电梯修理操作证考试题库模拟考试平台操作依据T电梯修理新版考试题库。T电梯修理全部考试题库随时根据安全生产模拟考试一点通上模拟考场…...