KubeEdge 边缘计算应用部署

文章目录

    • 一、概述
      • 1.Kubernetes 对 Pod 调度规则
        • 1.1.自动调度
        • 1.2.定向调度
        • 1.3.亲和性调度
        • 1.4.污点和容忍
      • 2.KubeEdge 应用部署
        • 2.1.KubeEdge应用部署方式
        • 2.2.标签操作
    • 二、KubeEdge应用部署
      • 1.Node添加标签
      • 2.DaemonSet部署
        • 2.1.部署到所有节点
        • 2.2.部署到边缘节点
      • 3.Deployment部署
        • 3.1.nodeName
        • 3.2.nodeSelector
        • 3.3.podAntiAffinity

  • KubeEdge
# KubeEdge

https://iothub.org.cn/docs/kubeedge/
https://iothub.org.cn/docs/kubeedge/app/kube-app/

一、概述

在这里插入图片描述

1.Kubernetes 对 Pod 调度规则

Kubernetes 四种调度方式:

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
  • 定向调度:NodeName、NodeSelector
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度:Taints、Toleration
1.1.自动调度

在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。

1.2.定向调度

利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已。

  • nodeName

NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  nodeName: node1 # 指定调度到node1节点上
  • nodeSelector

NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。示例:

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  nodeSelector: 
    nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上
1.3.亲和性调度

它在NodeSelector的基础之上的进行了扩展,可以通过配置的形式,实现优先选择满足条件的Node进行调度,如果没有,也可以调度到不满足条件的节点上,使调度更加灵活。

Affinity主要分为三类:

  • nodeAffinity(node亲和性):以Node为目标,解决Pod可以调度到那些Node的问题
  • podAffinity(pod亲和性):以Pod为目标,解决Pod可以和那些已存在的Pod部署在同一个拓扑域中的问题
  • podAntiAffinity(pod反亲和性):以Pod为目标,解决Pod不能和那些已经存在的Pod部署在同一拓扑域中的问题

关于亲和性和反亲和性的使用场景的说明:

  • 亲和性:如果两个应用频繁交互,那么就有必要利用亲和性让两个应用尽可能的靠近,这样可以较少因网络通信而带来的性能损耗
  • 反亲和性:当应用采用多副本部署的时候,那么就有必要利用反亲和性让各个应用实例打散分布在各个Node上,这样可以提高服务的高可用性
1.4.污点和容忍

在 Kubernetes 中,节点亲和性 NodeAffinity 是 Pod 上定义的一种属性,能够使 Pod 按我们的要求调度到某个节点上,而 Taints(污点) 则恰恰相反,它是 Node 上的一个属性,可以让 Pod 不能调度到带污点的节点上,甚至会对带污点节点上已有的 Pod 进行驱逐。

当然,对应的 Kubernetes 可以给 Pod 设置 Tolerations(容忍) 属性来让 Pod 能够容忍节点上设置的污点,这样在调度时就会忽略节点上设置的污点,将 Pod 调度到该节点。一般时候 Taints 通常与 Tolerations 配合使用。

  • 一个 node 可以有多个污点;
  • 一个 pod 可以有多个容忍;
  • kubernetes 执行多个污点和容忍方法类似于过滤器

如果一个 node 有多个污点,且 pod 上也有多个容忍,只要 pod 中容忍能包含 node 上设置的全部污点,就可以将 pod 调度到该 node 上。如果 pod 上设置的容忍不能够包含 node 上设置的全部污点,且 node 上剩下不能被包含的污点 effect 为 PreferNoSchedule,那么也可能会被调度到该节点。

注意:

当 pod 存在容忍,首先 pod 会选择没有污点的节点,然后再次选择容忍污点的节点。

  • 如果 node 上带有污点 effect 为 NoSchedule,而 pod 上不带响应的容忍,kubernetes 就不会调度 pod 到这台 node 上。
  • 如果 Node 上带有污点 effect 为 PreferNoShedule,这时候 Kubernetes 会努力不要调度这个 Pod 到这个 Node 上。
  • 如果 Node 上带有污点 effect 为 NoExecute,这个已经在 Node 上运行的 Pod 会从 Node 上驱逐掉。没有运行在 Node 的 Pod 不能被调度到这个 Node 上。一般使用与当某个节点处于 NotReady 状态下,pod 迅速在其他正常节点启动。

