Submariner 部署全过程

Submariner 部署全过程

部署集群配置

broker 集群:

  • pod-cidr:11.244.0.0/16

  • service-cidr 11.96.0.0/12

  • broker 172.100.0.109

  • node 172.100.0.108

集群 1( pve3 ):

  • pod-cidr:10.244.0.0/16

  • service-cidr 10.96.0.0/12

  • k8s-master 172.100.0.106

  • node1 172.100.0.104

  • node2 172.100.0.105

集群 2 ( pve2 ):

  • pod-cidr:10.244.0.0/16

  • service-cidr 10.96.0.0/12

  • k8s-master 172.110.0.102

  • k8s-node1 172.110.0.105

subctl 安装

下载 subctl 二进制文件,并部署到相应路径:

# github 地址
https://github.com/submariner-io/get.submariner.io
# 运行命令
curl -Ls https://get.submariner.io | bash
export PATH=$PATH:~/.local/bin
echo export PATH=\$PATH:~/.local/bin >> ~/.profile
source   ~/.profile

​ 如果运行 curl 命令的时候报错请求403的问题,可以先把网页的命令代码存到 .sh 文件中,再用 bash 命令执行

curl -L https://get.submariner.io -o install_submariner.sh
bash install_submariner.shsubctl uninstal

image-20240901143317056

image-20240901133913458

部署 Broker

​ Broker 集群可以是专用集群,也可以是连接的集群之一。执行 subctl deploy-broker 命令部署 Broker,Broker 只包含了一组 CRD,并没有部署 Pod 或者 Service。

subctl deploy-broker# 删除submariner
subctl uninstall --kubeconfig /root/.kube/config3 broker-info.subm --yes
subctl uninstall --kubeconfig /root/.kube/configheader broker-info.subm --yes
subctl uninstall deploy-broker /root/.kube/config

image-20240901134119749

​ 部署完成后,会生成 broker-info.subm 文件,文件以 Base64 加密,其中包含了连接 Broker 集群 API Server 的地址以及证书信息,还有 IPsec 的密钥信息

加入集群

​ 执行 subctl join 命令将 集群1 和 集群2 两个集群加入 Broker 集群。使用 --clusterid 参数指定集群 ID,每个集群 ID 需要唯一。提供上一步生成的 broker-info.subm 文件用于集群注册

subctl join broker-info.subm --clusterid pve2
subctl join broker-info.subm --clusterid pve3

​ 但是这里虚拟机上的文件无法下载上传,没有 broker 集群的证书文件集群没有加入权限

image-20240901144555602

image-20240901135218564

​ 使用 scp 命令进行主机与主机之间的文件传输

scp file 远程用户名@远程服务器IP:~/
# 冒号和目录之间无空格

image-20240901145547251

image-20240901145835269

​ 会提示我们选择一个节点作为 Gateway Node,集群1 选择 node1 节点作为 Gateway,集群2 选择 k8s-node1 节点作为 Gateway。之后会分别使用这两个节点的地址在两个集群间建立隧道连接

image-20240901145859854

image-20240901145955267

image-20240901145659700

命令查看集群间连接情况,发现链接并未建立

subctl show connections 

image-20240902123405763

查看 submariner 的节点运行状态,发现网关 Pod 运行异常image-20240901150610149

集群网段 CIDR 异常

​ 查看 Pod 信息和日志发现,网关节点创建失败,无法在IP地址为[“10.244.0.0/16”]的主机上找到CNI接口。初步判断是集群为 Pod 分配网段出现问题

kubectl describe pod <Pod名称> <命名空间>
kubectl logs <Pod名称> <命名空间>

image-20240901150547050

image-20240901151107828

更改k8s网段 CIDR

涉及到pod网段的位置包括

  • cilium

  • controller-manager

  • kube-proxy

# 查看 cilium 配置文件
kubectl edit configmap cilium-config -n kube-system
# 重启 cilium
kubectl rollout restart daemonset cilium -n kube-system
# 删除 pod 重启
kubectl get daemonset -n kube-system
kubectl delete pods -l k8s-app=cilium -n kube-system

image-20240901154456472

image-20240901154404358

# 修改controller-manager的配置
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

image-20240901153114529

# 修改kube-proxy的配置
kubectl edit cm kube-proxy -n kube-system

image-20240901153212216

重启,再次创建 pod 网段未更改

