云原生Kubernetes: K8S 1.29版本 部署Jenkins

news2025/1/16 12:41:38

目录

 一、实验

1.环境

2.K8S 1.29版本 部署Jenkins 服务

3.jenkins安装Kubernetes插件

二、问题

1.创建pod失败

2.journalctl如何查看日志信息

2.容器内如何查询jenkins初始密码

3.jenkins离线安装中文包报错

4.jenkins插件报错


 一、实验

1.环境

(1)主机

表1 主机

主机架构版本IP备注
masterK8S master节点1.29.0192.168.204.8

node1K8S node节点1.29.0192.168.204.9
node2K8S node节点1.29.0192.168.204.10已部署Kuboard

(2)master节点查看集群

1)查看node
kubectl get node
 
2)查看node详细信息
kubectl get node -o wide
 

(3)查看pod

[root@master ~]# kubectl get pod -A

(4) 访问Kuboard

http://192.168.204.10:30080/kuboard/cluster

查看节点

2.K8S 1.29版本 部署Jenkins 服务

(1)master节点创建命名空间

[root@master jenkins]# kubectl create ns jenkins

(2)Kuboard查看名称空间

已新增jenkins

http://192.168.204.10:30080/kubernetes/K8S-1.29/cluster/namespace

(3)创建serviceAccount服务账户

用来定义运行在Pod中的进程(容器)对Kubernetes API的访问权限的身份。

[root@master jenkins]# vim serviceAccount.yaml

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: jenkins-admin
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-admin
  namespace: jenkins
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins-admin
subjects:
- kind: ServiceAccount
  name: jenkins-admin
  namespace: jenkins

(4)生成资源

[root@master jenkins]# kubectl apply -f serviceAccount.yaml

(5)创建持久化清单

分配一个名为jenkins-pv-volume的pv容量为5G,在这个pv中分名为jenkins-pv-claim的pvc限制3G,挂载目录为/hone/jenkins,挂载节点为node2

[root@master jenkins]# vim volume.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-pv-volume
  labels:
    type: local
spec:
  storageClassName: local-storage
  claimRef:
    name: jenkins-pv-claim
    namespace: jenkins
  capacity:
    storage: 5Gi 
  accessModes:
    - ReadWriteMany
  local:
    path: /home/jenkins
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - node2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pv-claim
  namespace: jenkins
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 3Gi 

(6) node2节点创建挂载的目录

[root@node2 ~]# mkdir /home/jenkins
[root@node2 ~]# chmod 777 jenkins/

(7)生成pv资源

[root@master jenkins]# kubectl apply -f volume.yaml

查看

[root@master jenkins]# kubectl get pv -n jenkins

(8)docker hub 查看jenkins镜像

https://hub.docker.com/r/jenkins/jenkins/tags


(9)node节点提前拉取镜像

node2节点

[root@node2 ~]# docker pull jenkins/jenkins:2.414.1

 (10)创建deployment配置文件

[root@master jenkins]# vim deployment.yaml 

挂载pv的节点为node2,image镜像版本为2.440.3-lts-jdk17 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      nodeSelector:
        kubernetes.io/hostname: node2
      securityContext:
            fsGroup: 1000 
            runAsUser: 1000
      serviceAccountName: jenkins-admin
      containers:
        - name: jenkins
          image: jenkins/jenkins:2.440.3-lts-jdk17
          resources:
            limits:
              memory: "2Gi"
              cpu: "1000m"
            requests:
              memory: "500Mi"
              cpu: "500m"
          ports:
            - name: httpport
              containerPort: 8080
            - name: jnlpport
              containerPort: 50000
          livenessProbe:
            httpGet:
              path: "/login"
              port: 8080
            initialDelaySeconds: 90
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 5
          readinessProbe:
            httpGet:
              path: "/login"
              port: 8080
            initialDelaySeconds: 60
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          volumeMounts:
            - name: jenkins-data
              mountPath: /var/jenkins_home    
      volumes:
        - name: jenkins-data
          persistentVolumeClaim:
              claimName: jenkins-pv-claim

