K8s基础12——etcd数据备份与恢复、集群版本升级、网络策略

news2024/11/27 13:48:10

文章目录

  • 一、etcd备份与恢复
    • 1.1 kubeadm部署方式
      • 1.1.1 备份
      • 1.1.2 恢复
    • 1.2 单etcd二进制部署方式
      • 1.2.1 部署
      • 1.2.2 备份
      • 1.2.3 恢复
      • 1.2.4 K8s集群二进制部署方式恢复
  • 二、集群版本升级
    • 2.1 升级master节点
    • 2.2 升级node节点
  • 三、网络策略
    • 3.1 核心字段释义
    • 3.2 测试案例
      • 案例1:拒绝命名空间下所有Pod出入站流量
      • 案例2:拒绝其他命名空间pod访问
      • 案例3:允许其他命名空间pod访问指定应用
      • 案例4:同一个命名空间下应用之间限制访问
      • 案例5:只允许指定命名空间中的应用访问
      • 案例6:限制端口范围

一、etcd备份与恢复

基本了解:

  1. K8s 使用etcd数据库实时存储集群中的数据,安全起见,一定要备份!
  2. 备份只需要在一个节点上备就可以了,每个节点上的数据是同步的;但是数据恢复是需要在每个节点上进行。
  3. ectd容器是与宿主机网络共享的,采用hostNetwork方式,2379数据端口就可以在宿主机上查看到。
    在这里插入图片描述
  4. kubeadm方式部署的集群,其中etcd是通过静态pod方式部署启动,在/etc/kubernetes/manifests目录下有它的yaml文件,里面记录了启动镜像、版本、证书路劲、数据目录等内容。
    在这里插入图片描述
    在这里插入图片描述

注意事项:

  1. 使用yum安装的etcd版本比较低,因为etcd现有两个版本,2和3,两个版本之间的api改动较大,现在使用之前都需要先指定到3版本。
    在这里插入图片描述

1.1 kubeadm部署方式

1.1.1 备份

1.安装etcd。

[root@k8s-master opt]# yum -y install etcd

在这里插入图片描述
2.查看当前pod,待会备份后删除它,再数据恢复查看效果。
在这里插入图片描述
3.备份,导出的数据文件是qingjun.db。

ETCDCTL_API=3 etcdctl snapshot save qingjun.db \
--endpoints=https://127.0.0.1:2379 \             ##指定etcd地址端口。
--cacert=/etc/kubernetes/pki/etcd/ca.crt \      ##指定etcd根证书。
--cert=/etc/kubernetes/pki/etcd/server.crt \     ##指定etcd客户端数字证书。
--key=/etc/kubernetes/pki/etcd/server.key      ##指定key。

在这里插入图片描述
4.删除pod,恢复查看效果。

在这里插入图片描述

1.1.2 恢复

5.先停止api server 和etcd服务。因为是静态Pod部署,监控这个目录下的yaml文件,当把目录备份后就直接相当于停服。

[root@k8s-master manifests]# pwd
/etc/kubernetes/manifests

[root@k8s-master manifests]# mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bck
[root@k8s-master manifests]# mv /var/lib/etcd /var/lib/etcd.bck

在这里插入图片描述
6.使用qingjun.db文件恢复数据到/var/lib/etcd目录。

[root@k8s-master opt]# ETCDCTL_API=3 etcdctl snapshot restore qingjun.db --data-dir=/var/lib/etcd

7.启动kube-apiserver和etcd容器。

[root@k8s-master opt]# mv /etc/kubernetes/manifests.bck /etc/kubernetes/manifests

8.查看结果,数据恢复。
在这里插入图片描述

1.2 单etcd二进制部署方式

1.2.1 部署

1.提前准备etcd二进制安装包,下载地址。
在这里插入图片描述
2.解压安装包。

[root@k8s-node2 opt]# tar zxf etcd-v3.5.1-linux-amd64.tar.gz 
[root@k8s-node2 opt]# cd etcd-v3.5.1-linux-amd64/
[root@k8s-node2 etcd-v3.5.1-linux-amd64]# cp etcd etcdctl /usr/bin/