2.KubeEdge 应用部署

2.1.KubeEdge应用部署方式

KubeEdge应用部署方式:

  • 使用 deployment 和 daemonset 控制器
  • Pod调度首先选择定向调度 nodeName 或 nodeSelector
  • 根据需要选择亲和性调度、污点和容忍
2.2.标签操作

1.Node添加label

# 查看所有node 标签
# kubectl get nodes --show-labels

#添加标签
# kubectl label nodes node01 disktype=ssdnode

# 删除标签
# kubectl label nodes uat-k8s-node1 disktype-

# 修改标签
# kubectl label nodes node01 disktype=ssdnode --overwrite

二、KubeEdge应用部署

1.Node添加标签

# 查看所有node 标签
# kubectl get nodes --show-labels

#添加标签
# kubectl label nodes node01 disktype=ssdnode

# 删除标签
# kubectl label nodes uat-k8s-node1 disktype-

# 修改标签
# kubectl label nodes node01 disktype=ssdnode --overwrite
[root@k8s-master kubeedge]# kubectl get nodes
NAME         STATUS   ROLES                  AGE    VERSION
edge-1       Ready    agent,edge             2d9h   v1.23.17-kubeedge-v1.13.4
edge-2       Ready    agent,edge             2d9h   v1.23.17-kubeedge-v1.13.4
k8s-master   Ready    control-plane,master   9d     v1.23.12
k8s-node1    Ready    <none>                 9d     v1.23.12


#添加标签
# kubectl label nodes k8s-node1 node-type=node
# kubectl label nodes edge-1 node-type=edge
# kubectl label nodes edge-1 node-type=edge


[root@k8s-master kubeedge]# kubectl label nodes k8s-node1 node-type=node
node/k8s-node1 labeled

[root@k8s-master kubeedge]# kubectl get nodes k8s-node1 --show-labels
NAME        STATUS   ROLES    AGE   VERSION    LABELS
k8s-node1   Ready    <none>   9d    v1.23.12   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,node-type=node


[root@k8s-master kubeedge]# kubectl describe node k8s-node1
Name:               k8s-node1
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=k8s-node1
                    kubernetes.io/os=linux
                    
                    node-type=node
                    
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    projectcalico.org/IPv4Address: 192.168.202.202/24
                    projectcalico.org/IPv4IPIPTunnelAddr: 10.244.36.64
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Fri, 15 Dec 2023 14:43:20 +0800
Taints:             <none>
Unschedulable:      false
#添加标签
[root@k8s-master kubeedge]# kubectl label nodes k8s-node1 node-type=node
node/k8s-node1 labeled

[root@k8s-master kubeedge]# kubectl label nodes edge-1 node-type=edge
node/edge-1 labeled

[root@k8s-master kubeedge]# kubectl label nodes edge-2 node-type=edge
node/edge-2 labeled

在这里插入图片描述

2.DaemonSet部署

2.1.部署到所有节点
[root@k8s-master kubeedge]# vim nginx-set-all.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-set-all
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true   # 使用主机网络
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
[root@k8s-master kubeedge]# kubectl apply -f nginx-set-all.yaml 
deployment.apps/nginx-set-all created


[root@k8s-master kubeedge]# kubectl get pod -owide
NAME                  READY   STATUS    RESTARTS   AGE   IP                NODE        NOMINATED NODE   READINESS GATES
nginx-set-all-79gkd   1/1     Running   0          76s   192.168.202.212   edge-2      <none>           <none>
nginx-set-all-7mprj   1/1     Running   0          76s   192.168.202.211   edge-1      <none>           <none>
nginx-set-all-nn9z4   1/1     Running   0          76s   192.168.202.202   k8s-node1   <none>           <none>

在这里插入图片描述

# curl 192.168.202.212
# curl 192.168.202.211
# curl 192.168.202.202


