当前位置: 首页 > news >正文

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-grafanaprometheus-k8sprometheus-ghostwritten-ku-prometheusprometheus-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&#xff1a;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看到你的简历

作为软件测试的从业者&#xff0c;面试或者被面试都是常有的事。 可是不管怎样&#xff0c;和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官&#xff0c;所以在这场博弈中&#xff0…...

第四阶段08-基于element-ui的vue2.0脚手架(续)

42. VUE脚手架项目嵌套路由 在配置路由&#xff08;配置/src/router/index.js&#xff09;时&#xff0c;如果配置的路由对象是routes常量的直接数组元素&#xff0c;则此路由配置的视图会显示在App.vue的<router-view/>中。 在设计视图时&#xff0c;可能会出现<ro…...

数据库设计规范

三范式首先&#xff0c;设计数据库&#xff0c;要尽可能的满足三范式&#xff0c;遵循三范式开发会减少数据冗余、提升系统可扩展性和查询性能。第一范式的目标是确保每列的原子性如果每列都是不可再分的最小数据单元&#xff08;也称为最小的原子单元&#xff09;&#xff0c;…...

深入浅出PaddlePaddle函数——paddle.Tensor

分类目录&#xff1a;《深入浅出PaddlePaddle函数》总目录 Tensor是Paddle中最为基础的数据结构&#xff0c;有几种创建Tensor的不同方式&#xff1a; 用预先存在的数据创建1个Tensor&#xff0c;请参考paddle.to_tensor创建一个指定shape的Tensor&#xff0c;请参考paddle.on…...

docker删除已停止的容器

一、docker删除已停止的容器 1、根据容器的状态&#xff0c;删除Exited状态的容器 先停止容器、再删除镜像中的容器、最后删除none的镜像。执行命令如下&#xff1a; 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…...

面了一个测试工程师,明显感觉他背了很多面试题...

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

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>/// 指定宽度&#xff0c;高度按照比例缩放/// …...

算法 # SimHash 算法:文本相似度、文本去重、海量文本快速查询

SimHash SimHash 是 Google 发明的海量网页去重的高效算法,将原始的文本映射为 64 位的二进制串,然后通过比较二进制的差异进而表示原始文本内容的差异。 传统的 Hash 算法只负责将原始内容尽量均匀随机地映射为一个 hash 值,原理上相当于伪随机数产生算法。SimHash 本身属…...

Java程序设计-JSP程序设计-SSM校园二手交易系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把二手物品交易管理与现在网络相结合&#xff0c;利用java技术建设二手物品交易系统&#xff0c;实现二手物品交易的信息化。则对于进一步提高二手物品交易管理发展&#xff0c;丰富二手物品交易管理经验能起到不少的促进作用…...

springBoot 消息转换器和自定义消息转换器

public interface HttpMessageConverter<T> {/*** 能否以指定的类读取*/boolean canRead(Class<?> clazz, Nullable MediaType mediaType);/*** 能否以指定的类写*/boolean canWrite(Class<?> clazz, Nullable MediaType mediaType);/*** 返回支持是消息转…...

机器学习笔记之流形模型——标准流模型基本介绍

机器学习笔记之流形模型——标准流模型基本介绍引言回顾&#xff1a;隐变量模型的缺陷标准流(Normalizing Flow\text{Normalizing Flow}Normalizing Flow)思想分布变换的推导过程引言 本节将介绍概率生成模型——标准流模型(Normalizing Flow\text{Normalizing Flow}Normalizi…...

MIT:只需一层RF传感器,就能为AR头显赋予“X光”穿透视力

近年来&#xff0c;AR在仓库、工厂等场景得到应用&#xff0c;比如GlobalFoundries、亚马逊、菜鸟裹裹就使用摄像头扫描定位货品&#xff0c;并使用AR来导航和标记。目前&#xff0c;这种方案主要基于视觉算法&#xff0c;因此仅能定位视线范围内的目标。然而&#xff0c;在一些…...

对 Dom 树的理解

什么是 DOM 从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的&#xff0c;所以要将其转化为渲染引擎能够理解的内部结构&#xff0c;这个结构就是 DOM。 DOM 提供了对 HTML 文档结构化的表述。 在渲染引擎中&#xff0c;DOM 有三个层面的作用&#xff1a; …...

电商搜索入门

一、搜索用途通常一个电商平台里面的商品&#xff0c;少则几十万多则上千万甚至上亿的sku&#xff0c;在这么多的商品中&#xff0c;如何让用户可以快速查找到自己想要的商品&#xff0c;那么就需要用到搜索功能来实现。通过分析数据发现&#xff0c;接近40%的点击率是直接通过…...

4.3.1初阶数据结构(C语言)(无头不循环单链表)

1.完整的单链表注释&#xff1a; #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h>typedef int SLTDateType; // 重定义数据类型typedef struct SListNode // 定义结构体类型的节点 {SLTDateType data;str…...

一文深度解读音视频行业技术发展历程

从1948年的香农定律&#xff0c;到音视频的今天。IMMENSE、36氪&#xff5c;作者 北京时间2月28日凌晨&#xff0c;FIFA年度颁奖典礼在巴黎举行。梅西荣膺年度最佳球员&#xff0c;斯卡洛尼当选年度最佳男足主帅&#xff0c;马丁内斯荣获年度最佳男足门将&#xff01;阿根廷因…...

面向对象拓展贴

1. 类和对象的内存分配机制 1.1 分配机制  Java 内存的结构分析 栈&#xff1a; 一般存放基本数据类型(局部变量)堆&#xff1a; 存放对象(Cat cat , 数组等)方法区&#xff1a;常量池(常量&#xff0c;比如字符串)&#xff0c; 类加载信息示意图 [Cat (name, age, price)]…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...