在线云原生边缘计算KubeEdge安装配置(二)

这篇具有很好参考价值的文章主要介绍了在线云原生边缘计算KubeEdge安装配置(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. K8S集群部署,可以参考如下博客

请安装k8s集群,centos安装k8s集群
请安装k8s集群,ubuntu安装k8s集群

请安装kubeedge cloudcore centos安装K8S

2.安装kubEedge

2.1 编辑kube-proxy使用ipvs代理

kubectl edit configmaps kube-proxy -n kube-system #修改kube-proxy
#大约在40多行
     37     ipvs:
     38       excludeCIDRs: null
     39       minSyncPeriod: 0s
     40       scheduler: ""
     41       strictARP: true  #这里由原来的false修改为true
     42       syncPeriod: 0s
     43       tcpFinTimeout: 0s
     44       tcpTimeout: 0s
     45       udpTimeout: 0s
     46     kind: KubeProxyConfiguration
     47     metricsBindAddress: ""
     48     mode: "ipvs"  #这里原来是空的修改为ipvs
     49     nodePortAddresses: null
     50     oomScoreAdj: null
     51     portRange: ""
     52     showHiddenMetricsForVersion: ""
     53     winkernel:
     54       enableDSR: false
     55       forwardHealthCheckVip: false
     56       networkName: ""
     57       rootHnsEndpointName: ""
     58       sourceVip: ""

kubectl rollout restart daemonset kube-proxy -n kube-system
kubectl get pods -n kube-system

2.2 基础服务提供,负载均衡器metallb

#无网络情况下,先上传kubeedge.tar 和 metallb-native.yaml文件
docker load -i kubeedge.tar  #导入镜像

#有网络可以直接拉去镜像
docker pull quay.io/metallb/controller:v0.13.5
docker pull quay.io/metallb/speaker:v0.13.5
wget https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
kubectl apply -f metallb-native.yaml
kubectl get pods -n metallb-system
[root@k8s-master01 ~]# kubectl get pods -n metallb-system
NAME                         READY   STATUS    RESTARTS   AGE
controller-8d9cf599f-m4x27   1/1     Running   0          23s
speaker-zm7w4                1/1     Running   0          23s
speaker-zww5l                1/1     Running   0          23s
[root@k8s-master01 ~]# 

#具体参考官网地址:https://metallb.universe.tf/configuration/#layer-2-configuration

#创建IP地址资源池,原则是跟主机在同一个网段,没有使用的地址,根据自己项目的规模我合理预留了21个IP
cat > first-ippool.yaml << EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.186.200-192.168.186.220
EOF
kubectl apply -f first-ippool.yaml
kubectl get ipaddresspools -n metallb-system
[root@k8s-master01 ~]# kubectl get ipaddresspools -n metallb-system
NAME         AGE
first-pool   2m1s
[root@k8s-master01 ~]# 
#开启二层转发,实现k8s集群节点外访问
cat > l2forward.yaml << EOF
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
EOF
kubectl apply -f l2forward.yaml
kubectl get l2advertisements -n metallb-system
#二层转发案例测试
cat > nginx.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
EOF

kubectl apply -f nginx.yaml
[root@k8s-master01 ~]# kubectl get pods,svc #svc的ip从地址池中分配的,如果是云服务器则是公网IP,公网必须带端口访问
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-5f5c64f949-bhpvf   1/1     Running   0          50s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)        AGE
service/kubernetes   ClusterIP      10.96.0.1      <none>            443/TCP        5h43m
service/nginx-svc    LoadBalancer   10.99.41.146   192.168.186.200   80:30293/TCP   50s
[root@k8s-master01 ~]# 

在线云原生边缘计算KubeEdge安装配置(二),kubernetes,docker容器相关,云原生,边缘计算,人工智能

测试通过

kubectl delete -f nginx.yaml  #删除无用的pod和svc
yum install iptables-services -y #安装iptables后期有用
systemctl start  iptables.service
systemctl enable  iptables.service
systemctl status  iptables.service

3. 对于kubeEdge概述

KubeEdge由云和边缘组成。它建立在Kubernetes之上,为联网应用部署和云与边缘之间的元数据同步提供核心基础设施支持。所以如果我们想要设置KubeEdge,我们需要设置Kubernetes集群(可以使用现有的集群),云端和边缘端在cloud side, 我们需要安装