(11) 创建资源

[root@master jenkins]# kubectl apply -f deployment.yaml

查看pod

[root@master jenkins]# kubectl get pods -n jenkins -o wide -w

(12)创建service

[root@master jenkins]# vim service.yaml

Kubernetes的监控注解配置(配置Prometheus来抓取指标的注解设置):

annotations:这是Kubernetes资源的注解字段,用于附加非标准的元数据。

prometheus.io/scrape:这是一个特殊的注解键,表示是否应该抓取这个服务的指标。

true:这是prometheus.io/scrape注解的值,表示应该抓取这个服务的指标。

prometheus.io/port注解指定了Prometheus用来抓取指标的端口。

具体配置:

apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
  annotations:
      prometheus.io/scrape: 'true'
      prometheus.io/path:   /   
      prometheus.io/port:   '8080'
spec:
  selector:
    app: jenkins
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 32000

(13)生成service资源并查看

[root@master jenkins]#  kubectl apply -f service.yaml

查看svc

[root@master jenkins]# kubectl get svc -n jenkins

(14)Kuboard查看

工作负载

容器组

(15)访问

http://192.168.204.10:32000

(16)获取密码

[root@master jenkins]# kubectl logs -f jenkins-69758d74c9-6tc8s -n jenkins

  密码在这一段:

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

df904552c24d46999f2bfb44b0aa916e

(17)输入密码

可以跳过插件安装

可以点击右上角X 跳过安装

开始使用

(18)进入系统

3.jenkins安装Kubernetes插件

(1)点击系统右下角

Website可以跳转中文官网

https://www.jenkins.io/zh/

(2)管理界面

https://192.168.204.10:32000/manage

插件管理

https://192.168.204.10:32000/manage/pluginManager/advanced

设置国内源

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

System也可以设置 Resource Root URL

(3)修改密码与时区

(4)重新登录

(5)master节点上重启jenkins

[root@master jenkins]#  kubectl delete pods jenkins-69758d74c9-6tc8s -n jenkins

(6)查看pod

[root@master jenkins]# kubectl get pod -n jenkins

(7)node2节点查看

[root@node2 var]# cd /home/jenkins/
[root@node2 jenkins]# ls

(8)容器进入查看

内容与node2的/home/jenkins/ 一致

[root@master jenkins]# kubectl exec -it jenkins-69758d74c9-hxb89 -n jenkins /bin/bash

(9)离线安装包

https://updates.jenkins-ci.org/download/plugins/

下载中文包

https://updates.jenkins-ci.org/download/plugins/localization-zh-cn/

(10)安装中文离线包

安装:

完成:(需要重新拉活pod)

(11)安装Kubernetes插件

完成:

(12) jenkins绑定k8s集群

创建

查看 Kubernetes API server

[root@master ~]# kubectl cluster-info

连接测试 (因为是基于K8S部署的jenkins,也部署了Service Account的所以不需要填key)

测试成功:

完成连接:

(13)最后再次查看Kuboard

jenkins名称空间

kube-system名称空间

(14)其他方式的jenkins部署

可以参考本人博客:

持续集成交付CICD:Jenkins部署-CSDN博客

二、问题

1.创建pod失败

(1)报错

节点创建Pod会一直卡在ContainerCreating的状态无法顺利创建并且就绪,READY状态一直为0/1

(2)原因分析

①查看pod

[root@master jenkins]# kubectl describe pod jenkins-69758d74c9-6tc8s -n jenkins

最后显示FailedCreatePodSandBox

Warning  FailedCreatePodSandBox  7m18s                  kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "7d71985b3886817eb93f1885835a0bb869f67a4de34797266ff850f53f62af1c" network for pod "jenkins-69758d74c9-6tc8s": networkPlugin cni failed to set up pod "jenkins-69758d74c9-6tc8s_jenkins" network: plugin type="calico" failed (add): error getting ClusterInformation: connection is unauthorized: Unauthorized, failed to clean up sandbox container "7d71985b3886817eb93f1885835a0bb869f67a4de34797266ff850f53f62af1c" network for pod "jenkins-69758d74c9-6tc8s": networkPlugin cni failed to teardown pod "jenkins-69758d74c9-6tc8s_jenkins" network: plugin type="calico" failed (delete): error getting ClusterInformation: connection is unauthorized: Unauthorized]
  Normal   SandboxChanged          2m1s (x25 over 7m18s)  kubelet            Pod sandbox changed, it will be killed and re-created.