3.准备配置文件

[root@k8s-node2 etcd-v3.5.1-linux-amd64]# cat /etc/etcd.conf 
ETCD_NAME="etcd"     ##节点名称
ETCD_DATA_DIR="/var/lib/etcd"      ##数据目录
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"      ##监听地址
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"     ##别人连我的地址

4.设置为systemd系统服务。

[root@k8s-node2 etcd-v3.5.1-linux-amd64]# cat /usr/lib/systemd/system/etcd.service 
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/etc/etcd.conf
ExecStart=/usr/bin/etcd
Restart=on-failure
LimitNOFILE=65536

5.启动服务并设置开机启动

[root@k8s-node2 etcd-v3.5.1-linux-amd64]# systemctl daemon-reload
[root@k8s-node2 etcd-v3.5.1-linux-amd64]# systemctl start etcd
[root@k8s-node2 etcd-v3.5.1-linux-amd64]# systemctl enable etcd

6.查看etcd状态。

[root@k8s-node2 etcd-v3.5.1-linux-amd64]# etcdctl endpoint status --write-out=table

在这里插入图片描述

1.2.2 备份

1.查看etcd服务,需要提前部署。
在这里插入图片描述
2.备份。

##这里没有指定证书,所以就是http。
[root@k8s-node2 ~]# ETCDCTL_API=3 etcdctl snapshot save baimu.db --endpoints=http://127.0.0.1:2379

在这里插入图片描述

1.2.3 恢复

3.先停止etcd服务。

[root@k8s-node2 ~]# systemctl stop etcd
[root@k8s-node2 ~]# mv /var/lib/etcd /var/lib/etcd.bck

4.恢复数据到指定目录。

[root@k8s-node2 ~]# ETCDCTL_API=3 etcdctl snapshot restore baimu.db --data-dir=/var/lib/etcd

5.启动服务即可。

[root@k8s-node2 ~]# systemctl start etcd

1.2.4 K8s集群二进制部署方式恢复

  • 上面演示的只是单etcd是二进制部署,一般情况下二进制部署都是成套的,也就是说所有组件都用二进制方式部署。所以在停止、启动服务时有点区别。

1、先暂停kube-apiserver和etcd。

systemctl stop kube-apiserver 
systemctl stop etcd
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak

2、在每个节点上恢复。

注意:不管哪种方式恢复数据,都是在每个节点上进行恢复。所以这里就需要指定集群信息。

ETCDCTL_API=3 etcdctl snapshot restore snap.db \
--name etcd-1 \     ##节点名称
--initial-cluster="etcd-1=https://192.168.31.71:2380,etcd-2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380" \  ##集群地址
--initial-cluster-token=etcd-cluster \    
--initial-advertise-peer-urls=https://192.168.31.71:2380 \     ##当前恢复的etcd节点地址
--data-dir=/var/lib/etcd   ##数据恢复到哪里,默认就是数据目录。

3、启动kube-apiserver和etcd

systemctl start kube-apiserver 
systemctl start etcd

二、集群版本升级

升级思路:

  1. 先升级master1节点,再升级master2、master3等管理节点,再升级node1、node2等工作节点。
  2. 升级存在风险,所以需要先对升级的节点做数据备份。
  3. 升级时,先驱逐节点上的pod,在设置为不可调度。因为升级存在风险,若升级失败,也不会影响业务。

注意事项:

  • 升级前必须备份所有组件及数据,例如etcd
  • 千万不要跨多个小版本进行升级,例如从1.16升级到1.19
  • 在测试环境经过多次演练、实操,没问题后才能上生产环境。

2.1 升级master节点

1.查找最新版本号。

[root@k8s-master bck]# yum list --showduplicates kubeadm

在这里插入图片描述
2.先升级kubeadm。

[root@k8s-master bck]# yum install -y kubeadm-1.26.3-0

3.驱逐node上的pod,且不可调度。

#ignore-daemonsets参数:忽略无法驱逐的pod。
[root@k8s-master bck]# kubectl drain k8s-master --ignore-daemonsets

4.查看该节点pod状态,检查是否驱逐成功。此时该节点没有任何pod业务,可开始升级。
在这里插入图片描述
5.查看集群是否可以升级。

