k8s学习-Kubernetes Ingress

1.1 什么是Ingress?

首先我们来思考用传统的web服务器,比如Nginx,如何处理这种场景?
比如使用Nginx充当一个反向代理服务器拦截外部请求,读取路由规则配置,转发相应的请求到后端服务。

kubernetes处理这种场景时,涉及到三个组件:

  • 反向代理web服务器

负责拦截外部请求,比如Nginx、Apache、traefik等等。我一般以Deployment方式部署到kubernetes集群中,当然也可以用DeamonSet方式部署;这两种部署方式个人觉得有利有弊,感兴趣的请参考这篇文章。

  • Ingress controller

k8s中的controller有很多,比如CronJob、DeamonSet、Deployment、ReplicationSet、StatefulSet等等,大家最熟悉的应该是Deployment,它的作用就是监控集群的变化,使集群始终保持我们期望的最终状态(yml文件)。同理,Ingress controller的作用就是实时感知Ingress路由规则集合的变化,再与Api Server交互,获取Service、Pod在集群中的 IP等信息,然后发送给反向代理web服务器(比如Nginx),刷新其路由配置信息,这就是它的服务发现机制。

  • Ingress
    Ingress 简单的理解就是原来需要改 Nginx 配置,然后配置各种域名对应哪个 Service,现在把这个动作抽象出来,变成一个 Ingress 对象,可以用 yaml 创建,每次不要去改 Nginx 了,直接改 yaml 然后创建/更新就行了。

1.2 创建Ingress 资源

Ingress资源时基于HTTP虚拟主机或URL的转发规则,需要强调的是,这是一条转发规则。它在资源配置清单中的spec字段中嵌套了rules、backend和tls等字段进行定义。
如下示例中定义了一个Ingress资源,其包含了一个转发规则:将发往myapp.test.com的请求,代理给一个名字为myapp的Service资源。

apiVersion: extensions/v1beta1		
kind: Ingress		
metadata:			name: ingress-myapp   namespace: default     annotations:          kubernetes.io/ingress.class: "nginx"
spec:     rules:   - host: myapp.test.com   http:paths:       - path:       backend:    serviceName: myappservicePort: 80

Ingress 中的spec字段是Ingress资源的核心组成部分,主要包含以下3个字段:

  • rules:用于定义当前Ingress资源的转发规则列表;由rules定义规则,或没有匹配到规则时,所有的流量会转发到由backend定义的默认后端。
  • backend:默认的后端用于服务那些没有匹配到任何规则的请求;定义Ingress资源时,必须要定义backend或rules两者之一,该字段用于让负载均衡器指定一个全局默认的后端。
  • tls:TLS配置,目前仅支持通过默认端口443提供服务,如果要配置指定的列表成员指向不同的主机,则需要通过SNITLS扩展机制来支持该功能。
    backend对象的定义由2个必要的字段组成:serviceName和servicePort,分别用于指定流量转发的后端目标Service资源名称和端口。
    rules对象由一系列的配置的Ingress资源的host规则组成,这些host规则用于将一个主机上的某个URL映射到相关后端Service对象,其定义格式如下:
spec:rules:- hosts: <string>http:paths:- path:backend:serviceName: <string>servicePort: <string>

Ingress资源类型
Ingress的资源类型有以下4种:

1、单Service资源型Ingress
2、基于URL路径进行流量转发
3、基于主机名称的虚拟主机
4、TLS类型的Ingress资源

1.2 部署配置Ingress

1 .部署文件介绍、准备

默认下载最新的yaml:wget  https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/mandatory.yaml

准备镜像,从这里mandatory.yaml查看需要哪些镜像

镜像名称版本下载地址
k8s.gcr.io/defaultbackend-amd641.5registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64
kquay.io/kubernetes-ingress-controller/nginx-ingress-controller0.20.0registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller

在每一个节点(Node)上下载镜像:

[root@k8s-node2 ~]# docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
1.5: Pulling from kubernetes_xingej/defaultbackend-amd64
26de8f6c1f4b: Pull complete
Digest: sha256:2cdff48ab9b20ca5f9b0ee48bf3c139c51d6fb1a15245966583bc371c121c238
Status: Downloaded newer image for registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
[root@k8s-node2 ~]# docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0
0.20.0: Pulling from kubernetes_xingej/nginx-ingress-controller
8e41b996a802: Pull complete
f8e7d603ef88: Pull complete
610da4f3123f: Pull complete
62702a85e6c9: Pull complete
7cedf5b2083f: Pull complete
755f7fa719b6: Pull complete
6adbdd0c8aaf: Pull complete
2389d8b0d2a2: Pull complete
1ea794448393: Pull complete
bb0c388ee432: Pull complete
9626641c5a97: Pull complete
bd0bebb5ba38: Pull complete
Digest: sha256:3f06079f7727b2fb7ad5c97d8152eb622ae504674395dfa71fda7ce315aaaf30
Status: Downloaded newer image for registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0
registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0

下载yaml文件并更新mandatory.yaml中的镜像地址(master上)

[root@k8s-master ~]# mkdir ingress-nginx
[root@k8s-master ingress-nginx]# wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.20.0/deploy/mandatory.yaml
[root@k8s-master ingress-nginx]# wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.20.0/deploy/provider/baremetal/service-nodeport.yaml      #对外提供服务,如果不需要可以不下载
[root@k8s-master ingress-nginx]# sed -i 's#k8s.gcr.io/defaultbackend-amd64#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64#g' mandatory.yaml  #替换defaultbackend-amd64镜像地址sed -i 's#quay.io/kubernetes-ingress-controller/nginx-ingress-controller#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller#g' mandatory.yaml  #替换nginx-ingress-controller镜像地址
[root@k8s-master ingress-nginx]# grep image mandatory.yaml   #检查替换结果# Any image is permissible as long as:image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0

如果无法下载可以手动下然后上传。地址

修改service-nodeport.yaml文件,添加NodePort端口,默认为随机端口

[root@k8s-master ingress-nginx]# cat service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx
spec:type: NodePortports:- name: httpport: 80targetPort: 80protocol: TCPnodePort: 32080  #http- name: httpsport: 443targetPort: 443protocol: TCPnodePort: 32443  #httpsselector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx

部署nginx-ingress-controller

[root@k8s-master ingress-nginx]# kubectl apply -f mandatory.yaml
namespace/ingress-nginx created
deployment.apps/default-http-backend created
service/default-http-backend created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
[root@k8s-master ingress-nginx]# kubectl apply -f service-nodeport.yaml
service/ingress-nginx created

查看ingress-nginx组件状态