②node2节点继续查看cni的日志

sudo journalctl -xe | grep cni

  最后一个显示failed to "KillPodSandbox" 

4月 19 16:50:55 node2 kubelet[51899]: E0419 16:50:55.608296   51899 kubelet.go:2032] failed to "KillPodSandbox" for "2e3c9e42-396b-4b9b-980a-b8275991b8a8" with KillPodSandboxError: "rpc error: code = Unknown desc = networkPlugin cni failed to teardown pod \"jenkins-696cf86678-jx477_jenkins\" network: plugin type=\"calico\" failed (delete): error getting ClusterInformation: connection is unauthorized: Unauthorized"
4月 19 16:50:55 node2 kubelet[51899]: E0419 16:50:55.608390   51899 pod_workers.go:1298] "Error syncing pod, skipping" err="failed to \"KillPodSandbox\" for \"2e3c9e42-396b-4b9b-980a-b8275991b8a8\" with KillPodSandboxError: \"rpc error: code = Unknown desc = networkPlugin cni failed to teardown pod \\\"jenkins-696cf86678-jx477_jenkins\\\" network: plugin type=\\\"calico\\\" failed (delete): error getting ClusterInformation: connection is unauthorized: Unauthorized\"" pod="jenkins/jenkins-696cf86678-jx477" podUID="2e3c9e42-396b-4b9b-980a-b8275991b8a8"
4月 19 16:50:56 node2 sudo[73408]:     root : TTY=pts/1 ; PWD=/etc/cni/net.d ; USER=root ; COMMAND=/bin/journalctl -xe

③CNI的配置文件默认在/etc/cni/net.d/目录,进入目录查看

[root@node2 net.d]# cd /etc/cni/net.d/
[root@node2 net.d]# ls

nodename为node2,正确的

[root@node2 net.d]# vim 10-calico.conflist 

④ 查看kubelet日志

[root@node2 net.d]# journalctl --since="2024-04-19 16:00:00" --until="2024-04-19 17:00:00" -fu kubelet

显示Failed to stop sandbox

4月 19 16:56:55 node2 kubelet[51899]: E0419 16:56:55.626079   51899 kuberuntime_manager.go:1381] "Failed to stop sandbox" podSandboxID={"Type":"docker","ID":"2958227182cb84e9c4bc0d44a662316ab58355f1cb9bb8a1923225d9b37247fc"}

最后显示failed to "KillPodSandbox"

4月 19 16:56:55 node2 kubelet[51899]: E0419 16:56:55.626182   51899 kubelet.go:2032] failed to "KillPodSandbox" for "18e3512f-846a-42c3-a10b-6bb0a2a33533" with KillPodSandboxError: "rpc error: code = Unknown desc = networkPlugin cni failed to teardown pod \"jenkins-69758d74c9-br846_jenkins\" network: plugin type=\"calico\" failed (delete): error getting ClusterInformation: connection is unauthorized: Unauthorized"

⑤ 查看各节点cri-docker 并重启服务

systemctl status cri-docker

systemctl restart cri-docker

⑥ 综上分析

原因是node2节点的cni容器出现了异常无法为pod分配ip导致的卡在ContainerCreating的状态。

(3)解决方法

删除异常节点的calico-node容器,让它拉起重新同步数据即可修复。

① 删除 calico-node-zwfqf 

②已重新拉活

查看

③ pod部署成功

2.journalctl如何查看日志信息

(1)命令

1)以flow形式查看日志 实时滚动
journalctl -f
 
2)查看内核日志
journalctl -k
 
3)查看指定服务日志 实时滚动最新日志
journalctl -u kubelet
 