[root@k8s-master bck]# kubeadm upgrade plan

在这里插入图片描述
6.升级。

[root@k8s-master bck]# kubeadm upgrade apply v1.26.3

在这里插入图片描述
7.升级kubelet和kubectl,和kubeadm版本要一致。

[root@k8s-master bck]# yum install -y kubelet-1.26.3-0 kubectl-1.26.3-0

8.重启kubelet,再次查看版本已经被升级到新版本。

[root@k8s-master bck]# systemctl daemon-reload
[root@k8s-master bck]# systemctl restart kubelet

在这里插入图片描述
9.取消不可调度,重新上线。

[root@k8s-master bck]# kubectl uncordon k8s-master

2.2 升级node节点

1.先查看当前版本。
在这里插入图片描述
2.升级kubeadm版本。

[root@k8s-node2 ~]# yum install -y kubeadm-1.26.3-0

3.驱逐node1上的pod,且不可调度。

kubectl drain k8s-node1 --ignore-daemonsets

3、升级kubelet配置

kubeadm upgrade node

4、升级kubelet和kubectl

yum install -y kubelet-1.26.3-0 kubectl-1.26.3-0

5、重启kubelet

systemctl daemon-reload
systemctl restart kubelet

6、取消不可调度,重新上线。

kubectl uncordon k8s-node1

三、网络策略

基本了解:

  • 网络策略通过网络插件来实现,创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的,而我们搭建K8s集群时安装的calico网络组件就支持网络策略。
  • 默认情况下,K8s 集群网络没任何网络限制,Pod 可以与任何其他 Pod 通信,在某些场景下就需要进行网络控制,减少网络攻击面,提高安全性,这就会用到网络策略。
  • 网络策略是一个K8s资源,需要管理员写yaml定义规则的,用于限制Pod出入流量,提供Pod级别和Namespace级别网络访问控制。

应用场景:

  1. 应用程序间的访问控制,例如项目A不能访问项目B的Pod。
  2. 开发环境命名空间不能访问测试环境命名空间Pod。
  3. 当Pod暴露到外部时,需要做Pod白名单。
  4. 多租户网络环境隔离。

网络策略工作流程:

  1. 使用kubectl提交yaml文件给api server创建Network Policy资源。
  2. api server 收到之后存到etcd数据库中。
  3. Policy Controller组件监控网络策略,同步并通知节点上程序。
  4. 节点上DaemonSet运行的程序从etcd中获取Policy,调用本地Iptables创建防火墙规则。

在这里插入图片描述

注意事项:

  1. calico网络组件是以Daemonset方式部署到每个节点,其中红色框的pod负责calico录入表的维护,网络策略的执行和下发。
  2. 有的网络组件没有这个红色个框的控制器,只有agent-pod。
    在这里插入图片描述
  3. 也有特定需求是网络策略当前实现不了的,可以通过操作系统组件、准入控制器来实现。
    在这里插入图片描述

3.1 核心字段释义

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy        ##自定义网络策略名称。
  namespace: default            ##定义对哪个命名空间的Pod进行限制,这里就是对default命名空间下的pod生效。
spec:
  podSelector:               ##目标Pod,对哪个Pod生效。
    matchLabels:
      role: db       ##根据标签选择。
  policyTypes:     ##策略类型。
    - Ingress        ##入站流量,谁能访问我。
    - Egress        ##出站流量,我能访问谁。
  ingress:
    - from:          ##from是可以访问的白名单,可以来自于IP段、命名空间、Pod标签等,ports是可以访问的端口。
        - ipBlock:     ##可以访问我的IP段,除了 172.17.1.0/24 之外的所有 172.17.0.0/16网络中的pod都可以访问我。
            cidr: 172.17.0.0/16
            except:
              - 172.17.1.0/24
        - namespaceSelector:   ##命名空间的标签为project=myproject,且其下pod标签为role=client的pod可以访问我。
            matchLabels:
              project: myproject
          podSelector:
            matchLabels:
              role: client
        - podSelector:        ##任何名字空间中,标签为role=frontend的Pod可以访问我。
            matchLabels:
              role: frontend
      ports:                  ##白名单能基于TCP协议访问我的6379端口。
        - protocol: TCP
          port: 6379            
  egress:             ##我能访问10.0.0.0/24网段中的5978 TCP端口。 
    - to:
        - ipBlock:             
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 5978

