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

目录

 一、实验

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 node2)查看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-adminnamespace: jenkins
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: jenkins-admin
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: jenkins-admin
subjects:
- kind: ServiceAccountname: jenkins-adminnamespace: 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-volumelabels:type: local
spec:storageClassName: local-storageclaimRef:name: jenkins-pv-claimnamespace: jenkinscapacity:storage: 5Gi accessModes:- ReadWriteManylocal:path: /home/jenkinsnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: jenkins-pv-claimnamespace: jenkins
spec:storageClassName: local-storageaccessModes:- ReadWriteManyresources: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: jenkinsnamespace: jenkins
spec:replicas: 1selector:matchLabels:app: jenkinstemplate:metadata:labels:app: jenkinsspec:nodeSelector:kubernetes.io/hostname: node2securityContext:fsGroup: 1000 runAsUser: 1000serviceAccountName: jenkins-admincontainers:- name: jenkinsimage: jenkins/jenkins:2.440.3-lts-jdk17resources:limits:memory: "2Gi"cpu: "1000m"requests:memory: "500Mi"cpu: "500m"ports:- name: httpportcontainerPort: 8080- name: jnlpportcontainerPort: 50000livenessProbe:httpGet:path: "/login"port: 8080initialDelaySeconds: 90periodSeconds: 10timeoutSeconds: 5failureThreshold: 5readinessProbe:httpGet:path: "/login"port: 8080initialDelaySeconds: 60periodSeconds: 10timeoutSeconds: 5failureThreshold: 3volumeMounts:- name: jenkins-datamountPath: /var/jenkins_home    volumes:- name: jenkins-datapersistentVolumeClaim: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: jenkinsnamespace: jenkinsannotations:prometheus.io/scrape: 'true'prometheus.io/path:   /   prometheus.io/port:   '8080'
spec:selector:app: jenkinstype: NodePortports:- port: 8080targetPort: 8080nodePort: 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-dockersystemctl restart cri-docker

⑥ 综上分析

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

(3)解决方法

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

① 删除 calico-node-zwfqf 

②已重新拉活

查看

③ pod部署成功

2.journalctl如何查看日志信息

(1)命令

1)以flow形式查看日志 实时滚动
journalctl -f2)查看内核日志
journalctl -k3)查看指定服务日志 实时滚动最新日志
journalctl -u kubelet4)查看指定日期日志
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-usage6)设置日志占用的空间
journalctl --vacuum-size=500M7)设置日志保存的时间
journalctl --vacuum-time=1month8)检查日志文件一致性
journalctl –-verify9)显示最后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-pager12)获取指定进程号的日志
journalctl _PID=2285613)查看指定用户的日志
journalctl _UID=33 --since=today14)通过系统优先级匹配
journalctl _SYSTEMD_UNIT=cron.service PRIORITY=615)查看帮助文档
man journalctl
journalctl -h

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

(1)node节点上查询获取

[root@master jenkins]# kubectl exec -it jenkins-69758d74c9-lb96b -n jenkins /bin/bashjenkins@jenkins-69758d74c9-lb96b:/$ cat /var/jenkins_home/secrets/initialAdminPasswordjenkins@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 bashcat /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.mzph.cn/bicheng/628.shtml

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

相关文章

上位机图像处理和嵌入式模块部署(树莓派4b固件功能设计)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,上位机的功能都是基于插件进行开发的。但是上位机的成本比较贵,一般的企业不一定愿意接接受。这个时候另外一…

【第三版 系统集成项目管理工程师】 十五至尊图