Docker
Kubernetes cluster
cloudcore

在 edge side, 我们需要安装

Docker
MQTT (配置可以选用,不是一定需要)
edgecore

在线云原生边缘计算KubeEdge安装配置(二),kubernetes,docker容器相关,云原生,边缘计算,人工智能文章来源地址https://www.toymoban.com/news/detail-728070.html

3.部署kubeedge cloudcore(主节点)

3.1 获取keadm工具

wget https://github.com/kubeedge/kubeedge/releases/download/v1.10.1/keadm-v1.12.1-linux-amd64.tar.gz

tar -zxvf keadm-v1.12.1-linux-amd64.tar.gz
cp keadm-v1.12.1-linux-amd64/keadm/keadm  /usr/local/bin/
keadm version

3.2 部署cloudcore

#在master上部署
#设置云端  使用keadm初始化,安装cloudcore
docker pull kubeedge/cloudcore:v1.14.2  
docker pull  kubeedge/iptables-manager:v1.14.2

keadm init --advertise-address=192.168.186.200 --set iptablesManager.mode="external" --profile version=v1.12.1 #这里的IP是负载均衡器metallb分配的IP,如果是云服务器则用公网

#以上参数分别为master节点地址和要安装的KubeEdge版本。

#keadm reset  #安装错误可以重置
keadm gettoken  #获取token
[root@k8s-ke-cloud docker]# kubectl get deployment -n kubeedge #上述多此执行后依然不行
NAME        READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES                       SELECTOR
cloudcore   0/1     1            0           7m2s   cloudcore    kubeedge/cloudcore:v1.12.1   k8s-app=kubeedge,kubeedge=cloudcore
[root@k8s-ke-cloud docker]# kubectl delete  deployment -n kubeedge  #删除这个deployment
error: resource(s) were provided, but no name was specified
[root@k8s-ke-cloud docker]# kubectl delete  deployment  cloudcore -n kubeedge 
deployment.apps "cloudcore" deleted
[root@k8s-ke-cloud docker]# 

[root@k8s-master01 ~]# keadm init --advertise-address=192.168.186.200 --set iptablesManager.mode="external" --profile version=v1.12.1
Kubernetes version verification passed, KubeEdge installation will start...
CLOUDCORE started
=========CHART DETAILS=======
NAME: cloudcore
LAST DEPLOYED: Mon Oct  9 15:25:36 2023
NAMESPACE: kubeedge
STATUS: deployed
REVISION: 1
[root@k8s-master ~]# keadm gettoken
7da3a4434a154f267a7ba42727a0f038bbca5ae0d8c7adc739bc32591574b818.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTY5OTAxNjd9.htL9plVcKIgVdGuRdb4cp2gviQVol_Jiwa_RNE3ieVI[root@k8s-master ~]# 

kubectl get pods -n kubeedge
kubectl get svc -n kubeedge
kubectl get deployment -n kubeedge
[root@k8s-master ~]#kubectl get pods  -n kubeedge
NAME                           READY   STATUS             RESTARTS      AGE
cloud-iptables-manager-rpxm8   1/1     Running            0             7m37s
cloudcore-5876c76687-ff9zv     1/1     Running            0     7m37s
[root@k8s-master ~]# kubectl get svc   -n kubeedge
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                             AGE
cloudcore   ClusterIP   10.109.201.171   <none>        10000/TCP,10001/TCP,10002/TCP,10003/TCP,10004/TCP   7m40s
[root@k8s-master ~]# kubectl get deployment    -n kubeedge
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
cloudcore   1/1     1            0           7m43s
[root@ecs-2ef1-0001 kubeedge]# 


[root@cloudcorer ~]# kubectl get ns
NAME                   STATUS   AGE
default                Active   58d
kube-node-lease        Active   58d
kube-public            Active   58d
kube-system            Active   58d
kubeedge               Active   8m44s  #在这个空间中中
kubernetes-dashboard   Active   58d
metallb-system         Active   57d
[root@cloudcorer ~]# kubectl get pods,svc -n kubeedge
NAME                               READY   STATUS    RESTARTS   AGE
pod/cloud-iptables-manager-8kh6q   1/1     Running   0          109m
pod/cloudcore-5876c76687-tkkzx     1/1     Running   0          109m

NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                             AGE
service/cloudcore   ClusterIP   10.101.140.171   <none>        10000/TCP,10001/TCP,10002/TCP,10003/TCP,10004/TCP   109m
[root@cloudcorer ~]# 
kubectl edit svc cloudcore -n kubeedge #修改大概在51行 
     49   selector:
     50     k8s-app: kubeedge
     51     kubeedge: cloudcore
     52   sessionAffinity: None
     53   type: LoadBalancer  #修改后的
     54 status:
     55   loadBalancer: {}

[root@k8s-master ~]# kubectl get pods,svc -n kubeedge
NAME                               READY   STATUS    RESTARTS   AGE
pod/cloud-iptables-manager-8kh6q   1/1     Running   0          110m
pod/cloudcore-5876c76687-tkkzx     1/1     Running   0          110m

NAME                TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                           AGE
service/cloudcore   LoadBalancer   10.101.140.171   192.168.186.200   10000:31953/TCP,10001:32329/TCP,10002:31154/TCP,10003:30807/TCP,10004:31038/TCP   110m
[root@k8s-master ~]# 
kubectl apply -f metrics-server.yaml  #安装metrics-server
[root@k8s-master kubernetes]# kubectl get pods -n kube-system -o wide #metrics-server不正常
NAME                                       READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE   READINESS GATES
calico-kube-controllers-67bb5696f5-sfhs6   1/1     Running   0          4h3m    10.244.235.195    k8s-master   <none>           <none>
calico-node-2w8jn                          1/1     Running   0          4h3m    192.168.186.128   k8s-master   <none>           <none>
calico-node-vt8g4                          1/1     Running   0          4h3m    192.168.186.129   k8s-node1    <none>           <none>
coredns-7f6cbbb7b8-q8z29                   1/1     Running   0          4h5m    10.244.235.193    k8s-master   <none>           <none>
coredns-7f6cbbb7b8-qc8d2                   1/1     Running   0          4h5m    10.244.235.194    k8s-master   <none>           <none>
etcd-k8s-master                            1/1     Running   0          4h5m    192.168.186.128   k8s-master   <none>           <none>
kube-apiserver-k8s-master                  1/1     Running   0          4h5m    192.168.186.128   k8s-master   <none>           <none>
kube-controller-manager-k8s-master         1/1     Running   0          4h5m    192.168.186.128   k8s-master   <none>           <none>
kube-proxy-2vt4s                           1/1     Running   0          3h52m   192.168.186.129   k8s-node1    <none>           <none>
kube-proxy-99x2t                           1/1     Running   0          3h52m   192.168.186.128   k8s-master   <none>           <none>
kube-scheduler-k8s-master                  1/1     Running   0          4h5m    192.168.186.128   k8s-master   <none>           <none>
metrics-server-5f85c44dcd-kpnpk            1/1     Running   0          4m4s    10.244.36.85      k8s-node1    <none>           <none>    #如果状态和READY不正确,就执行如下的语句
[root@k8s-master kubernetes]# 
kubectl patch deploy metrics-server -n kube-system --type='json' -p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'  #metrics-server容器不正常情况下,才修改为不认证,正常就不要执行这句
#修改 kube-proxy 和 kube-flannel 的节点亲和性,不调度到边缘节点
kubectl patch daemonset kube-proxy -n kube-system -p '{"spec": {"template": {"spec": {"affinity": {"nodeAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": {"nodeSelectorTerms": [{"matchExpressions": [{"key": "node-role.kubernetes.io/edge", "operator": "DoesNotExist"}]}]}}}}}}}'

kubectl patch daemonset kube-flannel-ds -n kube-flannel -p '{"spec": {"template": {"spec": {"affinity": {"nodeAffinity": {"requiredDuringSchedulingIgnoredDuringExecution": {"nodeSelectorTerms": [{"matchExpressions": [{"key": "node-role.kubernetes.io/edge", "operator": "DoesNotExist"}]}]}}}}}}}'

kubectl get daemonset -n kube-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n kube-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'

kubectl get daemonset -n metallb-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n metallb-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'

kubectl get daemonset -n calico-system | grep -v NAME | awk '{print $1}' | xargs -n 1 kubectl patch daemonset -n calico-system --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/affinity", "value":{"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/edge","operator":"DoesNotExist"}]}]}}}}]'