4)查看指定日期日志
journalctl --since="2024-04-19 16:00:00" -fu kubelet
journalctl --since="2024-04-19 16:00:00" --until="2024-04-19 17:00:00" -fu kubelet
#  –until “1 hour ago”   /    –until now
journalctl --since “10 min ago” #显示最近10分钟内的日志
journalctl --since today/yesterday #显示今天/昨天以来的日志
 
 
5)查看日志占用的磁盘空间
journalctl --disk-usage
 
6)设置日志占用的空间
journalctl --vacuum-size=500M
 
7)设置日志保存的时间
journalctl --vacuum-time=1month
 
8)检查日志文件一致性
journalctl –-verify
 
9)显示最后num行的日志,如果省略num,则默认显示最后10行
journalctl -n [num]
 
10)设置日志输出格式
journalctl -o
#格式如下:
mode的值为(short, short-iso,short-precise, short-monotonic, verbose,export, json, json-pretty, json-sse, ca)
 
11)正常标准输出 日志默认分页输出,–no-pager改为正常的标准输出
journalctl --no-pager
 
12)获取指定进程号的日志
journalctl _PID=22856
 
13)查看指定用户的日志
journalctl _UID=33 --since=today
 
14)通过系统优先级匹配
journalctl _SYSTEMD_UNIT=cron.service PRIORITY=6
 
15)查看帮助文档
man journalctl
journalctl -h
 

2.容器内如何查询jenkins初始密码

(1)node节点上查询获取

[root@master jenkins]# kubectl exec -it jenkins-69758d74c9-lb96b -n jenkins /bin/bash

jenkins@jenkins-69758d74c9-lb96b:/$ cat /var/jenkins_home/secrets/initialAdminPassword

jenkins@jenkins-69758d74c9-lb96b:/$ exit

(2)获取到运行的容器ID,然后进入容器查看初始密码

[root@node2 ~]# docker ps -a

jenkins镜像id为4e586344183a

[root@node2 ~]# docker ps -a | grep jenkins

查看

docker ps -a --filter ancestor=4e586344183a --format "{{.ID}}"

进入容器

docker exec -it 0821261b4091 bash

cat /var/jenkins_home/secrets/initialAdminPassword

3.jenkins离线安装中文包报错

(1)报错

(2)原因分析

需要先安装Localization Support。

(3)解决方法

先离线安装Localization Support:

然后安装中文包:

重新拉活jenkins

[root@master jenkins]# kubectl delete pods jenkins-69758d74c9-hxb89 -n jenkins

观察pod:(68s完成重启)

成功:

4.jenkins插件报错

(1)报错

站点报错

安装Kubernetes离线包报错

(2)原因分析

因为 K8s 集群中运行的 Jenkins 的 pod 无法 ping 通外部网络域名,才导致网络报错问题。

(3)解决方法

 ①查看系统的 coredns pod 容器信息

[root@master ~]# kubectl get pods -n kube-system -o wide |grep coredns

②Kuboard查看

③查看 dns server 的信息

[root@master ~]# kubectl get svc -n kube-system -o wide

dns server 的 IP是10.96.0.10

④node节点操作无权限

echo "$(sed 's/10.96.0.10/10.244.166.133/g' /etc/resolv.conf)" >  /etc/resolv.conf

⑤docker进入容器操作无权限

⑥coredns 扩容

原先coredns只部署在了node1节点,现在扩容为3个

完成:node2节点部署的pod为10.244.104.10

查看pod

[root@master ~]# kubectl get pods -n kube-system -o wide |grep coredns

⑦通过docker cp拷贝进行修改

将容器中的文件拷贝出来

[root@node2 /]# sudo docker cp 0821261b4091:/etc/resolv.conf ~

查看配置文件

修改配置文件

将容器中的文件拷贝回去,还是无权限

[root@node2 ~]# sudo docker cp resolv.conf 0821261b4091:/etc/

⑧root用户进入docker容器

修改文件

echo "$(sed 's/10.96.0.10/10.244.104.10/g' /etc/resolv.conf)" >  /etc/resolv.conf