3.2 测试案例

案例1:拒绝命名空间下所有Pod出入站流量

  • 需求:拒绝test命名空间下所有Pod入、出站流量。
  • 解读:test命名空间下的pod不能访问别人,也不允许让别人访问test命名空间下的所有pod。

1.创建test命名空间,并生成一个deploy,名为nginx,在defalue空间生成一个测试pod,名为bs。

[root@k8s-master1 networkpolicy]# kubectl  create ns test
[root@k8s-master1 networkpolicy]# kubectl  create deployment nginx --image=nginx  -n test 
[root@k8s-master1 networkpolicy]# kubectl  run bs --image=busybox -- sleep 24h

2.此时bs容器可以ping通nginx网络。
在这里插入图片描述
3.编写yaml文件,生成网络策略。

[root@k8s-master1 networkpolicy]# cat network1.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: qingjun1
  namespace: test
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
[root@k8s-master1 networkpolicy]# kubectl  apply -f network1.yaml

4.此时再用bs就ping不同nginx的网络。
在这里插入图片描述

案例2:拒绝其他命名空间pod访问

  • 需求:test命名空间下所有pod可以互相访问,也可以访问其他命名空间Pod,但其他命名空间不能访问test命名空间Pod。
  • 解读:test命名空间的pod可以访问别人,但别人不能访问它。

1.生成网络策略。

[root@k8s-master1 networkpolicy]# cat network2.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: qingjun2
  namespace: test
spec:
  podSelector: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector: {}   # 匹配test命名空间所有pod,其他所有命名空间下的pod都不能访问我。

[root@k8s-master1 networkpolicy]# kubectl  apply -f network2.yaml 

2.测试效果。

在这里插入图片描述

案例3:允许其他命名空间pod访问指定应用

  • 需求:允许其他命名空间访问test命名空间里的指定pod,但test命名空间的其他pod不能访问这个指定的pod。
  • 解读:默认情况下是能访问test命名空间的pod,所以可以叠加使用两个网络策略。

1.生成第一个网络策略,允许所有命名空间下的pod可以访问test命名空间下的带有标签为app=nginx的pod。

[root@k8s-master1 networkpolicy]# cat network3.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: qingjun3
  namespace: test
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector: {}    # 匹配所有命名空间的pod

[root@k8s-master1 networkpolicy]# kubectl  apply -f network3.yaml 

2.再添加第二个策略,禁止所有流量进出。此时两个网络策略共同起作用。

[root@k8s-master1 networkpolicy]# cat network1.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: qingjun1
  namespace: test
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress

[root@k8s-master1 networkpolicy]# kubectl apply -f network1.yaml 

在这里插入图片描述
3.测试效果,其他命名空间下的pod可以访问text命名空间下标签为app=nginx的pod,同时test命名空间下的其他pod不能访问text命名空间下标签为app=nginx的pod。
在这里插入图片描述

案例4:同一个命名空间下应用之间限制访问

需求:将test命名空间中标签为app=nginx的pod隔离,只允许text命名空间下的标签为run=client1的pod访问它的80端口,其他命名空间的所有pod都不能访问。

1.生成网络策略。

[root@k8s-master1 networkpolicy]# cat network4.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: qingjun4
  namespace: test
spec:
  podSelector:
    matchLabels:
      app: nginx
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              run: client1
      ports:
        - protocol: TCP
          port: 80

          
[root@k8s-master1 networkpolicy]# kubectl  apply  -f network4.yaml 

2.测试效果。带有run=client1标签的pod可以访问到app=nginx标签的pod,带有run=bs标签的pod访问不了app=nginx标签的pod。

在这里插入图片描述

案例5:只允许指定命名空间中的应用访问

需求:限制dev命名空间标签为env=dev的pod,只允许prod命名空间中的pod访问,并且允许所有命名空间run=client1标签pod访问。