至此cloudcore部署完毕

以下是边缘节点的部署方式

4. 部署edgecore(边缘节点)

[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE     VERSION
k8s-master   Ready    control-plane,master   4h12m   v1.22.6
k8s-node1    Ready    <none>                 4h9m    v1.22.6
[root@k8s-master ~]# 

4.1 获取keadm工具

#注意边缘节点配置都很低,只需要运行业务容器
#边缘节点只需要安装docker就可以了
hostnamectl set-hostname edge-node1  && bash

wget https://github.com/kubeedge/kubeedge/releases/download/v1.10.1/keadm-v1.12.1-linux-amd64.tar.gz

tar -zxvf keadm-v1.12.1-linux-amd64.tar.gz
cp keadm-v1.12.1-linux-amd64/keadm/keadm  /usr/local/bin/
keadm version
#提前拉去镜像
docker pull kubeedge/installation-package:v1.12.1
docker pull kubeedge/pause:3.1
docker pull eclipse-mosquitto:1.6.15
# 在云节点获取 token
keadm gettoken

# 使用 token 将边缘节点加入集群
keadm join --cloudcore-ipport=192.168.186.200:10000 --token=23bacb0d0fee0b137f821d7f6b100039dee72b198aef159ad7aca5c63f2ad778.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTcwNDA5ODF9.siZ4CuljbcNtCmOwgOGS9ZGc8FNIejKQh3q0feiRCI4 --kubeedge-version=v1.12.1 --cgroupdriver systemd

#如果添加失败了,请在edgecoe中执行
#docker rm -f mqtt   && rm -fr /etc/kubeedge/
#keadm join --token=$TOKEN --cloudcore-ipport=$SERVER --kubeedge-version=1.12.1
[root@edge-node1 ~]# keadm join --cloudcore-ipport=192.168.186.200:10000 --token=23bacb0d0fee0b137f821d7f6b100039dee72b198aef159ad7aca5c63f2ad778.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTcwNDA5ODF9.siZ4CuljbcNtCmOwgOGS9ZGc8FNIejKQh3q0feiRCI4 --kubeedge-version=v1.12.1 --cgroupdriver systemd
I0526 22:43:35.338932   19494 command.go:845] 1. Check KubeEdge edgecore process status
I0526 22:43:35.508735   19494 command.go:845] 2. Check if the management directory is clean
I0526 22:43:35.509314   19494 join.go:100] 3. Create the necessary directories
I0526 22:43:35.516006   19494 join.go:176] 4. Pull Images
Pulling kubeedge/installation-package:v1.12.1 ...
Pulling eclipse-mosquitto:1.6.15 ...
Pulling kubeedge/pause:3.1 ...
I0526 22:43:35.521861   19494 join.go:176] 5. Copy resources from the image to the management directory
I0526 22:43:36.445496   19494 join.go:176] 6. Start the default mqtt service
I0526 22:43:37.119023   19494 join.go:100] 7. Generate systemd service file
I0526 22:43:37.120245   19494 join.go:100] 8. Generate EdgeCore default configuration
I0526 22:43:37.120309   19494 join.go:230] The configuration does not exist or the parsing fails, and the default configuration is generated
W0526 22:43:37.232157   19494 validation.go:71] NodeIP is empty , use default ip which can connect to cloud.
I0526 22:43:37.243148   19494 join.go:100] 9. Run EdgeCore daemon
I0526 22:43:37.824194   19494 join.go:317] 
I0526 22:43:37.824216   19494 join.go:318] KubeEdge edgecore is running, For logs visit: journalctl -u edgecore.service -xe
[root@edge-node1 ~]# 
journalctl -u edgecore -n 50   #edge端查看日志
iptables -t nat -A OUTPUT -p tcp --dport 10350 -j DNAT --to 114.115.220.147:10003 #这个IP114.115.220.147是cloudcorer的