[root@k8s-master kubeedge]# curl 192.168.202.212
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
2.2.部署到边缘节点
[root@k8s-master kubeedge]# vim nginx-set-edge.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-set-all
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true   # 使用主机网络
      nodeSelector:
        node-type: edge
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
[root@k8s-master kubeedge]# kubectl apply -f nginx-set-edge.yaml 
daemonset.apps/nginx-set-all created


[root@k8s-master kubeedge]# kubectl get pod -owide
NAME                  READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
nginx-set-all-gkn6j   1/1     Running   0          30s   192.168.202.212   edge-2   <none>           <none>
nginx-set-all-zb4vv   1/1     Running   0          30s   192.168.202.211   edge-1   <none>           <none>

在这里插入图片描述

3.Deployment部署

3.1.nodeName
[root@k8s-master kubeedge]# vim nginx-nodename.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-nodename
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeName: edge-1    #调度到指定机器
      hostNetwork: true   # 使用主机网络
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
[root@k8s-master kubeedge]# kubectl apply -f nginx-nodename.yaml 
deployment.apps/nginx-nodename created


[root@k8s-master kubeedge]# kubectl get pod -owide
NAME                              READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
nginx-nodename-846f55748c-fpgpv   1/1     Running   0          27s   192.168.202.211   edge-1   <none>           <none>

在这里插入图片描述

3.2.nodeSelector

根据Node label调度Pod

      #选择标签
      nodeSelector:
        #key1: val1
        #key2: val2
        node-type: node

1.部署到Node节点

[root@k8s-master kubeedge]# vim nginx-node.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-node
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        node-type: node
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
[root@k8s-master kubeedge]# kubectl apply -f nginx-node.yaml 
deployment.apps/nginx-deployment-node created


[root@k8s-master kubeedge]# kubectl get pod -owide
NAME                                     READY   STATUS    RESTARTS   AGE    IP             NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-node-7457b6d59f-7j4fh   1/1     Running   0          3m9s   10.244.36.69   k8s-node1   <none>           <none>
nginx-deployment-node-7457b6d59f-jk9m4   1/1     Running   0          3m9s   10.244.36.70   k8s-node1   <none>           <none>
nginx-deployment-node-7457b6d59f-mj7gx   1/1     Running   0          3m9s   10.244.36.71   k8s-node1   <none>           <none>

在这里插入图片描述

2.部署到Edge节点

[root@k8s-master kubeedge]# vim nginx-edge.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-edge
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        node-type: edge
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
[root@k8s-master kubeedge]# kubectl apply -f nginx-edge.yaml 
deployment.apps/nginx-deployment-edge created


[root@k8s-master kubeedge]# kubectl get pod -owide
NAME                                     READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
nginx-deployment-edge-7b8d874698-2g4h5   1/1     Running   0          50s     172.17.0.3     edge-2      <none>           <none>
nginx-deployment-edge-7b8d874698-2xhpn   1/1     Running   0          50s     172.17.0.3     edge-1      <none>           <none>
nginx-deployment-edge-7b8d874698-w6kkb   1/1     Running   0          50s     172.17.0.4     edge-1      <none>           <none>

在这里插入图片描述

3.3.podAntiAffinity

edge节点部署应用

[root@k8s-master kubeedge]# vim nginx-edge-pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-edge-pod
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true   # 使用主机网络
      nodeSelector:
        node-type: edge
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
      affinity:  #亲和性设置
        podAntiAffinity: #设置pod亲和性
          requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
          - labelSelector:
              matchExpressions: # 匹配app的值在["nginx"]中的标签
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: kubernetes.io/hostname
[root@k8s-master kubeedge]# kubectl apply -f nginx-edge-pod.yaml 
deployment.apps/nginx-edge-pod created


[root@k8s-master kubeedge]# kubectl get pod -owide
NAME                              READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
nginx-edge-pod-5487c6ff5f-6jjwg   1/1     Running   0          57s   192.168.202.212   edge-2   <none>           <none>
nginx-edge-pod-5487c6ff5f-qftsx   1/1     Running   0          57s   192.168.202.211   edge-1   <none>           <none>

在这里插入图片描述

# curl 192.168.202.211


