【Kubernetes】控制器Statefulset

Statefulset控制器

  • 一、概念
  • 二、Statefulset资源清单文件编写技巧
    • 2.1、查看定义Statefulset资源需要的字段
    • 2.2、查看statefulset.spec字段如何定义
    • 2.3、查看statefulset的spec.template字段如何定义
  • 三、Statefulset使用案例:部署web站点
    • 3.1、编写一个Statefulset资源清单文件
    • 3.2、更新资源清单文件
    • 3.3、查看相关资源
  • 四、StatefulSet组成部分
    • 4.1、 Headless Service
      • 【1】headless service会为service分配一个域名
      • 【2】StatefulSet会为关联的Pod保持一个不变的Pod Name
      • 【3】StatefulSet会为关联的Pod分配一个dnsName
    • 4.2、volumeClaimTemplates
    • 4.3、总结
  • 五、Statefulset管理pod:扩容、缩容、更新
    • 5.1、动态扩缩容
    • 5.2、滚动更新

一、概念

StatefulSet是为了管理有状态服务的问题而设计的.

扩展:
有状态服务?

StatefulSet是有状态的集合,管理有状态的服务,它所管理的Pod的名称不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独有的数据持久化存储目录。比如MySQL主从、redis集群等。

无状态服务?

RC、Deployment、DaemonSet都是管理无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的。个体对整体无影响,所有pod都是共用一个数据卷的,部署的tomcat就是无状态的服务,tomcat被删除,在启动一个新的tomcat,加入到集群即可,跟tomcat的名字无关。

二、Statefulset资源清单文件编写技巧

2.1、查看定义Statefulset资源需要的字段

[root@master ~]# kubectl explain statefulset
KIND:     StatefulSet
VERSION:  apps/v1

DESCRIPTION:
     StatefulSet represents a set of pods with consistent identities. Identities
     are defined as:
     - Network: A single stable DNS and hostname.
     - Storage: As many VolumeClaims as requested.

     The StatefulSet guarantees that a given network identity will always map to
     the same storage identity.

FIELDS:
   apiVersion   <string> # 定义资源需要使用的api版本
   kind <string>         # 定义资源类型
   metadata     <Object> # 定义元数据
   spec <Object>         # 定义容器相关的信息  

2.2、查看statefulset.spec字段如何定义

[root@master ~]#  kubectl explain statefulset.spec
KIND:     StatefulSet
VERSION:  apps/v1

RESOURCE: spec <Object>

DESCRIPTION:
     Spec defines the desired identities of pods in this set.

     A StatefulSetSpec is the specification of a StatefulSet.

FIELDS:
   podManagementPolicy  <string>      # POD管理策略
   replicas     <integer>             # 副本数
   revisionHistoryLimit <integer>     # 保留的历史版本
   selector     <Object> -required-   # 标签选择器,选择它所关联的pod
   serviceName  <string> -required-   # headless service的名字
   template     <Object> -required-   # 生成pod的模板
   updateStrategy       <Object>      # 更新策略
   volumeClaimTemplates <[]Object>    # 存储卷申请模板

2.3、查看statefulset的spec.template字段如何定义

对于template而言,其内部定义的就是pod,pod模板是一个独立的对象。
.spec.template里的内容是声明Pod对象时要定义的各种属性,所以这部分也叫做PodTemplate(Pod模板)

[root@master ~]# kubectl explain statefulset.spec.template
KIND:     StatefulSet
VERSION:  apps/v1

RESOURCE: template <Object>
DESCRIPTION:
    ......
FIELDS:
   metadata     <Object>  # 定义多少个Pod副本(默认将仅部署1个Pod)、匹配Pod标签的选择器、创建pod的模板、存储卷申请模板 
   spec <Object>  # Pod里的容器属性等配置 
                  # 在spec.template.spec.selector中定义的标签选择器必须能够匹配到spec.template.metadata.labels里定义的Pod标签,否则Kubernetes将不允许创建statefulset。

三、Statefulset使用案例:部署web站点

3.1、编写一个Statefulset资源清单文件