1.创建dev、prod命名空间,并在其下面创建2个pod。

[root@k8s-master1 networkpolicy]# kubectl  create ns dev
[root@k8s-master1 networkpolicy]# kubectl create  ns prod

[root@k8s-master1 networkpolicy]# kubectl  run bs --image=busybox -n prod   -- sleep 24h 
[root@k8s-master1 networkpolicy]# kubectl  create deployment dev --image=nginx -n dev 

在这里插入图片描述
2.生成网络策略。

[root@k8s-master1 networkpolicy]# cat network5.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: qingjun5
  namespace: dev
spec:
  podSelector:
    matchLabels:
      env: dev
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:                 # 既允许prod命名空间中的pod访问。
            matchLabels:
              kubernetes.io/metadata.name: prod
        - namespaceSelector: {}             # 也允许所有命名空间下pod标签为app=client1的pod访问。
          podSelector:
            matchLabels:
              run: client1

[root@k8s-master1 networkpolicy]# kubectl  apply -f network5.yaml 

3.测试效果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

案例6:限制端口范围

需求:允许名字空间default中所有带有标签 role=db 的pod使用TCP协议与 10.0.0.0/24 范围内的 IP 通信,只要目标端口介于 32000 和 32768 之间就可以。

1.编写策略。

注意事项:

  • endPort 字段必须等于或者大于 port 字段的值
  • 只有在定义了 port 时才能定义 endPort。
  • 两个字段的设置值都只能是数字。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: multi-port-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
    - Egress
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/24
      ports:
        - protocol: TCP
          port: 32000
          endPort: 32768

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

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

相关文章

20 KVM管理虚拟机-虚拟机生命周期示例

文章目录 20 KVM管理虚拟机-虚拟机生命周期示例20.1 创建虚拟机20.2 启动虚拟机20.3 重启虚拟机20.4 关闭虚拟机20.5 销毁虚拟机 20 KVM管理虚拟机-虚拟机生命周期示例 本节给出虚拟机生命周期管理相关命令的示例。 20.1 创建虚拟机 虚拟机XML配置文件为openEulerVM.xml # …

shellCode免杀技巧

目录 一、免杀简述 二、免杀方法 1.shellcode反转bypass 2.shellcode异或bypass 3.远程加载shellcode bypass 4.进程注入 5.未导出api bypass 6.掩日(进程注入工具) 其他的 本文章仅提供学习,切勿将其用于不法手段! 一、…

《编码——隐匿在计算机软硬件背后的语言》精炼——第17章(自动操作)

夫道成于学而藏于书,学进于振而废于穷。 文章目录 完善加法器加入代码的加法器扩大加数范围自由调用地址的加法器合并代码RAM和数据RAMJump指令硬件实现条件Jump指令零转移的硬件实现条件Jump指令的例子 总结 完善加法器 我们在第14章介绍了一个可以进行连加的加法…

在线域名批量查询工具-未注册域名批量查询软件

在线域名批量查询工具 在线域名批量查询工具是一种通过互联网进行批量查询域名相关信息和指标的工具。以下是其主要特点: 在线查询:在线域名批量查询工具可以直接在浏览器中进行查询,无需下载和安装任何软件。 批量查询:该工具…

内网渗透--frp代理设置与proxychains代理设置

标题内网渗透–frp代理设置与proxychains代理设置 内网服务器内网IP地址外网IP地址内网web服务器(windows 7)192.168.52.143192.168.213.138内网域控服务器192.168.52.138 外网服务器外网IP地址外网V8网卡外网kali192.168.213.132外网windows攻击机192…

开通小程序账号

文章目录 一、开通小程序账号1.1 登录微信公众平台注册小程序管理员账号1.2 激活邮箱1.3 信息登记 二、获取开发设置2.1 获取APP ID2.2 获取AppSecret 一、开通小程序账号 微信小程序已经成为移动应用开发的热门平台之一,许多开发者都想要开发自己的小程序。但是首先我们需要注…

Pandas中的逻辑运算符(与或非)及Python代码示例