image-20240901154932228

​ 由于系统初始化的 coredns pod 的 IP 是根据网络插件的 CIDR 来分配 IP 的,所以需要在集群初始化时,更改插件的 CIDR配置

helm uninstall cilium -n kube-system

image-20240905152618197

# 生成网络插件配置文件
helm show values cilium/cilium > values.yaml

​ 更改 cilium 的 values.yaml 配置文件相关网段部分

image-20240905155156404

# 根据配置文件安装插件helm install cilium cilium/cilium --namespace kube-system -f values.yaml

image-20240905155305866

​ 更改后 Pod 的 IP 的 CIDR 为网络插件的设置

image-20240905211239055

启用globalnet 建立隧道

​ 在不启用 globalnet 的情况下,CIDR 用重叠的两个集群之间,是无法建立连接的,因为 pod 之间的 IP 可能会出现重复无法辨别的情况

image-20240906093900554

​ 在不启用 globalnet 的情况下,CIDR 完全不重叠的两个集群之间是可以建立连接的,且建立好之后,直接通过 Pod 的 IP 就可以进行通信

image-20240906095838995

image-20240906153243179

​ 如果想在 CIDR 有重复的集群之间建立连接,需要启用 globalnet

# 建立 broker
subctl --kubeconfig ~/.kube/config deploy-broker --globalnet# 加入 
subctl  join broker-info.subm --clusterid pve3 --globalnet --cable-driver vxlan --health-check=false# 指定网关节点,打标签
kubectl label nodes cluster1 submariner.io/gateway=true
# 查看集群注册信息
kubectl get clusters.submariner.io -n submariner-k8s-broker
# 删除
kubectl delete clusters.submariner.io <cluster-name> -n submariner-k8s-broker

image-20240906124502330

​ 查看日志,隧道和路由成功建立

image-20240906100227436

​ 启用 globalnet 后,虚拟 CIDR 可以 自定义设置,但是设置的虚拟网段的地址不能重叠,否则同样无法建立隧道

image-20240906125544265

​ 还有一点,由于网络插件 Cilium 的网络配置 主要支持 vxlan,submariner 建立 IPsec 隧道,隧道状态为 error。(据说,更改一下网络插件的相关设置可以解决这个问题,但目前还没有尝试,使用 vxlan 建立隧道)

image-20240907193758134

image-20240906143158264

​ 以上问题都解决之后,就可以正常建立隧道通信了,globalnet 会为每一个集群自动分配不重叠的 CIDR

image-20240906184301862

​ 我们在一个集群中创建一个 nginx 的测试服务,并把它导出,其他集群会自动创建 导入服务(需要有相同的命名空间,否则无法导入)

image-20240906173906959

image-20240906174042544

image-20240907195141104

image-20240907151918912

验证测试

# 进入pod
kubectl exec -it <your-pod> -- bash
apt update
# 安装 nslookup
apt install -y dnsutils
终端测试

image-20240907195539017

image-20240908145407706

​ 如果终端无法解析 DNS,在配置中添加 coredns 网址

sudo nano /etc/resolv.conf

image-20240908145516207

image-20240908145547759

image-20240908145604363

image-20240908145638359

image-20240907153830029

image-20240907153848915

​ 终端可以解析 DNS网址,也可以跨集群访问

Pod 内部测试
# 安装网络工具
apt-get install iputils-ping dnsutils -y
iputils-ping # 包含 ping 工具。
dnsutils # 包含 nslookup 工具。

image-20240907195834070

image-20240907195851982

Pod 内部可以解析 DNS 网址,但是无法访问


网络插件 Cilium 更换 Calico

集群使用 submariner ,通过网络检测发现 Cilium 插件可能兼容性不太好

subctl diagnose all

image-20240913142601191

翻阅官网查询得知,submariner 官方已经测试的CNI插件并不包括 Cilium

image-20240919173618715

Cilium 彻底卸载

helm uninstall cilium -n kube-system

image-20240913145058171

# 检查集群中的所有 CNI 插件(集群的每个节点都需要删除)
sudo ls /etc/cni/net.d/# 删除
sudo rm /etc/cni/net.d/05-cilium.conflist
sudo rm /etc/cni/net.d/10-flannel.conflist.cilium_bak

image-20240913145209604

ifconfig
sudo reboot

image-20240912184411303

image-20240913145447148