到了这里,关于在线云原生边缘计算KubeEdge安装配置(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • kubernetes+KubeEdge云边环境的安装与部署

    最近在学习云边协同,需要搭建一个云边协同的实验环境,kubernetes+KubeEdge+sedna,安装过程中遇到了一系列的问题,特此记录总结。 云端:Centos7+ kubernetes 1.23.8 + Docker 这里我们的centos使用的是 centos7.9, 不同版本的系统对k8s影响较大,具体看实际情况而定。 有的还需要更新系统

    2024年02月09日
    浏览(36)
  • 超详细的kubeedge与kubernetes(k8s)环境配置教程

    注意: 对于kubeedge和k8s的监控可以参考这一篇——通过prometheus和grafana来监管数据; 对于虚拟机环境的搭建可以参考这一篇。 对于搭建所需文件:阿里云盘 本文最后由错误归纳。 文章每周更新,如果喜欢的话可以三联!!! 云端只部署一个master节点,边缘端部署一个edgen

    2024年02月04日
    浏览(43)
  • 删除kubeedge边缘节点和k8s节点_卸载kubeedge

    删除kubeedge边缘节点和k8s节点_卸载kubeedge Linux安装kubeedge_亲测成功 kubeedge边缘节点安装 删除kubeedge边缘节点 卸载kubeedge 卸载k8s节点

    2024年02月12日
    浏览(57)
  • 在 Kubernetes 中部署并使用 KubeEdge

    作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及 Kubernetes、KubeSphere、KubeKey 等。 边缘计算在广泛制造业、工业、零售和金融等行业,随着云原生应用的兴起,不可变基础设施和快速的应用交付等特性很适用于边缘计算场景。因

    2024年02月02日
    浏览(40)
  • 拥抱云原生,下一代边缘计算云基础设施

      //   编者按:面对海量数据新的应用形态对低时延和分布式架构的需求,边缘计算将成为新一代边缘计算云基础设施,火山引擎覆盖了全国海量边缘节点,储备了上百T带宽,承载了视频直播、游戏娱乐、智慧交通、影视特效等多场景客户服务, LiveVideoStackCon 2023上海站邀请

    2024年02月09日
    浏览(51)
  • 云原生|kubernetes|centos7下的kubeadm部署的集群内在线部署kubesphere(外部etcd)

    本文将主要就在centos7操作系统下已有的一个利用kubeadm部署的集群内在线安装kubesphere做一个介绍,该kubernetes集群是使用的etcd外部集群。 kubernetes集群的搭建本文不做过多介绍,具体的搭建流程见我的博客: 云原生|kubernetes|kubeadm部署高可用集群(一)使用外部etcd集群_kubeadm

    2024年02月11日
    浏览(44)
  • 【云计算•云原生】4.云原生之什么是Kubernetes

    K8S就是Kubernetes,Kubernetes首字母为K,末尾为s,中间一共有8个字母,所以简称K8s。 它是一个为容器化应用提供集群部署和管理的开源工具,由 Google 开发。通过k8s可以使用配置文件轻松管理上千台机器。 k8s的部署配置文件和docker的dockerfile很类似,其内容描述了整个部署过程。

    2024年02月05日
    浏览(43)
  • 【云原生|Kubernetes】02-Kubeadm安装部署Kubernetes集群

    前面简单介绍了Kubernetes的相关架构及其组件,这一章节我们将介绍如何快速搭建Kubernetes的集群,这里我们将使用官方支持的用于部署 Kubernetes 的工具— kubeadm。 主机名 ip地址 节点类型 系统版本 master.example.com 192.168.194.128 master,etcd centos7.x node1.example.com 192.168.194.130 node1 cent

    2024年02月03日
    浏览(45)
  • 云原生之深入解析如何正确计算Kubernetes容器CPU使用率

    使用 Prometheus 配置 kubernetes 环境中 Container 的 CPU 使用率时,会经常遇到 CPU 使用超出 100%,现在来分析一下: container_spec_cpu_period:当对容器进行 CPU 限制时,CFS 调度的时间窗口,又称容器 CPU 的时钟周期通常是 100000 微秒 container_spec_cpu_quota:是指容器的使用 CPU 时间周期总量

    2024年02月10日
    浏览(70)
  • 云原生Kubernetes:K8S配置资源管理

    目录 一、理论 1.Secret 2.Secret创建 3.Secret使用 4.Configmap 5.Configmap创建 6.Configmap使用 二、实验 1.Secret创建 2.Secret使用 3.Configmap创建 4.Configmap使用 三、问题 1.变量引用生成资源报错 2.查看pod日志失败 3.创建configmap报错 4.YAML创建configmap报错 5. 生成资源报错 6.文件挂载pod报错Error 四

    2024年02月07日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包