[root@master 12]# cat statefulset.yaml
apiVersion: v1   # 定义api版本
kind: Service    # 定义要创建的资源:service
metadata:
  name: nginx    # 定义service的名字
  labels: 
     app: nginx  # service的标签
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None  # 创建一个没有ip的service
  selector:
    app: nginx     # 选择拥有app=nginx标签的pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"   # headless service的名字
  replicas: 2            # 副本数
  template:
    metadata:            # 定义pod的模板
     labels:
       app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80  # 容器服务的端口
          name: web          # 端口别名
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:     # 存储卷申请模板
  - metadata:
      name: www
    spec:
      accessModes: ["ReadWriteOnce"] # 访问模式:单路读写
      storageClassName: "nfs"  # 指定从哪个存储类申请pv
      resources:
        requests:
          storage: 1Gi   # 需要1G的pvc,会自动跟符合条件的pv绑定 

3.2、更新资源清单文件

[root@master 12]# kubectl apply -f statefulset.yaml
service/nginx created
statefulset.apps/web created
# 查看statefulset是否创建成功
[root@master 12]# kubectl get statefulset
NAME   READY   AGE
web    2/2     2m7s
# 查看pod
[root@master 12]# kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          2m50s
web-1   1/1     Running   0          2m8s
# 通过上面可以看到创建的pod是有序的

3.3、查看相关资源

[root@master 12]# kubectl get svc -l app=nginx
NAME    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   None         <none>        80/TCP    3m50s
[root@master 12]# kubectl get pvc
NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
www-web-0     Bound    pvc-223fc042-1b1b-4516-a1b5-a5572434d3ee   1Gi        RWO            nfs            4m8s
www-web-1     Bound    pvc-b4f026b2-4984-4302-b45d-00c57a74a162   1Gi        RWO            nfs            3m26s
[root@master 12]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                 STORAGECLASS   REASON   AGE
pvc-223fc042-1b1b-4516-a1b5-a5572434d3ee   1Gi        RWO            Delete           Bound      default/www-web-0     nfs                     4m39s
pvc-b4f026b2-4984-4302-b45d-00c57a74a162   1Gi        RWO            Delete           Bound      default/www-web-1     nfs                     3m56s
[root@master 12]# for i in 0 1; do kubectl exec web-$i -- sh -c 'hostname';done
web-0
web-1

四、StatefulSet组成部分

4.1、 Headless Service

用来定义pod网路标识,生成可解析的DNS记录

Headless service不分配clusterIP,headless service可以通过解析service的DNS,返回所有Pod的dns和ip地址 (statefulSet部署的Pod才有DNS),普通的service,只能通过解析service的DNS返回service的ClusterIP。

【1】headless service会为service分配一个域名

<service name>.$<namespace name>.svc.cluster.local

K8s中资源的全局FQDN格式:
  Service_NAME.NameSpace_NAME.Domain.LTD.
  Domain.LTD.=svc.cluster.local #这是默认k8s集群的域名。

扩展:FQDN

FQDN 全称 Fully Qualified Domain Name
即全限定域名:同时带有主机名和域名的名称
FQDN = Hostname + DomainName
如 主机名是 xianchao 域名是 baidu.com
FQDN= xianchao.baidu.com

【2】StatefulSet会为关联的Pod保持一个不变的Pod Name

statefulset中Pod的名字格式为$(StatefulSet name)-$(pod序号)

【3】StatefulSet会为关联的Pod分配一个dnsName

$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local

4.2、volumeClaimTemplates

为什么要用volumeClaimTemplate?

对于有状态应用都会用到持久化存储,比如mysql主从,由于主从数据库的数据是不能存放在一个目录下的,每个mysql节点都需要有自己独立的存储空间。
而在deployment中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,它们数据是同步的,而statefulset定义中的每一个pod都不能使用同一个存储卷,这就需要使用volumeClainTemplate。
当在使用statefulset创建pod时,volumeClainTemplate会自动生成一个PVC,从而请求绑定一个PV,每一个pod都有自己专用的存储卷。

Pod、PVC和PV对应的关系图如下:
在这里插入图片描述
使用kubectl run运行一个提供nslookup命令的容器,这个命令来自于dnsutils包,通过对pod主机名执行nslookup,可以检查它们在集群内部的DNS地址

kubectl run busybox --image docker.io/library/busybox:1.28  --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup web-0.nginx.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      web-0.nginx.default.svc.cluster.local # 查询service dns,会把对应的pod ip解析出来
Address 1: 10.244.196.144 web-0.nginx.default.svc.cluster.local