⑨重新启动一下 jenkins 服务

观察pod拉活情况

⑩jenkins成功获取插件信息

安装:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1608790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务使用SockJs+Stomp实现Websocket 前后端实例 | Vuex形式断开重连、跨域等等问题踩坑(一)

大家好,我是程序员大猩猩。 之前几篇文章,我们讲了Spring Cloud Gateway的轻量级实现,Nginx的配置概念与实现,如以下往期文章。 轻量级的Spring Cloud Gateway实践,实现api和websocket转发轻松实现Nginx的HTTP与WebS…

OpenHarmony实战开发-搜索功能实现案例、如何使用includes方法对数据实现模糊查询

介绍 本示例介绍使用includes方法对数据实现模糊查询 效果图预览 使用说明 点击首页搜索框跳转到搜索页面在搜索页面输入框中输入搜索的内容,下方列表自动根据搜索的内容进行筛选渲染点击筛选后的列表跳转到相应的页面跳转后会保存搜索历史,搜索历史使…

14-Error Handling (错误处理)

ESP32-S3错误处理:理解并掌握其重要性 在编程中,错误处理是一种重要的编程实践,它可以帮助我们的程序在遇到错误时能够优雅地恢复,而不是崩溃或产生不可预测的结果。在IDF中官方提供一些实用的错误处理技巧。👩‍&…

java扩展jmeter依赖

前置条件 创建一个maven项目&#xff0c; 引入依赖 <dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>3.2</version> </dependency> <dependency><groupId&g…

吴恩达2022机器学习专项课程(一) 6.1 动机第三周课后实验:Lab1使用逻辑回归进行分类

问题预览/关键词 回归和分类的区别&#xff1f;逻辑回归的作用是&#xff1f;什么是二分类问题&#xff1f;二分类问题案例如何表达二分类的结果&#xff1f;逻辑回归通常用哪种表达形式&#xff1f;什么是正样本和负样本&#xff1f;什么是阈值&#xff1f;可视化线性回归解决…

论婚恋相亲交友软件的市场前景和开发方案H5小程序APP源码

随着移动互联网的快速发展和社交需求的日益增长&#xff0c;婚恋相亲交友软件小程序成为了越来越多单身人士的选择。本文将从市场前景、使用人群、盈利模式以及竞品分析等多个角度&#xff0c;综合论述这一领域的现状与发展趋势。 一、市场前景 在快节奏的现代生活中&#xf…

ubuntu 22.04 编译 ORBSLAM3

源码地址&#xff08;带注释&#xff09;&#xff1a;ORBSLAM3 根据你安装的openCv版本修改cmake 修改2个文件的2个地方&#xff1a; ORB_SLAM3_detailed_comments-master/CMakeLists.txt ORB_SLAM3_detailed_comments-master/Thirdparty/DBoW2/CMakeLists.txt 查找openCv的地…

Python 爬虫如何配置代理 IP (Py 采集)

在Python中配置代理IP&#xff0c;可以通过设置requests库的proxies参数来实现。以下是一个示例&#xff1a; import requests# 则立可以获取稳定代理Ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg # 推荐使用私密动态 IP proxies {"http": "ht…

Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models论文解读

文章目录 前言一、摘要二、引言三、文献1、大语言模型文献2、视觉语言模型文献3、LLM作为生成助手文献 四、模型方法与结果1、Dual Vision Encoders3、Patch Info Mining4、Text and Image Generation1、Text-image Instructions2、Generation-related Instructions 五、实验结…

webAssembly学习及使用rust

学习理解 webAssembly 概念知识&#xff0c;使用 API 进行 web 前端开发。 概念 是一种运行在现代网络浏览器中的新型代码&#xff0c;并且提供新的性能特性和效果。它有一种紧凑的二进制格式&#xff0c;使其能够以接近原生性能的速度运行。C/C、 C#、Rust等语言可以编译为 …

手写Java设计模式之抽象工厂模式,附源码解读