持续更新。。。。。。。。。。。。。。。 【第三版】十五至尊图 十五至尊图【必会】1.整合(7)2.范围 (6)3.进度 (6)4.成本 (4)5.质量(3)6.资源(6&…

【LeetCode: 3117. 划分数组得到最小的值之和 + 动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Jmeter 测试Dubbo接口-实例

1、Dubbo插件准备 ①把jmeter-plugins-dubbo-2.7.4.1-jar-with-dependencies.jar包放在D:\apache-jmeter-5.5\lib\ext目录 ②重新打开Jmeter客户端 在线程组-添加-取样器-dubbo simple,添加dubbo接口请求 2、Jmeter测试lottery接口 ①配置zookeeper参数 由于dub…

【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥…

在PostgreSQL中如何处理大对象(Large Objects),例如存储和检索二进制文件?

文章目录 存储二进制文件为大对象步骤 1:创建一个大对象步骤 2:写入数据到大对象 检索大对象为二进制文件步骤 1:打开大对象以进行读取步骤 2:从大对象读取数据 注意事项 PostgreSQL 提供了对大对象(Large Objects&…

2024蓝桥杯省赛C++软件算法研究生组题解(含代码)+游记

A题 给你一个音游的游戏记录log.txt&#xff0c;判断玩家的最高连击数 题解 水题&#xff0c;但是要小心&#xff0c;miss的键需要重置k0&#xff0c;超时但正确的键重置k1 个人答案是9 代码&#xff1a; #include<cstdio> #include<cstring> #include<al…

高可用集群——keepalived

目录 1 高可用的概念 2 心跳监测与漂移 IP 地址 3 Keepalived服务介绍 4 Keepalived故障切换转移原理介绍 5 Keepalived 实现 Nginx 的高可用集群 5.1 项目背景 5.2 项目环境 5.3 项目部署 5.3.1 web01\web02配置&#xff1a; 5.3.2nginx负载均衡配置 5.3.3 主调度服…

[lesson43]继承的概念和意义

继承的概念和意义 类之间的组合关系 组合关系的特点 将其他类的对象作为当前类的成员使用当前类的对象与成员对象的生命期相同成员对象在用法上与普通对象完全一致 惊艳的继承 面相对象中的继承指类之间的父子关系 子类拥有父类的所有属性和行为子类就是一种特殊的父类子类…

【C语言】每日一题,快速提升(7)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;X图形 示例&#xff1a; 输入&#xff1a; 5 //几行数输出&#xff1a; …

日志情况分析

日志是用来记录信息的&#xff0c;更多是方便于查看各种出错信息。时间、日志等级、日志内容、文件名称已经行号都会显示出来&#xff01;日志等级是什么&#xff1f;就是当出问题时&#xff0c;根据问题成都列出等级 Info:常规消息 Debug&#xff1a;t调试信息 Waring:报警信息…

单臂路由实验

单臂路由是一种在单个物理接口上配置多个逻辑接口&#xff0c;以实现不同VLAN间通信的技术。它通过在路由器接口上划分子接口&#xff0c;每个子接口对应一个VLAN网段&#xff0c;从而实现了VLAN间的互联互通。单臂路由能够重新封装MAC地址&#xff0c;转换VLAN标签&#xff0c…

基于51单片机的简单风扇控制设计—调速、摇头

基于51单片机的风扇控制设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.步进电机模拟风速、摇头 2.按键可以控制风速、摇头&#xff1b; 3.数码管显示风速档位&#xff1b; 4.LED作摇头提示灯…

百度AI大会发布的APP Builder和Agent Builder有什么区别

百度在AI大会发布了三款AI工具&#xff0c;包括智能体开发工具AgentBuilder、AI原生应用开发工具AppBuilder、各种尺寸的模型定制工具ModelBuilder 有很多人就问&#xff0c;APP Builder和Agent Builder有什么不一样&#xff0c;怎么那么多builder? 你们就这么理解&#xff…

云安全与网络安全:有什么区别?

云计算已经存在了一段时间&#xff0c;但某些术语的正确含义仍然存在混乱。一个例子是区分云安全与网络安全。 首先&#xff0c;让我们看一下网络安全一词 &#xff0c;以了解它的含义。然后&#xff0c;我们将将该术语与云安全进行比较&#xff0c;以了解两者在几个关键领域的…

nginx-ingress详解

一、ingress概述 1、概述 Kubernetes是一个拥有强大故障恢复功能的集群&#xff0c;当pod挂掉时&#xff0c;集群会重新创建一个pod出来&#xff0c;但是pod的IP也会随之发生变化&#xff0c;为了应对这种情况&#xff0c;引入了service&#xff0c;通过service的标签匹配&am…

Java项目引入log4j2

log4j2 单独使用 引入依赖 <dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.0</version></dependency><dependency><groupId>o…

了解 Python 底层的解释器 CPython 和 Python 的对象模型

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、CPython CPython 是 Python 编程语言的官方和最广泛使用的实现。它是用 C 语言编写的&#xff0c;因此得名 “CPython”。作为 Python 生态系统的核心&#xff0c;了解 CPython 的工作原理、主要特…

前端 - 基础 表单标签 - label 标签

# label 标签 其实不属于 表单标签名单经常和 表单标签 搭配使用。 # <label> 标签 为 input 元素 定义 标注&#xff08; 标签 &#xff09; 使用场景 # 其实说白&#xff0c;<label> 标签就是为了方便用户体验的,举例说明 就是说&#xff0c;如上示&am…

linux下使用qt+mpv调用GPU硬件解码

linux下GPU硬件解码接口&#xff0c;常用的有vdpau和vaapi。 mpv是基于mplayer开发的一个播放器。此外&#xff0c;mpv还提供了函数库libmpv&#xff0c;通过使用libmpv可以编写一个简单的播放器。 基于qtlibmpv的demo&#xff0c;官方例子代码如下&#xff1a;https://github.…