4.3、总结

  • 1、Statefulset管理的pod,pod名字是有序的,由statefulset的名字-0、1、2这种格式组成
  • 2、创建statefulset资源的时候,必须事先创建好一个service,如果创建的service没有ip,那对这个service做dns解析,会找到它所关联的pod ip,如果创建的service有ip,那对这个service做dns解析,会解析到service本身ip。
  • 3、statefulset管理的pod,删除pod,新创建的pod名字跟删除的pod名字是一样的
  • 4、statefulset具有volumeclaimtemplate这个字段,这个是卷申请模板,会自动创建pv,pvc也会自动生成,跟pv进行绑定,那如果创建的statefulset使用了volumeclaimtemplate这个字段,那创建pod,数据目录是独享的
  • 5、ststefulset创建的pod,是有域名的(域名组成:pod-name.svc-name.svc-namespace.svc.cluster.local)

五、Statefulset管理pod:扩容、缩容、更新

5.1、动态扩缩容

如果我们觉得两个副本太少了,想要增加,只需要修改配置文件statefulset.yaml里的replicas的值即可,原来replicas: 2,现在变成replicaset: 3,修改之后,执行如下命令更新:

[root@master 12]# kubectl apply -f statefulset.yaml
service/nginx unchanged
statefulset.apps/web configured
[root@master 12]# kubectl get sts
NAME   READY   AGE
web    3/3     80m
[root@master 12]# kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          81m
web-1   1/1     Running   0          80m
web-2   1/1     Running   0          28s

也可以直接编辑控制器实现扩容,这个是我们把请求提交给了apiserver,实时修改
在这里插入图片描述

[root@master 12]# kubectl edit sts web  # 副本改成4
statefulset.apps/web edited
[root@master 12]# kubectl get pods -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          82m
web-1   1/1     Running   0          81m
web-2   1/1     Running   0          90s
web-3   1/1     Running   0          7s

5.2、滚动更新

kubectl explain sts.spec.updateStrategy

[root@master 12]# kubectl explain sts.spec.updateStrategy
KIND:     StatefulSet
VERSION:  apps/v1

RESOURCE: updateStrategy <Object>

DESCRIPTION:
     updateStrategy indicates the StatefulSetUpdateStrategy that will be
     employed to update Pods in the StatefulSet when a revision is made to
     Template.

     StatefulSetUpdateStrategy indicates the strategy that the StatefulSet
     controller will use to perform updates. It includes any additional
     parameters necessary to perform the update for the indicated strategy.

FIELDS:
   rollingUpdate        <Object>
     RollingUpdate is used to communicate parameters when Type is
     RollingUpdateStatefulSetStrategyType.

   type <string>
     Type indicates the type of the StatefulSetUpdateStrategy. Default is
     RollingUpdate
     Possible enum values:
     - `"OnDelete"`  
     - `"RollingUpdate"`  
[root@master 12]# cat statefulset.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
     app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  updateStrategy:  # 1、添加更新策略
    rollingUpdate:
      partition: 1  # 序号大于等于1的pod做更新
      maxUnavailable: 0  # 滚动更新时允许不可用 Pod 的最大数量
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
     labels:
       app: nginx
    spec:
      containers:
      - name: nginx
        image: ikubernetes/myapp:v2  # 2、修改镜像:容器才会更新
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "nfs"
      resources:
        requests:
          storage: 1Gi
# 在一个终端执行如下命令:kubectl apply -f statefulset.yaml
# 在另一个终端动态查看pod
[root@master ~]# kubectl get pods -l app=nginx -w
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          102m
web-1   1/1     Running   0          101m
web-2   1/1     Running   0          22m
web-3   1/1     Running   0          20m
web-3   1/1     Terminating   0          20m
web-3   1/1     Terminating   0          20m
web-3   0/1     Terminating   0          20m
web-3   0/1     Terminating   0          20m
web-3   0/1     Terminating   0          20m
web-2   1/1     Terminating   0          22m
web-2   1/1     Terminating   0          22m
web-2   0/1     Terminating   0          22m
web-2   0/1     Terminating   0          22m
web-2   0/1     Terminating   0          22m
web-2   0/1     Pending       0          0s
web-2   0/1     Pending       0          0s
web-2   0/1     ContainerCreating   0          0s
web-2   0/1     ContainerCreating   0          1s
web-2   1/1     Running             0          10s
web-1   1/1     Terminating         0          102m
web-1   1/1     Terminating         0          102m
web-1   0/1     Terminating         0          102m
web-1   0/1     Terminating         0          102m
web-1   0/1     Terminating         0          102m
web-1   0/1     Pending             0          0s
web-1   0/1     Pending             0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   0/1     ContainerCreating   0          0s
web-1   1/1     Running             0          9s
web-2   1/1     Running             0          42s
web-1   1/1     Running             0          52s