[root@k8s-master kubeedge]# curl 192.168.202.211
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • KubeEdge
# KubeEdge

https://iothub.org.cn/docs/kubeedge/
https://iothub.org.cn/docs/kubeedge/app/kube-app/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

登录认证-Filter(黑马学习笔记)

分析 我们需要使用过滤器Filter来完成案例我们需要使用过滤器Filter来完成案例 我们先来回顾下前面分析过的登录校验的基本流程&#xff1a; ● 要进入到后台管理系统&#xff0c;我们必须先完成登录操作&#xff0c;此时就需要访问登录接口login。 —————————————…

leetcode:860.柠檬水找零

题意&#xff1a;按照支付顺序&#xff0c;进行支付&#xff0c;能够正确找零。 解题思路&#xff1a;贪心策略&#xff1a;针对支付20的客人&#xff0c;优先选择消耗10而不是消耗5&#xff0c;因为5可以用来找零10或20. 代码实现&#xff1a;有三种情况&#xff08;代表三种…

CSS技巧:实现两个div在同一行显示的方法

css如何让两个div在同一行显示 - web开发 - 亿速云 在Web开发中&#xff0c;经常遇到需要将多个元素水平排列在同一行的情况。其中一个常见的需求是将两个div元素放置在同一行上&#xff0c;使它们并排显示。在本文中&#xff0c;我们将介绍几种实现这一效果的CSS方法。 1. 使…

MySQL:索引有哪些(清晰明了)

一提到索引&#xff0c;可能就会想到B树索引、Hash索引、聚簇索引、主键索引、唯一索引、联合索引等等&#xff0c;但这些名词并不能混为一谈&#xff0c;他们有重复的部分&#xff0c;是从不同方面给索引取的名字。 从数据结构上来讲&#xff1a;B树索引、Hash索引、Full-text…

2024高校建设大数据实验室的用途有哪些?

随着当前现代计算机信息技术的快速进步发展,传统的各类高校重点实验室项目建设管理模式已经难以与当前现代信息技术快速发展相相互适应,高校应用大数据重点实验室项目建设模式是高校加快培养一批创新型高校大数据专业人才的重要技术基础。与此同时,高校应用大数据重点实验室项目…

手撕LRU缓存——LinkedHashMap简易源码

题目链接&#xff1a;https://leetcode.cn/problems/lru-cache/description/?envTypestudy-plan-v2&envIdtop-100-liked 原理非常简单&#xff0c;一个双端链表配上一个hash表。 首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰&#xff0c;链表尾部就是最不常用的直接…

专利:基于2D工业相机的工件目标检测及三维姿态

本发明公开了一种基于2D工业相机的工件目标检测及三维姿态判定方法&#xff0c;首先根据待生产或是待加工工件目标搭建其三维几何模型&#xff0c;并标记该几何模型制定特征点&#xff0c;然后对通过两个2D工业相机分别获得的现场工件目标图像进行目标检测及特征识别&#xff0…

Python电能质量扰动信号分类(六)基于扰动信号特征提取的超强机器学习识别模型

目录 往期精彩内容&#xff1a; 前言 1 数据集和特征提取 1.1 数据集导入 1.2 扰动信号特征提取 2超强模型XGBoost——原理介绍 2.1 原理介绍 2.2 特征数据集制作 3 模型评估和对比 3.1 随机森林分类模型 3.2 支持向量机SVM分类模型 3.3 XGBoost分类模型 代码、数据…

线程安全的集合容器

线程安全的集合容器 List集合中的线程安全的集合容器&#xff1a; 在旧版本中Vector是线程安全的集合容器&#xff0c;在JDK 1.5以后CopyOnWriteArrayList也是线程安全的集合容器&#xff0c;CopyOnWriteArrayList的数据结构是Object类型的数组。 CopyOnWriteArrayList是如何…

最新IE跳转Edge浏览器解决办法(2024.2.29)

最新IE跳转Edge浏览器解决办法&#xff08;2024.2.29&#xff09; 1.前言2. 解决方案2.1.创建快捷方式2.2.效果 3. 遗留问题 1.前言 在前几天我发布过一个关于使用卸载补丁从而解决最新的IE跳转Edge浏览器的解决方案。   但是这个方案其实存在一个BUG&#xff0c;例如我昨天重…

