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

Prometheus监控实战系列十九:监控Kubernetes集群(上)

Kuberentes是一款开源的容器编排产品,由Google开发后发布到社区,并在2015年将该项目捐献给了云原生基金会(Cloud Native Computing Foundation)。从2014年第一个版本发布以来,Kubernetes便迅速获得开源社区的追捧,包括RedHat、VMware在内的很多知名企业都加入到开发和推广的阵营。目前,Kubernets已经成为发展最快、市场占有率最高的容器编排产品。

Promehteus是一款近年来非常火热的容器监控系统,它使用go语言开发,设计思路来源于Google的Borgmom(一个监控容器平台的系统)。2016年,云原生基金会将其纳入麾下,成为该基金会继Kubernetes后,第二大开源项目。因此,Prometheus天然具有对容器的适配性,可非常方便的满足容器的监控需求,目前已成为监控Kubernetes的主要工具。

本文将介绍如何通过Prometheus监控Kubernetes集群状态的方案,限于篇幅原因会分为上、下两个篇章进行。(对于Kubernetes的技术细节本文不做讲解,不熟悉的朋友可先自行查阅相关资料。)
在这里插入图片描述

1、安装Prometheus

Prometheus支持基于Kubernetes的服务发现,通过<kubernetes_sd_config> 配置允许从 Kubernetes 的API 检索抓取目标,并始终与集群状态保持同步。

我们需要在被监控集群上安装Prometheus,本文将使用YAML文件的方式进行部署。

1.1 创建命名空间

创建namespace.yml文件,内容如下

apiVersion: v1
kind: Namespace
metadata:name: monitoring

执行该yml文件

kubectl apply -f namespace.yaml

查看命名空间,已成功创建
在这里插入图片描述

1.2 创建RBAC规则

RBAC为Kubernetes的授权认证方式,包括 ServiceAccount、ClusterRole、ClusterRoleBinding三类YAML文件。该规则用于授权Prometheus获取资源信息。

创建prometheus-rbac.yml文件,内容如下:

apiVersion: v1
kind: ServiceAccount
metadata:name: prometheusnamespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: prometheus
rules:
- apiGroups: [""]resources: ["nodes", "nodes/proxy", "services", "endpoints", "pods"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["configmaps"]verbs: ["get"]
- nonResourceURLs: ["/metrics"]verbs: ["get"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: prometheus
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: prometheus
subjects:
- kind: ServiceAccountname: prometheusnamespace: monitoring

执行该yml文件

[root@master prometheus]# kubectl apply -f prometheus-rbac.yaml 
serviceaccount/prometheus unchanged
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created

查看RBAC是否创建成功

[root@master prometheus]# kubectl get sa -n monitoring
NAME         SECRETS   AGE
default      1         10m
prometheus   1         89s
[root@master prometheus]# kubectl get ClusterRole prometheus
NAME         CREATED AT
prometheus   2023-03-23T03:01:36Z
[root@master prometheus]# kubectl get ClusterRoleBinding prometheus -n monitoring
NAME         ROLE                     AGE
prometheus   ClusterRole/prometheus   103s
1.3 创建Configmap

我们使用Configmap来管理Prometheus的配置文件,此处先使用默认的配置,用于启动Prometheus,后面再根据需要进行修改。

创建prometheus-config.yml文件,内容如下

apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: monitoring
data:prometheus.yml: |global:scrape_interval:     15s evaluation_interval: 15sscrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']

执行该yml文件

[root@master prometheus]# kubectl apply -f prometheus-config.yaml 
configmap/prometheus-config created

查看configmap资源是否生成

kubectl get configmap -n monitoring
1.4 部署Deployment

在完成Configmap资源创建后,我们可以开始部署Prometheus的实例了。此处,我们使用Deployment来部署Prometheus,并通过Volume挂载的方式,将Prometheus的配置文件挂载到Pod内。另外,在正式环境中建议通过PVC的方式,将收集的监控数据挂载到外部存储,避免因Pod被删除而造成数据丢失。

创建prometheus-deployment.yml文件,内容如下

apiVersion: apps/v1
kind: Deployment
metadata:name: prometheusnamespace: monitoringlabels:app: prometheus
spec:strategy:type: Recreatereplicas: 1selector:matchLabels:app: prometheustemplate:metadata:labels:app: prometheusspec:containers:- image: prom/prometheus:v2.2.1name: prometheuscommand:- prometheusargs:- --config.file=/etc/prometheus/config/prometheus.yml- --storage.tsdb.path=/data- --web.enable-lifecyclesecurityContext:runAsUser: 0ports:- containerPort: 9090protocol: TCPvolumeMounts:- mountPath: "/etc/prometheus/config/"name: config- name: prometheus-datamountPath: /data/serviceAccountName: prometheusvolumes:- name: configconfigMap:name: prometheus-config- name: prometheus-datahostPath:path: /datatype: Directory

执行yaml文件

[root@master prometheus]# kubectl apply -f prometheus-deployment.yaml 
deployment.apps/prometheus created

查看Prometheus实例状态

[root@master prometheus]# kubectl get deploy -n monitoring
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
prometheus   1/1     1            1           46s
[root@master prometheus]# kubectl get pods -n monitoring
NAME                          READY   STATUS    RESTARTS   AGE
prometheus-65df6bbcc7-mmv5f   1/1     Running   0          54s
1.5 创建Service

创建Prometheus的Service,用于集群内外部访问。默认情况下,Service只能在集群内访问,如果希望开放给集群外部,可选方案有Ingress、NodePort、ExternalIPs、LoadBalancer等几种。此处使用NodePort方式。

创建prometheus-service.yml,内容如下:

apiVersion: v1
kind: Service
metadata:labels:app: prometheusname: prometheusnamespace: monitoring
spec:ports:- name: "web"port: 9090protocol: TCPtargetPort: 9090selector:app: prometheustype: NodePort

执行该yml文件

[root@master prometheus]# kubectl apply  -f prometheus-service.yaml 
service/prometheus created

查看Service状态,Service已创建完成,其中Cluster-ip用于集群内部访问,External-ip则是给到集群外部访问

[root@master prometheus]# kubectl get service -n monitoring
NAME         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
prometheus   NodePort   10.111.199.135   <none>        9090:30322/TCP   50s
1.6 访问Prometheus

浏览器打开http://$ip:9090,可看到Prometheus已部署完成。
在这里插入图片描述
查看Targets目标,当前除了监控Prometheus自身实例,还未有其他Kubernetes资源。
在这里插入图片描述

2、基于Kubernetes的服务发现

在监控Kubernetes集群的过程中,我们需要使用到针对Kubernetes的服务发现功能,这个在Prometheus的原生功能中已经支持。

以下几种类型的资源角色可被配置为服务发现的目标,对于集群的监控即是通过有效利用这些角色及标签来实现。

2.1 node角色

该node 角色发现用于检索集群中的节点目标信息,其地址默认为节点kubelet的HTTP访问端口。目标地址的默认顺序为NodeInternalIP,NodeExternalIP,NodeLegacyHostIP和NodeHostName中的第一个现有地址。

该角色可获取到的元数据标签如下:

  • __meta_kubernetes_node_name:节点对象的名称。
  • __meta_kubernetes_node_label:节点对象所定义的各个label
  • __meta_kubernetes_node_labelpresent:节点对象所定义的各个label,value固定为true。
  • __meta_kubernetes_node_annotation:来自节点对象的每个注释
  • __meta_kubernetes_node_annotationpresent:来自节点对象的每个注释,value固定为true。
  • __meta_kubernetes_node_address<address_type>:每个节点地址类型的第一个地址(如果存在)

此外,节点的instance标签将被设置为从API服务检索到的节点名称。

2.2 service角色

该角色发现用于检索集群中每个service目标,并且将该服务开放的端口做为目标端口。该地址将设置为服务的Kubernetes DNS名称以及相应的服务端口。

该角色可获取到的元数据标签如下:

  • __meta_kubernetes_namespace: 服务对象的名称空间。
  • __meta_kubernetes_service_annotation:服务对象的每个注释。
  • __meta_kubernetes_service_annotationpresent: 服务对象的每个注释,value固定为true。
  • __meta_kubernetes_service_cluster_ip: 服务对象的集群IP。
  • __meta_kubernetes_service_external_name: 服务的DNS名称。
  • __meta_kubernetes_service_label: 服务对象中的每个label。
  • __meta_kubernetes_service_labelpresent: 服务对象中的每个label,value固定为true。
  • __meta_kubernetes_service_name: 服务对象的名称。
  • __meta_kubernetes_service_port_name: 目标服务端口的名称。
  • __meta_kubernetes_service_port_protocol: 目标服务端口的协议。
  • __meta_kubernetes_service_type: 服务的类型。
2.3 Pod角色

该pod角色发现用于发现所有Pod并将其容器做为目标访问,对于容器的每个声明的端口,将生成一个目标。如果容器没有指定的端口,则会为每个容器创建无端口目标。

该角色可获取到的元数据标签如下:

  • __meta_kubernetes_namespace: pod对象的命名空间。

  • __meta_kubernetes_pod_name: pod对象的名称。

  • __meta_kubernetes_pod_ip: pod对象的pod IP。

  • _meta_kubernetes_pod_label: 来自pod对象的每个标签。

  • _meta_kubernetes_pod_labelpresent: 来自pod对象的每个标签,value固定为true。

  • _meta_kubernetes_pod_annotation: 来自pod对象的每个注释。

  • _meta_kubernetes_pod_annotationpresent: 来自pod对象的每个注释,value固定为true。

  • __meta_kubernetes_pod_container_init: 如果容器是初始化容器,则value为true。

  • __meta_kubernetes_pod_container_name: 目标地址指向的容器的名称。

  • __meta_kubernetes_pod_container_port_name: 容器端口的名称。

  • __meta_kubernetes_pod_container_port_number: 容器端口号。

  • __meta_kubernetes_pod_container_port_protocol: 容器端口的协议。

  • __meta_kubernetes_pod_ready: 代表pod状态是否就绪,value为true或false。

  • __meta_kubernetes_pod_phase: Pod的生命周期,Value值为Pending,Running,Succeeded,Failed或Unknown 。

  • __meta_kubernetes_pod_node_name: Pod所在节点的名称。

  • __meta_kubernetes_pod_host_ip: pod所在节点的IP。

  • __meta_kubernetes_pod_uid: pod对象的UID。

  • __meta_kubernetes_pod_controller_kind: pod控制器的对象种类。

  • __meta_kubernetes_pod_controller_name: pod控制器的名称。

2.4 endpoints角色

该endpoints角色发现用于检索服务的endpoints目标,且每个endpoints的port地址会生成一个目标。如果端点由Pod支持,则该Pod的所有其他容器端口(包括未绑定到endpoints的端口)也将作为目标。

该角色可获取到的元数据标签如下:

  • __meta_kubernetes_namespace: endpoints对象的命名空间

  • __meta_kubernetes_endpoints_name: endpoints对象的名称

    对于直接从端点列表中发现的所有目标(不包括由底层pod推断出来的目标),将附加以下标签:

  • __meta_kubernetes_endpoint_hostname: 端点的主机名

  • __meta_kubernetes_endpoint_node_name: 托管endpoints的节点名称

  • __meta_kubernetes_endpoint_ready: 代表endpoint 状态是否就绪,value为true或false。

  • __meta_kubernetes_endpoint_port_name: endpoint 端口的名称。

  • __meta_kubernetes_endpoint_port_protocol: endpoint 端口的协议。

  • __meta_kubernetes_endpoint_address_target_kind: endpo int地址目标的类型,如deployment、DaemonSet等。

  • __meta_kubernetes_endpoint_address_target_name: endpoint地址目标的名称。

2.5 ingress角色

该ingress角色发现用于发现ingress的每个地址目标。该地址将设置为ingress的spec配置中指定的host。

可使用的元数据标签如下:

  • __meta_kubernetes_namespace: ingress 对外的命名空间。
  • __meta_kubernetes_ingress_name: ingress 对象的名称。
  • _meta_kubernetes_ingress_label: ingress 对象的各个标签。
  • _meta_kubernetes_ingress_labelpresent: ingress 对象的各个标签,value为true或false。
  • _meta_kubernetes_ingress_annotation: ingress 对象的各个注释。
  • _meta_kubernetes_ingress_annotationpresent: ingress 对象的各个注释,value为true或false。
  • __meta_kubernetes_ingress_class_name: ingress的spec配置中的Class名称,如果存在的话。
  • __meta_kubernetes_ingress_scheme: ingress使用的协议 ,http或https。
  • __meta_kubernetes_ingress_path: ingress的spec配置中指定的路径,默认为 /

小结

本篇我们主要介绍了Prometheus实例在Kubernetes中的部署方式,以及监控集群所需要的服务发现功能。下篇我们将讲解如何通过这些功能,来实现对Kubernetes集群的监控。

上一篇:Prometheus监控实战系列十八:基于Consul的服务发现
下一篇:Prometheus监控实战系列二十:监控Kubernetes集群(下)

相关文章:

Prometheus监控实战系列十九:监控Kubernetes集群(上)

Kuberentes是一款开源的容器编排产品&#xff0c;由Google开发后发布到社区&#xff0c;并在2015年将该项目捐献给了云原生基金会&#xff08;Cloud Native Computing Foundation&#xff09;。从2014年第一个版本发布以来&#xff0c;Kubernetes便迅速获得开源社区的追捧&…...

番茄学习法——亲测超级好用

今天给大家分享下我最近使用的学习方法&#xff0c;真的非常好用&#xff01;大家用起来&#xff01; 在日常的学习和工作中&#xff0c;我们经常会遇到一些难以克服的问题&#xff1a;分心、效率低下、焦虑等。为了帮助人们更好地学习和工作&#xff0c;一些学习方法和工具应运…...

vue 项目中使用高德地图

一、账号准备 首先&#xff0c;需要注册并登录高德地图开放平台&#xff0c;申请密钥。操作指引&#xff1a;高德地图开放平台 二、安装高德地图加载器 npm 安装&#xff1a; npm i amap/amap-jsapi-loader --save或者 yarn 安装&#xff1a; yarn add amap/amap-jsapi-loa…...

【每日一题】病人排队

题目描述小理是个热爱生活的孩子。病人登记看病&#xff0c;小理想编写一个程序&#xff0c;将登记的病人按照以下原则排出看病的先后顺序&#xff1a;1. 老年人&#xff08;年龄 ≥≥ 60岁&#xff09;比非老年人优先看病。2. 老年人按年龄从大到小的顺序看病&#xff0c;年龄…...

【数据结构】链表OJ题

目录面试题 02.04 分割链表剑指 Offer II 027 回文链表160 相交链表141 环形链表142 环形链表 II138 复制带随机指针的链表面试题 02.04 分割链表 定义lesshead和greaterhead链接小于和大于等于k的值分别设置哨兵位和尾节点指针最后将两表去除哨兵位再链接 struct ListNode* p…...

冒泡 VS 插入 VS 选择——谁更胜一筹?(附排序源码)

文章目录什么样的“排序算法”更加优质&#xff1f;排序算法的执行效率排序算法的内存消耗排序算法的稳定性冒泡排序&#xff08;Bubble Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;最终的胜利者&#x1f…...

[python tools] 今天看到另一个配置工具 YACS,所以做下笔记

YACS 实际上就只是把别人的readme翻译了一下 github: https://github.com/rbgirshick/yacs 样例代码: https://github.com/Wuziyi616/multi_part_assembly/blob/master/docs/config.md 一、使用方法 1. 首先搞一个config的python文件&#xff0c;用来存一下基本的配置信息 比…...

Prometheus cadvisor容器监控和node-exporter节点监控

往期文章 Prometheus监控系统 https://blog.csdn.net/qq_39578545/article/details/108754585 Docker之compose介绍 使用一个Dockerfile模板文件可以定义一个单独的应用容器&#xff0c;如果需要定义多个容器就需要服务编排。下面介绍Docker官方产品&#xff0c;Docker Comp…...

机器学习|正则化|评估方法|分类模型性能评价指标|吴恩达学习笔记

前文回顾&#xff1a;逻辑回归 目录 &#x1f4da;正则化 &#x1f407;过拟合的问题 &#x1f407;代价函数 &#x1f407;正则化线性回归 &#x1f407;正则化的逻辑回归模型 &#x1f4da;模型评估方法 &#x1f407;留出法&#xff08;hold-out&#xff09; &#…...

python迭代器详解

不懂的问题&#xff1a;什么是协变、逆变&#xff1f;渐进式&#xff1f; _T_co TypeVar("_T_co", covariantTrue) # Any type covariant containers.作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&…...

关于Docker逃逸

关于Docker逃逸 文章目录关于Docker逃逸前言一、判断是否为docker容器&#xff1f;二、privileged特权模式启动容器逃逸三、 Docker Remote API未授权访问逃逸四、危险挂载导致Docker逃逸五、危险挂载Docker Socket逃逸六、 挂载宿主机procfs逃逸七、脏牛漏洞来进行docker逃逸八…...

@Autowired和@Resource区别

Autowired和Resource到底有什么区别 Autowired 和 Resource 都是用来实现依赖注入的注解&#xff08;在 Spring/Spring Boot 项目中&#xff09;&#xff0c;但二者却有着 5 点不同&#xff1a; 来源不同&#xff1a;Autowired 来自 Spring 框架&#xff0c;而 Resource 来自…...

动态内存管理详细讲解

目录 1.为什么存在动态内存分配 2. 动态内存函数的介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 今天要和大家分享的内容是的动态内存管理&#xff0c;我们先从他的定义入手学习。 1.为什么存在动态内存分配 我们到现在已经掌握了内存开辟的方式就是要么创建一个变量…...

Python和Excel的完美结合:常用操作汇总(案例详析)

在以前&#xff0c;商业分析对应的英文单词是Business Analysis&#xff0c;大家用的分析工具是Excel&#xff0c;后来数据量大了&#xff0c;Excel应付不过来了&#xff08;Excel最大支持行数为1048576行&#xff09;&#xff0c;人们开始转向python和R这样的分析工具了&#…...

卡特兰数、斯特林数基础

卡特兰数 从格点(0,0)(0,0)(0,0)走到格点(n,n)(n,n)(n,n)&#xff0c;只能向右或向上走&#xff0c;不能穿过对角线&#xff0c;的路径的条数&#xff0c;称为卡特兰数HnH_nHn​。 则有H01H_01H0​1。 通项公式&#xff1a; Hn(2nn)−(2nn−1)H_n\begin{pmatrix} 2n\\ n \en…...

STL——mapmultimap和setmultiset

一、关联式容器 与序列式容器相同&#xff0c;关联式容器也是用于存储数据的&#xff0c;不同的是&#xff0c;关联式容器里存储的是<key, value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。 二、键值对 用来表示具有一一对应的一种结构&#xff0c;该…...

2023热门抖音权重查询小程序源码

2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样&#xff0c;小程序适配优化。接口免费。小程序不是网页 修改教程: 1&#xff0c;如果想修改或者去除水印&#xff0c;直接删除或修改“index.html”12&#xff5e;22行 2&#xff0c;如果想修改logo&#xff0c;直接…...

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]

我认为&#xff0c;无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感&#xff01;&#xff01;&#xff01; 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…...

如何成为优秀的程序员

崔宝秋&#xff0c;现任小米首席架构师、小米云平台负责人。1995年赴美留学&#xff0c;纽约州立大学石溪分校计算机科学系博士毕业&#xff0c;曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师&#xff0c;2012年回国加入小米科技。 20…...

多线程(四):线程安全

在开始讲解线程安全之前我们先来回顾一下我们学了那些东西了&#xff1a; 1. 线程和进程的认识 2. Thread 类的基本用法 3. 简单认识线程状态 4. 初见线程安全 上一章结束时看了一眼线程安全问题&#xff0c;本章将针对这个重点讲解。 一个代码在单线程中能够安全执行&am…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...