# 从上面结果可以看出来,pod在更新的时候,只是更新了web-1、2、3 
# partition: 1表示更新的时候会把pod序号大于等于1的进行更新

如果更新策略是OnDelete,那不会自动更新pod,需要手动删除,重新常见的pod才会实现更新
修改策略:

  updateStrategy:
   type: OnDelete
   # rollingUpdate:
   #   partition: 1
   #   maxUnavailable: 0
[root@master 12]# kubectl apply -f statefulset.yaml
service/nginx unchanged
statefulset.apps/web configured
[root@master 12]# kubectl get pod  -l app=nginx
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          121m
web-1   1/1     Running   0          18m
web-2   1/1     Running   0          18m
[root@master 12]# kubectl delete pod web-0
pod "web-0" deleted
# 在另一种终端动态查看
[root@master ~]# kubectl get pod -w
NAME                              READY   STATUS    RESTARTS      AGE
web-0                             1/1     Running   0             122m
web-1                             1/1     Running   0             19m
web-2                             1/1     Running   0             19m
web-0                             1/1     Terminating   0             122m
web-0                             1/1     Terminating   0             122m
web-0                             0/1     Terminating   0             122m
web-0                             0/1     Terminating   0             122m
web-0                             0/1     Terminating   0             122m
web-0                             0/1     Pending       0             0s
web-0                             0/1     Pending       0             0s
web-0                             0/1     ContainerCreating   0             0s
web-0                             0/1     ContainerCreating   0             1s
web-0                             1/1     Running             0             2s

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

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

相关文章

【ctf】whireshark流量分析之tcp_杂篇

目录 简介 常考 图片类 提取png.pcap&#xff08;常规&#xff09; 异常的流量分析&#xff08;*&#xff0c;特殊&#xff09; john-in-the-middle&#xff08;特殊&#xff09; ​编辑 zip类 1.pcap&#xff08;常规&#xff09; 方法1&#xff08;常规提取压缩包&…

绝地求生电脑版的最低配置要求?

绝地求生&#xff08;PlayerUnknowns Battlegrounds&#xff09;是一款非常热门的战术竞技游戏&#xff0c;它在全球范围内有着大量的玩家。为了让更多的玩家能够顺畅地体验这款游戏&#xff0c;下面将介绍绝地求生电脑版的最低配置要求。 CPU&#xff1a;Intel Core i5-4430或…

基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 包围盒构建 4.2 点云压缩 4.3 曲面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................…

4.3 媒资管理模块 - Minio系统上传图片与视频

文章目录 一、上传图片1.1 需求分析1.2 数据模型1.2.1 media_files 媒资信息表 1.3 准备Minio环境1.3.1 桶环境1.3.2 连接Minio参数1.3.3 Minio配置类 1.4 接口定义1.4.1 上传图片接口请求参数1.4.2 上传图片接口返回值1.4.3 接口代码 1.5 MediaFilesMapper1.6 MediaFileServic…

技术阅读周刊第十一期

技术阅读周刊&#xff0c;每周更新。 历史更新 20231124&#xff1a;第七期20231201&#xff1a;第八期20231215&#xff1a;第十‍期 A Comprehensive guide to Spring Boot 3.2 with Java 21, Virtual Threads, Spring Security, PostgreSQL, Flyway, Caching, Micrometer, O…

第19章总结

一.Java绘图类 1.Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics类封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 2.Graphics2D类 Graphics2…

MFC 工具栏