Pandas是Python中一个非常流行的用于数据处理和分析的库,它提供了大量的函数和操作符,以便用户可以方便地对数据进行操纵。其中逻辑运算符是在Pandas中经常使用的一些操作符之一,因为它们使我们可以对数据进行逻辑上的比较和筛选。本篇博客将…

【Dart】=> [01] Dart基础-下载安装环境配置

目录 windows下载安装地址1. 下载dart-sdk并且解压到某盘符目录下2. 找到bin目录,复制bin目录完整路径3. 打开我的电脑,右键菜单,点击属性4. 找到高级系统设置,点击5. 点击环境变量![在这里插入图片描述](https://img-blog.csdnim…

串口监控的几种方式

目录 方法1. 使用usb转TTL模块硬件监控; 方法2. 使用JLINK的SWD接口的串口收发脚进行硬件监控; 方法3. 使用虚拟串口进行软件监控; 方法1. 使用usb转TTL模块硬件监控; 方法2. 使用JLINK的SWD接口的串口收发脚进行硬件监控&…

第十二章 使用Bind提供域名解析服务

文章目录 第十二章 使用Bind提供域名解析服务一、DNS域名解析服务1、DNS简介2、服务器类型3、13台根DNS服务器的具体信息 二、安装Bind服务程序1、Bind简介2、Bind安装3、关键配置文件4、修改主配置文件5、正向解析实验(1)、编辑区域配置文件&#xff08…

必须了解的内存屏障

目录 一,内存屏障1,概念2,内存屏障的效果3,cpu中的内存屏障 二,JVM中提供的四类内存屏障指令三,volatile 特性1,保证内存可见性定义2,禁止指令重排序3,不保证原子性 一&a…

Http与Https 比较

目录 1、HTTP(HyperText Transfer Protocol:超文本传输协议) 2、HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议) 3、HTTP 与 HTTPS 区别 4、HTTPS 的工作原理 1、HTTP(HyperTex…

MySQL---存储过程(局部变量、用户变量、系统变量(全局变量、会话变量)、传参(in、out、inout))

1. 存储过程特性 存储过程就是数据库 SQL 语言层面的代码封装与重用。 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现 复杂的逻辑功能; 函数的普遍特性:模块…

全球特种无人机市场规模逐渐扩大,预计今年将突破120亿美元

翱翔于空中是人们长久的追求,1903年,莱特兄弟发明了第一家螺旋桨飞机,这次飞行标志着飞机时代的开始。科技发展到今天,无人机(英文简称为“UAV”)作为一种高科技产品已经逐渐走进人们的生活中。 无人机技术…

如何解决浏览器跨域问题?

浏览器判断是跨域请求会在请求头上添加origin,表示这个请求来源哪里。比如: Plaintext GET / HTTP/1.1 Origin: http://localhost:8601服务器收到请求判断这个Origin是否允许跨域,如果允许则在响应头中说明允许该来源的跨域请求,…

【windows批处理batch】批处理batch字符串处理相关操作(字符串定义、分割、拼接、替换、切片、查找)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、…

从万和电气看民企如何获得“新增长”

改革开放至今,中国民营企业在经过蒙眼狂奔的三十多年后,普遍迎来发展难题: 1,第一代创业者普遍进入退休年龄,面临代际传承问题; 2,民营企业尤其是偏传统行业的企业,如何在新的行业…

基于SSM的高校图书借阅管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

mybatis-plus基本使用流程以及进阶操作

参考 https://www.bilibili.com/video/BV1dQ4y1A75e?p7&vd_source6346698154746eb5026e16499e253fe8 使用流程 一、 准备工作 3.引入依赖 4.插件 spring-boot-starter spring-boot-starter-test mybatis-plus-boot-starter MySQL lombok:用于简化实体类的创建…

查看 PostgreSQL 中的表定义和说明

要查看 PostgreSQL 中的表定义和说明&#xff0c;您可以使用以下命令&#xff1a; 1. 查看表定义&#xff1a; \d <table_name>例如&#xff0c;要查看 pg_extension 表的定义&#xff0c;您可以运行以下命令&#xff1a; \d pg_extension2. 查看表说明&#xff1a; …