[root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx
NAME                   TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
default-http-backend   ClusterIP   10.1.103.71   <none>        80/TCP                       8m48s
ingress-nginx          NodePort    10.1.243.42   <none>        80:32080/TCP,443:32443/TCP   6s

访问ingress-nginx服务,查看是否配置成功

http://192.168.200.130:32080/
default backend - 404

可以看到,提示404,这个因为当前ingress-nginx服务现在还没有后端服务,这是正常的

1.3 创建ingress-nginx后端服务

创建一个Service及后端Deployment(以nginx为例)

apiVersion: v1
kind: Service
metadata:name: myappnamespace: default
spec:selector:app: myapprelease: canaryports:- name: httpport: 80targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata: name: myapp-deploy
spec:replicas: 5selector: matchLabels:app: myapprelease: canarytemplate:metadata:labels:app: myapprelease: canaryspec:containers:- name: myappimage: ikubernetes/myapp:v2ports:- name: httpdcontainerPort: 80

创建相关服务及检查状态是否就绪

[root@k8s-master ingress-nginx]# kubectl get pods
NAME                                   READY   STATUS         RESTARTS   AGE
busvbox                                1/1     Running        0          3h38m
busybox-7c84546778-9jzpx               1/1     Running        15         17d
busybox-7c84546778-rs5d9               1/1     Running        15         17d
httpd-595dc58589-c4hcv                 1/1     Running        5          2d6h
httpd-595dc58589-lxj9w                 1/1     Running        6          2d6h
httpd-595dc58589-v6wzw                 1/1     Running        11         5d
kindly-robin-mychart-fb68878c8-g4cfx   1/1     Running        0          5h10m
myapp-deploy-77c5c86fdb-52bnt          1/1     Running        0          11m
myapp-deploy-77c5c86fdb-9xjdm          1/1     Running        0          11m
myapp-deploy-77c5c86fdb-kznvk          1/1     Running        0          11m
myapp-deploy-77c5c86fdb-sp22l          1/1     Running        0          11m
myapp-deploy-77c5c86fdb-zp2tj          1/1     Running        0          11m

将myapp添加至ingress-nginx中

apiVersion: apps/v1
kind: Ingress
metadata:name: ingress-myappnamespace: defaultannotations: kubernetes.io/ingress.class: "nginx"
spec:rules:- host: myapp.soft.com #生产中该域名应当可以被公网解析http:paths:- path: backend:serviceName: myappservicePort: 80

将myapp添加至ingress-nginx中
vi ingress-myapp.yaml

apiVersion: apps/v1
kind: Ingress
metadata:name: ingress-myappnamespace: defaultannotations: kubernetes.io/ingress.class: "nginx"
spec:rules:- host: myapp.soft.com #生产中该域名应当可以被公网解析http:paths:- path: backend:serviceName: myappservicePort: 80
[root@k8s-master ingress-nginx]# kubectl apply -f ingress-myapp.yaml  ingress.extensions "ingress-myapp" created

配置域名解析,当前测试环境我们使用hosts文件进行解析,修改本机的host

C:\Windows\System32\drivers\etc
192.168.200.130  myapp.soft.com

浏览器访问域名

http://myapp.soft.com:32080/Hello MyApp | Version: v2 | Pod Name

1.4 配置ingress https 证书访问

再创建一个Service及后端Deployment(以tomcat为例)
vi tomcat-deploy.yaml

apiVersion: v1
kind: Service
metadata:name: tomcatnamespace: default
spec:selector:app: tomcatrelease: canaryports:- name: httpport: 8080targetPort: 8080- name: ajpport: 8009targetPort: 8009---
apiVersion: apps/v1
kind: Deployment
metadata: name: tomcat-deploy
spec:replicas: 3selector: matchLabels:app: tomcatrelease: canarytemplate:metadata:labels:app: tomcatrelease: canaryspec:containers:- name: tomcatimage: tomcat:7-alpineports:- name: httpdcontainerPort: 8080- name: ajpcontainerPort: 8009 

通过kubectl将其部署到K8S集群:

kubectl apply -f tomcat-deploy.yaml``````bash
[root@k8s-master ~]# kubectl get pod -o wide
NAME                                   READY   STATUS         RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATEStomcat-deploy-f59fd664-47rbp           0/1     ContainerCreating   0          23s     <none>         k8s-node2   <none>           <none>
tomcat-deploy-f59fd664-8h9s6           0/1     ContainerCreating   0          23s     <none>         k8s-node1   <none>           <none>
tomcat-deploy-f59fd664-fwxwc           0/1     ContainerCreating   0          23s     <none>         k8s-node2   <none>           <none>

将tomcat添加至ingress-nginx中
vi ingress-tomcat.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: ingress-tomcatnamespace: defaultannotations: kubernets.io/ingress.class: "nginx"
spec:rules:- host: tomcat.soft.comhttp:paths:- path: backend:serviceName: tomcatservicePort: 8080

通过kubectl将其部署到K8S集群:

kubectl apply -f ingress-tomcat.yaml 

添加域名解析及访问服务

C:\Windows\System32\drivers\etc
192.168.200.130  myapp.soft.com
192.168.200.130 tomcat.soft.com

浏览器访问域名

http://tomcat.soft.com:32080/Apache Tomcat/7.0.94 界面,就不放图了

1.7 对tomcat服务添加https服务

创建私钥和证书

[root@k8s-master ingress-nginx]# openssl genrsa -out tls.key 2048
Generating RSA private key, 2048 bit long modulus
...........+++
..................................+++
e is 65537 (0x10001)

创建自签证书

openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=tomcat.soft.com #注意域名要和服务的域名一致 

注意生成的证书是不能直接贴到nginx的pod中去的,我们需要把它先转成特殊格式,这个特殊格式叫secret,它也是标准的k8s集群对象,它可以直接注入到pod中被pod所引用。因此接下来我们需要把它做成secret

kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key

查看secret

[root@k8s-master ingress-nginx]# kubectl get secret
NAME                               TYPE                                  DATA   AGE
default-token-pj9g7                kubernetes.io/service-account-token   3      17d
kindly-robin-mychart-token-54rjt   kubernetes.io/service-account-token   3      20h
mysecret                           Opaque                                2      3d17h
tomcat-ingress-secret              kubernetes.io/tls                     2      53s
[root@k8s-master ingress-nginx]# kubectl describe secret tomcat-ingress-secret
Name:         tomcat-ingress-secret
Namespace:    default
Labels:       <none>
Annotations:  <none>Type:  kubernetes.io/tlsData
====
tls.key:  1679 bytes
tls.crt:  1289 bytes

将证书应用至tomcat服务中
vi ingress-tomcat-tls.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: ingress-tomcat-tlsnamespace: defaultannotations: kubernets.io/ingress.class: "nginx"
spec:tls:- hosts:- tomcat.soft.com        #与secret证书的域名需要保持一致secretName: tomcat-ingress-secret   #secret证书的名称rules:- host: tomcat.soft.comhttp:paths:- path: backend:serviceName: tomcatservicePort: 8080

通过kubectl将其部署到K8S集群:

kubectl apply -f ingress-tomcat-tls.yaml

查看ingress

[root@k8s-master ingress-nginx]# kubectl get ingress
NAME                 CLASS    HOSTS             ADDRESS   PORTS     AGE
ingress-myapp        <none>   myapp.soft.com              80        46m
ingress-tomcat       <none>   tomcat.soft.com             80        13m
ingress-tomcat-tls   <none>   tomcat.soft.com             80, 443   4m4s

浏览器访问域名

https://tomcat.soft.com:32443/Apache Tomcat/7.0.94 界面,就不放图了

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

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

相关文章

python-pandas查漏补缺

1. create labels for Series 2. 3. 4. 用平均数等去填empty的格子 5. 6. 7.

巴尔加瓦算法图解【完结】:算法运用(下)

目录 布隆过滤器HyperLogLogSHA算法比较文件检查密码 Diffie-Hellman密钥交换线性规划结语&#xff08;完结&#xff09; 布隆过滤器 在元素很多的情况下&#xff0c;判断一个元素是否在集合中可以使用布隆过滤器。布隆过滤器&#xff08;Bloom Filter&#xff09;是 1970 年由…

旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)