image-20240911201223416

Calico安装

calico官网地址:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

安装Tigera Calico操作符和自定义资源定义:

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml

如果报错连接不上的话将文件手动下载下来再执行

wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml
或者
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yamlkubectl create -f tigera-operator.yaml 

下载下来后不能用 kubectl apply -f 来执行,会报错

The CustomResourceDefinition “installations.operator.tigera.io” is invalid: metadata.annotations: Too long: must have at most 262144 bytes

意思是 annotation 长度过长了,原因是 apply 和 create 的处理不同
改配置文件中这个选项的长度就不改了,不用 apply 使用 create

这里没有报错就没有问题

​ 但运行完之后要查看一下 tigera-operator 运行是否正常,如果状态为Running 则继续执行下面的步骤

​ 这里可能会出现 容器创建失败 的情况,查看日志一般是因为镜像拉取失败,查看配置文件关于镜像的部分,这里需要单独拉取镜像

第二步将配置文件下载下来,因为要改内容:

# 下载客户端资源文件
curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml

这个文件中的 192.168.0.0init 时指定的 --pod-network-cidr

image-20240913150758915

# 或者修改pod的网段地址
sed -i 's/cidr: 192.168.0.0/cidr: 10.244.0.0/16' custom-resources.yaml

最后根据这个文件创建资源,执行下面这行命令:

kubectl create -f custom-resources.yaml

这里如果你的集群无法拉取国外镜像,可以尝试配置镜像加速器