接上篇&#xff0c;抽象工厂模式将汽车的一些属性可以抽象出来&#xff0c;可以理解为给不同汽车品牌生成时加上不同的特性&#xff0c;如颜色等&#xff0c;具体代码如下&#xff1a; 引入颜色接口&#xff1a; public interface Colour {void fill(); }将颜色与汽车生成品牌…

Django项目使用uwsgi+nginx部署上线

Django项目使用uwsginginx部署上线 前言settings 配置安装uwsgi 和配置uwsgi推荐配置文件启用wsgi不使用nginx的配置&#xff08;不推荐&#xff09;使用nginx的配置 安装 nginx和配置niginx 配置 运行参考资料 前言 代码已经开发完成&#xff0c;正式部署上线 settings 配置…

公网IP地址如何申请SSL证书?有免费的IP ssl吗?

如果用户没有域名或只有公网IP地址或者不方便使用域名&#xff0c;IP地址ssl证书这一特殊的证书可以为IP地址实现HTTPS的安全保护&#xff0c;提高网站数据传输的安全性。 IP地址申请SSL证书的基本步骤 IP ssl证书下载---注册填写230916https://www.joyssl.com/certificate/sel…

Stable Diffusion UI 从安装到实现文字图片融合(光影字,错觉图)图片制作详细教程

前言 最近在实践大模型本地部署&#xff0c;前几天在本地部署了一个ChatGLM大模型&#xff0c;刚好环境搭好了&#xff0c;也支持跑Stable Diffusion&#xff0c;所以就安装了再尝试一下。 原因是之前在B站上有大佬做了一个Windows电脑能一键运行的Stable Diffusion的安装包&…

镜舟科技荣获金科创新社 2024 年度金融数据智能解决方案奖

近日&#xff0c; 镜舟科技凭借领先的金融实时数仓构建智能经营解决方案&#xff0c;在“金科创新社第六届金融数据智能优秀解决方案评选”活动中&#xff0c;成功入选“数据治理与数据平台创新优秀解决方案”榜单。 金科创新社主办的“鑫智奖”评选活动&#xff0c;旨在展示…

密码学 | 承诺:基本概念

目录 正文 1 承诺的交互 2 承诺的属性 3 硬币抛掷问题 3.1 朴素版方案 3.2 承诺版方案 &#x1f951;源自&#xff1a;https://en.wikipedia.org/wiki/Commitment_scheme &#x1f951;写在前面&#xff1a;英文的承诺是 commitment scheme&#xff0c;否则很难进行…

Unity射击游戏开发教程:(1)玩家控制

玩家的移动 玩家控制和移动是视频游戏中最酷的事情之一,因为你正在控制游戏中的某些东西 现在游戏中的玩家是我们的蓝色方块英雄。我在游戏开发中了解到,游戏是用简单的对象制作原型,然后添加所有漂亮的艺术和声音。代码… 我们要做的第一件事是在游戏开始时为玩家提供一个…

uniapp H5项目 获取接口的二进制流转化成图片url(base64)

如果你使用的是uniapp, 并且你从接口获取下来的数据长这样&#xff1a; 想要把取到的数据展示成图片&#xff0c;那么你可以这样做&#xff1a; // 这是我们的项目封装的请求方法const res await this.$api.getKaptcha({originResponse: true, // 这样写是为了在request那边特…

js中let和var的区别

在JavaScript中&#xff0c;var、let和const都用于声明变量&#xff0c;但它们之间存在一些重要的区别。特别是let和var之间的区别&#xff0c;我们可以概括为以下几点&#xff1a; 作用域&#xff08;Scope&#xff09;&#xff1a;var有函数作用域或全局作用域&#xff0c;而…

STM32实现硬件I2C通讯,读取MPU6050的ID号

今天学习了使用硬件I2C的方式成功读取MPU6050的ID号&#xff0c;特此记录一下过程&#xff1a; 首先需要学习的是MPU6050的初始化&#xff1a; 第一步&#xff1a;打开GPIOB的时钟&#xff08;因为I2C2的引脚10,11在GPIOB上&#xff09; 第二步&#xff1a;打开I2C2的时钟 …