旅游管理系统目录 目录 基于Springboot的旅游管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户管理 2、景点分类管理 3、景点信息管理 4、酒店信息管理 5、景点信息 6、游记分享管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xf…

037 稀疏数组

代码示例 /*** 生成稀疏数组* param arr 原数组* param defaultValue 数组默认值* return*/ static int[][] extractArray(int[][] arr, int defaultValue) {// 统计有多少个非默认值int count 0;for (int i 0; i < arr.length; i) {for (int j 0; j < arr[i].lengt…

【算法训练营】栈,队列,二叉树习题1-1(python实现)

栈 描述 实现一个栈&#xff0c;完成以下功能&#xff1a; 入栈出栈询问栈中位置Y是谁 一开始栈为空。栈中的位置从1开始&#xff08;即栈底位置为1&#xff09;。 输入 第一行一个整数n&#xff0c;表示操作个数。 接下来n行&#xff0c;每行第一个数字表示操作&#xff08;见…

软考网工笔记1:计算机网络的形成和发展

计算机网络的形成和发展 一、早期的计算机网络 1、1951年&#xff0c;美国麻省理工学院林肯实验室就开始为美国空军设计称为 SAGE 的半自动化地面防空系统&#xff0c;该系统最终于1963年建成&#xff0c;被认为是计算机和通信技术结合的先驱。 2、美国航空公司与 IBM公司在…

谷歌发布AI新品Gemini及收费模式;宜家推出基于GPT的AI家装助手

&#x1f989; AI新闻 &#x1f680; 谷歌发布AI新品Gemini及收费模式 摘要&#xff1a;谷歌宣布将原有的AI产品Bard更名为Gemini&#xff0c;开启了谷歌的AI新篇章。同时推出了强化版的聊天机器人Gemini Advanced&#xff0c;支持更复杂的任务处理&#xff0c;提供了两个月的…

C++服务器端开发(10):性能优化

选择合适的数据结构和算法&#xff1a;使用适当的数据结构和算法可以极大地提高服务器的性能。例如&#xff0c;使用哈希表来快速访问和检索数据&#xff0c;使用平衡二叉树来维护有序的数据等。 减少内存分配和释放&#xff1a;频繁的内存分配和释放操作会导致性能下降。可以…

Mysql Day03

多表设计 一对多 在多的一方添加外键约束&#xff0c;关联另外一方主键 一对一 任意一方添加外键约束&#xff0c;关联另外一方主键 多对多 建立第三张中间表&#xff0c;中间表至少包含两个外键&#xff0c;分别关联两方主键 idstu_idcourse_id 1 11 2 12313421524 案…

融资项目——获取树形结构的数据

如下图所示&#xff0c;下列数据是一个树形结构数据&#xff0c;行业中包含若干子节点。表的设计如下图&#xff0c;设置了一个id为1的虚拟根节点。&#xff08;本树形结构带虚拟根节点共三层&#xff09; 实现逻辑&#xff1a; 延时展示方法&#xff0c;先展现第二层的信息&a…

机器学习8-决策树

决策树&#xff08;Decision Tree&#xff09;是一种强大且灵活的机器学习算法&#xff0c;可用于分类和回归问题。它通过从数据中学习一系列规则来建立模型&#xff0c;这些规则对输入数据进行递归的分割&#xff0c;直到达到某个终止条件。 决策树的构建过程&#xff1a; 1.…

2024年生成式AI芯片市场规模将达500亿美元

1月24日&#xff0c;德勤发布《2024科技、传媒和电信行业预测》中文版报告&#xff0c;2024年是科技、传媒和电信行业关键的一年&#xff0c;不少科技公司正利用生成式AI升级软件和服务&#xff0c;预计今年全球生成式人工智能芯片销售额可能达到500亿美元以上。 2024年将有许…

【开源】基于JAVA+Vue+SpringBoot的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

Mysql一行记录存储过程

Mysql一行记录存储过程 Mysql的文件架构 行&#xff08;row&#xff09; 数据库表中的记录都是行存放的&#xff0c;每行继续根据不同的行格式都有不同的存储结构。 页&#xff08;page&#xff09; 记录是按照行来存储的&#xff0c;但是数据库的读取是以页为单位的&…

Element-ui date-picker组件报错 date.getHours is not a function

这个错误通常意味着date这个变量并不是一个真正的日期对象&#xff0c;而是其他类型&#xff0c;例如字符串或数字。因此&#xff0c;无法调用日期对象的getHours方法。 在Element-ui中使用date-picker组件时&#xff0c;应该保证绑定的数据是Date对象&#xff0c;而不是其他类…

python-基础篇-列表-脚本

文章目录 01_下标.py02_查找.py03_判断是否存在.py04_体验案例判断是否存在.py05_列表增加数据之append.py06_列表增加数据之extend.py07_列表增加数据之insert.py08_列表删除数据.py09_列表修改数据.py10_列表复制数据.py11_列表的循环遍历之while.py12_列表的循环遍历之for.p…

Goro Shimura似乎不懂模形式

Goro Shimura(1930-2019&#xff0c;Cole奖获得者)&#xff0c; 志村五郎&#xff0c;生前普林斯顿大学教授&#xff0c;日本裔数学家&#xff0c;研究模形式著称。在其名著Introduction to the Arithmetic Theory of Automorphic Functions&#xff08; Princeton University …

Linux 存储管理(磁盘管理、逻辑卷LVM、交换分区swap)

目录 1.磁盘管理 1.1 磁盘简介 1.2 管理磁盘 添加磁盘 管理磁盘流程三步曲 1.查看磁盘信息 2.创建分区 3.创建文件系统 4.挂载mount 5.查看挂载信息 6.MBR扩展分区 7.重启后的影响 2.逻辑卷LVM 2.1 简介 ​​​​​​2.2 创建LVM 2.3 VG管理 2.4 LV管理实战-在…

铱塔 (iita) 开源 IoT 物联网开发平台,基于 SpringBoot + TDEngine +Vue3

01 铱塔 (iita) 物联网平台 铱塔智联 (open-iita) 基于Java语言的开源物联网基础开发平台&#xff0c;提供了物联网及相关业务开发的常见基础功能, 能帮助你快速搭建自己的物联网相关业务平台。 铱塔智联平台包含了品类、物模型、消息转换、通讯组件&#xff08;mqtt/EMQX通讯组…

数组旋转变换分析

&#xff08;1&#xff09;数组初始化 初始化&#xff1a;[1,2,3,4,5,6,7,8] 其中1,5是一对&#xff0c;2,6是一对&#xff0c;3,7是一对&#xff0c;4,8是一对。 &#xff08;2&#xff09;任意旋转 把左边若干个数放到数组右边 新的数组和[x,x1......x7]mod 8同余 &…