sed -i 's#config_path = ""#config_path = "/etc/containerd/certs.d"#' /etc/containerd/config.tomlmkdir /etc/containerd/certs.d/docker.io/ -p# 这里的加速器地址可以选择阿里云的镜像加速地址
cat >/etc/containerd/certs.d/docker.io/hosts.toml <<EOF
[host."https://dbxvt5s3.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
capabilities = ["pull"]
EOF#重启containerd
systemctl restart containerd

​ 如果,配置了镜像加速器依然无法拉取,这时就需要比较繁琐复杂的过程了(因为我没有找到国内的可以镜像源地址,所以选择在本地拉取dockerhub 镜像传到个人镜像仓库再进行拉取,当然也可以打包直接传到主机)

​ 需要拉取的镜像如下:

docker.io/calico/typha:v3.28.0

docker.io/calico/apiserver:v3.28.0

docker.io/calico/cni:v3.28.0

docker.io/calico/csi:v3.28.0

docker.io/calico/kube-controllers:v3.28.0

docker.io/calico/node-driver-registrar:v3.28.0

docker.io/calico/node:v3.28.0

docker.io/calico/pod2daemon-flexvol:v3.28.0

需要注意的是,如果你采用这种方式,不要只在主节点拉取镜像,部分镜像也需要在工作节点拉取

# 本地拉取镜像
docker pull docker.io/calico/typha:v3.28.0# 上传阿里云私人仓库
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/leung_qw/typha:[镜像版本号]docker push registry.cn-hangzhou.aliyuncs.com/leung_qw/typha:[镜像版本号]# 拉取镜像
sudo ctr -n k8s.io image pull registry.cn-hangzhou.aliyuncs.com/leung_qw/typha:v3.28.0sudo ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/leung_qw/typha:v3.28.0 docker.io/calico/typha:v3.28.0# 查看镜像
sudo ctr -n k8s.io image list | grep calico

image-20240913152316106

上传到私人镜像仓库,拉取后更改 tag

image-20240913152434733

image-20240913153017536

image-20240913153124554

主机拉取镜像的时候,一定要带-n k8s.io 的命名空间,否则会出现,无法检测到本机镜像的情况

image-20240913100256462

image-20240913153411524

其他镜像如法炮制

​ 如果,你在一台主机上已经有了上面的镜像,也可以将镜像打包,传给其他节点导入

# 镜像打包
sudo ctr -n k8s.io images export <path-to-tar-file> <image-name>:<tag>
# 例如
sudo ctr -n k8s.io images export typha.tar docker.io/calico/typha:v3.28.0# 传递文件
scp file 远程用户名@远程服务器IP:/path/to/destination
# 例如
scp typha.tar public@172.100.0.104:~/# 导入镜像
sudo ctr -n k8s.io images import typha.tar

使用 cilium 插件时的 submariner 以及 更换 calico 后

subctl diagnose all

image-20240913142601191

image-20240913142435860


将 k8s 集群的 CNI 插件更换 Calico 后,正常情况下,所有的节点均处于Running 状态,但是当集群加入 submariner 后,vx-submariner 隧道建立后,会导致 calico-node 状态异常

image-20240918103615211

​ 查询日志发现是隧道虚拟网卡无法建立 BGP ,Calico 主要靠 BGP 负责网络路由功能,在集群节点之间分发路由信息

image-20240917174721484

image-20240917174754503

​ calico-node 状态的异常会导致,集群内部的通信无法到达网关节点

image-20240917181524755

Calicoctl 安装

​ 版本号选择自己安装的版本

# 查看calico版本
kubectl get deployment -n kube-system calico-kube-controllers -o yaml | grep image  
# 下载二进制文件
curl -O -L https://github.com/projectcalico/calico/releases/download/v3.28.0/calicoctl-linux-amd64

安装 calicoctl

# 添加可执行权限
chmod +x calicoctl-linux-amd64
# 安装
sudo mv calicoctl-linux-amd64 /usr/local/bin/calicoctl
# 设置环境变量
export CALICO_DATASTORE_TYPE=kubernetes
export CALICO_KUBECONFIG=~/.kube/config

如果不希望每次执行 calicoctl 之前都需要设置环境变量,可以将环境变量信息写到永久写入到 /etc/calico/calicoctl.cfg 文件(~/.kube/config 要更换成自己的路径)

mkdir -vp /etc/calico
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:datastoreType: "kubernetes"       kubeconfig: "home/public/.kube/config"

image-20240918154406541

# 通过~/.kube/config连接kubernetes集群,查看已运行节点
DATASTORE_TYPE=kubernetes KUBECONFIG=~/.kube/config calicoctl get nodes# 或者(如果写入环境变量后)
calicoctl get nodes

image-20240918154414637

配置 Calico IPPools 并且重新部署 submariner

​ 重新部署submariner,一定要卸载干净,仅仅使用subctl uninstall会有部分遗留。执行命令后要注意一下 submariner-operator 命名空间是否删除

​ 如果 submariner-operator 命名空间处于 Terminating 状态长时间未被删除,这可能是因为有某些资源仍然存在,或者有 Finalizer 阻止了删除。

​ 移除 Finalizers。Finalizers 会阻止命名空间被删除。

获取命名空间的详细信息

kubectl get namespace submariner-operator -o json > namespace.json

编辑 JSON 文件

​ 打开 namespace.json 文件,找到 spec.finalizers 字段,将其删除。

{"apiVersion": "v1","kind": "Namespace","metadata": {"name": "submariner-operator","finalizers": ["kubernetes"]},"spec": {"finalizers": []}
}

删除 finalizers 部分,然后保存文件。

应用修改后的文件

kubectl replace --raw "/api/v1/namespaces/submariner-operator/finalize" -f namespace.json

使用 kubectl删除命名空间

kubectl delete namespace submariner-operator --grace-period=0 --force

​ broker 集群删除集群注册信息

kubectl get clusters.submariner.io -n submariner-k8s-brokerkubectl delete clusters.submariner.io pve2 -n submariner-k8s-broker
重新部署 submariner

​ submariner 官网提到,当前使用 Calico 目前仅支持 VXLAN 封装技术,且,启用 globalnet 选项后,最好不使用默认的虚拟CIDR,自定义虚拟IP范围

image-20240918114907886

image-20240918201547082

subctl deploy-broker --globalnet --globalnet-cidr-range 100.0.0.0/8subctl  join broker-info.subm --clusterid pve2 --globalnet --globalnet-cidr 100.1.0.0/16 --cable-driver vxlan --health-check=falsesubctl  join broker-info.subm --clusterid pve3 --globalnet --globalnet-cidr 100.2.0.0/16 --cable-driver vxlan --health-check=false
配置 Calico IPPools

​ ippool是 Calico 资源,它定义了Calico可以使用的IP地址范围。例如,当IP池中的Pod需要到达IP池外的资源(例如Internet)时,通常使用源网络地址转换(SNAT)。由于我们不希望Calico在集群之间对流量进行NAT转换,因此我们将在每个集群中为其他集群的pod cidr 创建 ippool。当发送到集群集中的其他集群时,这将禁用SNAT,但仍然允许pod使用NAT与Internet通信。

​ 根据 submariner 部署的情况,对 Service CIDR,Pod CIDR,Global CIDR 建立 IPPools,这样可以解决 BGP 无法在虚拟网卡建立的问题。

apiVersion: projectcalico.org/v3
kind: IPPool
metadata:name: globalpve3cluster
spec:cidr: 100.2.0.0/16vxlanMode: Always   # 启用 VXLAN 封装  natOutgoing: falsedisabled: true
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:name: svcpve3cluster
spec:cidr: 10.96.0.0/12natOutgoing: falsedisabled: true
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:name: podpve3cluster
spec:cidr: 10.244.0.0/16natOutgoing: falsedisabled: true
calicoctl create -f podpve3cluster.yaml
calicoctl create -f svcpve3cluster.yaml
calicoctl create -f globalpve3cluster.yaml
calicoctl get ippool

image-20240918201618074

subctl diagnose all

image-20240918194505954

验证测试

image-20240918200739983

image-20240918200727452

image-20240918200617850

image-20240919161209147
`

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

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

相关文章

数字自然资源领域的实现路径

在数字化浪潮的推动下&#xff0c;自然资源的管理与利用正经历着前所未有的变革。本文将从测绘地理信息与遥感专业的角度&#xff0c;深度分析数字自然资源领域的实现路径。 1. 基础数据的数字化 数字自然资源的构建&#xff0c;首先需要实现基础数据的数字化。这包括地形地貌…

【南方科技大学】CS315 Computer Security 【Lab2 Buffer Overflow】

目录 引言软件要求启动虚拟机环境设置禁用地址空间布局随机化&#xff08;ASLR&#xff09;设置编译器标志以禁用安全功能 概述BOF.ctestShellCode.c解释 createBadfile.c 开始利用漏洞在堆栈上查找返回地址 实验2的作业 之前有写过一个 博客&#xff0c;大家可以先看看栈溢出…

为什么是华为最先做出三折叠?这些黑科技硬核门槛缺一不可

一款起售价19999的手机&#xff0c;预约人数竟达到了600万&#xff0c;全球首款三折叠手机Mate XT到底有什么魔力&#xff0c;可以做到还未上市就引爆市场&#xff1f;看完这篇文章&#xff0c;你就知道何谓“科技新物种”。 9月7日12:08&#xff0c;华为Mate XT非凡大师开启预…

智谱清影 -CogVideoX-2b-部署与使用,带你揭秘生成6s视频的极致体验!

文章目录 1 效果展示2 CogVideoX 前世今生3 CogVideoX 部署实践流程3.1 创建丹摩实例3.2 配置环境和依赖3.3 模型与配置文件3.4 运行4 遇到问题 1 效果展示 A street artist, clad in a worn-out denim jacket and a colorful bandana, stands before a vast concrete wall in …

.Net Gacutil工具(全局程序集缓存工具)使用教程

GAC介绍&#xff1a; GAC&#xff08;Global Assembly Cache&#xff09;全局程序集缓存&#xff0c;是用于存放.Net应用程序共享的程序集。 像平常我们在Visual Studio中引用系统程序集时&#xff0c;这些程序集便来自于GAC。 GAC默认位置为&#xff1a;%windir%\Microsoft…

react之jsx基础(1)概念和本质

文章目录 JSX 的基本概念1. **语法**2. **表达式**3. **属性**4. **子元素** JSX 的编译过程1. **转换成 JavaScript**2. **React 元素** JSX 的实际应用1. **组件定义**2. **组件嵌套** 总结 当然&#xff0c;以下是对 JSX 的详细讲解&#xff0c;包括其基本概念、语法、编译过…

Linux线程基础

&#x1f30e; Linux线程 文章目录&#xff1a; Linux线程 线程概念       线程的理解 再谈地址空间 线程控制       线程等待       线程资源共享       线程退出       线程异常       线程分离       理解线程tid 线程切换 线程…

gdb 前端:kdbg 安装使用

文章目录 1. 前言2. kdbg 安装使用2.1 安装 kdbg2.2 使用 kdbg 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. kdbg 安装使用 2.1 安装 kdbg kdbg 是 gdb 的图形化界面的前端&#xff0c;在 …

大数据时代:历史、发展与未来

文章目录 引言1980年&#xff1a;大数据的先声2006年&#xff1a;云计算与大数据的诞生2008年&#xff1a;大数据的科学探索2009年&#xff1a;大数据成为行业热词2011年&#xff1a;大数据的商业价值2013年&#xff1a;世界大数据元年结语 引言 在信息技术飞速发展的今天&…

VulnHub-Bilu_b0x靶机笔记

Bilu_b0x 靶机 概述 Vulnhub 的一个靶机&#xff0c;包含了 sql 注入&#xff0c;文件包含&#xff0c;代码审计&#xff0c;内核提权。整体也是比较简单的内容&#xff0c;和大家一起学习 Billu_b0x.zip 靶机地址&#xff1a; https://pan.baidu.com/s/1VWazR7tpm2xJZIGUS…

农产品交易平台的设计与实现

&#x1f33f;作品简介 : 该农产品交易平台为作者原创作品&#xff0c;成功获得优秀毕设。项目整体分为用户端(小程序)和后台管理系统(管理端)&#xff0c;二者均为前后端分离开发。 &#x1f340;项目技术栈 &#xff1a; 小程序框架、Vue、Vant、Element-UI、Axios、Java、…

【白话树】之 二叉树

快速导航 一、二叉树的基本概念1、 二叉树定义2、常见术语3、基本操作1&#xff09;创建&#xff1a;2&#xff09;插入与删除&#xff1a; 4、常见类型1&#xff09;满二叉树&#xff08;完美二叉树&#xff09;2&#xff09;完全二叉树3&#xff09;完满二叉树4&#xff09;平…

支付宝开发者✖️「蚂小财」——AgentUniverse专业多智能体框架在严谨产业中的应用实践

正在直播&#xff1a;点击进入直播间互动拿蚂蚁保温杯 &#xfeff;直播&#xfeff; &#xfeff;

【Android Studio】使用雷电模拟器调试

文章目录 进入开发者模式使雷电模拟器adb连接PC 进入开发者模式 多次点击版本号 -开区USB调试 使雷电模拟器adb连接PC 写cmd脚本 雷电模拟器端口为5555 &#xff0c;脚本内容如下&#xff1a; adb.exe connect 127.0.0.1:5555默认使用powershell的建议为&#xff1a; .\a…

uniapp中使用picker-view选择时间

picker-view 是 UniApp 中用于展示和选择数据的组件。它适用于创建多列选择器&#xff0c;类似于 iOS 和 Android 系统中的选择器视图。以下是 picker-view 的详细介绍&#xff0c;包括用法、属性和事件。 一 用法 <template><view><picker-view :value"…

HarmonyOS使用LocationButton获取地理位置

LocationButton LocationKit getAddressesFromLocation方法 步骤&#xff1a; 整合 LocationButton并获取经纬度通过 LocationKit 将经纬度转为地址信息将地址信息渲染到页面上处理异常情况&#xff08;闪退&#xff09; LocationButton({ icon: LocationIconStyle.LINE…

Java lambda表达式的变量捕获

有人看到这个lambda表达式能够访问isQuit这个变量而且还是可以被修改的变量&#xff0c;就发出疑问了&#xff0c;之前不是说lambda不能不或变量吗&#xff1f; 1.规则 java的lambda表达式变量捕获规则只是针对于外部作用域的局部变量来说的&#xff01;&#xff01;&#xf…

LVGL 控件之仪表盘(lv_meter)

目录 一、概述二、仪表盘部件1、添加刻度2、添加指针3、设置仪表的角度和仪表的范围4、装饰4.1 仪表指针图片4.2 仪表的指示刻度4.3 仪表弧线指示器 5、API 函数 一、概述 仪表盘部件可以非常灵活地展示数据&#xff0c;其功能包括显示弧形&#xff08;arcs&#xff09;、指针…

linux_L1_linux重启服务器

使用putty登录到linux服务器切换到管理员账号 sudo -s重启命令 reboot

22 C 语言字符处理:分类判断与转换(ASCII 码、字母大小写)函数详解

目录 1 isdigit() 1.1 函数原型 1.2 功能说明 1.3 代码示例 2 isxdigit() 2.1 函数原型 2.2 功能说明 2.3 代码示例 3 islower() 3.1 函数原型 3.2 功能说明 3.3 代码示例 4 isupper() 4.1 函数原型 4.2 功能说明 4.3 代码示例 5 isalnum() 5.1 函数原型 5.…