目录 工具栏概述 工具栏的使用 添加工具栏资源 创建&#xff0c;加载工具栏 设置工具栏停靠 工具栏概述 CToolBarCtrl-父类CWnd&#xff0c;封装了关于工具栏控件的各种操作。 CToolBar一父类CControlBar&#xff0c;封装了关于工具栏的操作&#xff0c;以及和框架窗口的…

【力扣周赛】第 373 场周赛(交换得到字典序最小的数组 ⭐分解质因子+前缀和+哈希表)

文章目录 竞赛链接Q1&#xff1a;2946. 循环移位后的矩阵相似检查竞赛时代码——模拟 2947. 统计美丽子字符串 I竞赛时代码——前缀和暴力枚举 Q3&#xff1a;2948. 交换得到字典序最小的数组竞赛时代码——排序后判断相似题目——1202. 交换字符串中的元素&#xff08;使用并查…

【C++练级之路】【Lv.5】动态内存管理(都2023年了,不会有人还不知道new吧?)

目录 一、C/C内存分布二、new和delete的使用方式2.1 C语言内存管理2.2 C内存管理2.2.1 new和delete操作内置类型2.2.2 new和delete操作自定义类型 三、new和delete的底层原理3.1 operator new与operator delete函数3.2 原理总结3.2.1 内置类型3.2.2 自定义类型 四、定位new表达…

MFC读取文件数据,添加信息到列表并保存到文件

打开并读取文件信息 添加&#xff1a; BOOL infoDlg::OnInitDialog() {CDialogEx::OnInitDialog();// TODO: 在此添加额外的初始化AfxMessageBox("欢迎查看学生信息");SetList();return TRUE; // return TRUE unless you set the focus to a control// 异常: OCX 属…

Spark编程语言选择:Scala、Java和Python

在大数据处理和分析领域&#xff0c;Apache Spark已经成为一种非常流行的工具。它提供了丰富的API和强大的性能&#xff0c;同时支持多种编程语言&#xff0c;包括Scala、Java和Python。选择合适的编程语言可以直接影响Spark应用程序的性能、可维护性和开发效率。在本文中&…

Json和Xml

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第21章《Json和Xml》 二、Xml的介绍 Xml的含义&#xff1a; 可标记性语言&#xff0c;它将数据以一种特别简单文本格式储存。让所有人和几乎所有的计算机都能理解。 XML文件示例&#xff1a; <?xml version"1.…

自动驾驶学习笔记(二十二)——自动泊车算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 感知算法 定位算法 规划算法…

分享70个Java源码总有一个是你想要的

分享70个Java源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1s8ZVYHb5B1GgXMlpG-6-Iw?pwd6666 提取码&#xff1a;6666 项目名称 admin、cms、console 等多…

nodejs+vue+微信小程序+python+PHP的4s店客户管理系统-计算机毕业设计推荐

系统的功能结构是系统实现的框架&#xff0c;本系统的主要结构为管理员和用户、员工。管理员的功能为车辆信息管理、用户管理、售后服务管理、售后安排管理、完成售后管理等。 本系统实现了售后的在线申请与处理&#xff0c;方便了用户和管理员、员工三方的利益&#xff0c;提高…

Linux 宝塔mysql莫名其妙数据库不见了恢复数据库

起因&#xff1a;宝塔安装的mysql 线上运行突然表包括库都不见了&#xff0c;想办法恢复数据库 登陆mysql cd /www/server/mysql/binmysql -u root -p查看binlog日志是否打开 show variables like log_%;log_bin如果为 ON 则为开启状态&#xff0c;如果开启了才可以进行下一…

【SD】差异值 生成 同一人物 制作 表情包 【1】

说明&#xff1a;只对AI生成的人物&#xff0c;效果稳定。 Reference差异值 生成表情 首先生成一张图片。 测试命令&#xff1a;1 man,chibi,full body, 模型&#xff1a;envyclarityxl02_v10.safetensors [f6c13197db] 种子&#xff1a;2704867166 》》测试命令&#xff1a…

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…

力扣:51. N 皇后

题目&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的…

网络7层架构

网络 7 层架构 什么是OSI七层模型&#xff1f; OSI模型用于定义并理解数据从一台计算机转移到另一台计算机&#xff0c;在最基本的形式中&#xff0c;两台计算机通过网线和连接器相互连接&#xff0c;在网卡的帮助下共享数据&#xff0c;形成一个网络&#xff0c;但是一台计算…