Mac 重新安装系统

Mac 重新安装系统 使用可引导安装器重新安装&#xff08;可用于安装非最新的 Mac OS&#xff0c;系统降级&#xff0c;需要清除所有数据&#xff09; 插入制作好的可引导安装器&#xff08;U盘或者移动固态硬盘&#xff09;&#xff0c;如何制作可引导安装器将 Mac 关机将 Ma…

本地ssh连接服务器成功,而vscode连接服务器超时

解决方案&#xff0c;按下CTRL SHIFT P 或者 COMMAND SHIFT P&#xff0c;然后输入Remote kill&#xff0c;找到以下命令Kill VS Code Server on Host...&#xff0c;然后选择连接失败的服务器进行Kill&#xff0c;之后再次尝试连接即可。 如果还不成功。找一个能登陆的方…

ubuntu基础操作(1)-个人笔记

搜狗输入法Linux官网-首页搜狗输入法for linux—支持全拼、简拼、模糊音、云输入、皮肤、中英混输https://pinyin.sogou.com/linux 1.关闭sudo密码&#xff1a; 终端&#xff08;ctrl alt t&#xff09;输入 sudo visudo 打开visudo 找到 %sudo ALL(ALL:ALL) ALL 这一行…

mount命令最新详细教程

背景 需要在设备上面&#xff0c;自动化运行u盘里面的脚本&#xff0c;并且进入一个产测模式。因此实际使用了这个mount命令&#xff0c;所以&#xff0c;写了这么一篇供大家参考。 一. 定义 mount命令在Linux和类Unix系统中用于挂载文件系统&#xff0c;即将存储设备…

PYCHARM PYSIDE6 QT 打包异常处理 no qt platform plugin could be initialized

安装有PYSIDE6的电脑 异常错误 … no qt platform plugin could be initialized … 变量名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH &#xff08;一个字都不能改&#xff01;&#xff01;&#xff09; 自己环境变量值&#xff1a;D:\Users\topma\anaconda3\Lib\site-package…

国产航顺HK32F030M: HK32F030MJ4M6_SOP8资料

最小系统 参考资料 [1] 航顺MCU HK32F030MJ4M6-SOP8 各个文件夹简介&#xff1a; Boards&#xff1a;HK32F030xMF4P6开发板的BSP驱动代码。 Documents&#xff1a;HK32F030xMxx数据手册、用户手册、API手册以及HK32F030xMxx开发板原理图。 Package&#xff1a;HK32F030xMxx Ke…

HTML+CSS:未来属于CSS

效果演示 一个带有不同背景颜色的网格布局&#xff0c;其中一些元素可能会更大或者字体更大。 Code <main><div></div><div></div><div></div><div></div><div class"big"></div><div><…

MWC 2024丨Smart Health搭载高通Aware平台—美格发布智能健康看护解决方案,开启健康管理新体验

2月29日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;全球领先的无线通信模组及解决方案提供商——美格智能正式发布了新一代Cat.1模组SLM336Q&#xff0c;是中低速物联网应用场景的高性价比之选。本次还发布了首款搭载高通Aware™平台的智能看护解决方案MC303&#x…

Squid代理服务器配置

需求是&#xff1a;通过外网机&#xff08;跳板机&#xff09;访问内网机&#xff0c;并为内网机提供访问网络的能力。 【跳板机T】【内网机N】 公网IP&#xff1a;39.107.xx.xxx 跳板机IP&#xff1a;172.17.216.234 内网机IP&#xff1a;172.17.216.241 Squid代理服务器地址…

使用Python,maplotlib绘制树型有向层级结构图

使用Python&#xff0c;maplotlib绘制树型有向层级结构图 1. 效果图2. 源码2.1 plotTree.py绘制层级结构及不同样式2.2 plotArrow.py 支持的所有箭头样式 参考 前俩篇博客介绍了 1. 使用Python&#xff0c;networkx对卡勒德胡赛尼三部曲之《群山回唱》人物关系图谱绘制 2. 使用…