CentOS 9安装Kubernetes(k8s)集群

news2025/7/5 12:43:26

前言

1、版本说明

系统版本:CentOS 9

k8s版本:v1.29.5

docker版本:26.1.3

harbor:v2.9.4

2、提前准备好1台虚拟机,可以参考博客:Vmware 17安装 CentOS9

3、虚拟机提前安装好docker,参考博客:CentOS7安装docker以及docker-compose

4、如果部署k8s集群的时候使用个人的镜像仓库,请提前部署好,本人使用的是harbor搭建的私有仓库,可以参考博客:搭建Harbor镜像仓库

5、集群部署参考官方文档:使用 kubeadm 创建集群 | Kubernetes 

6、集群中的网络插件安装文档参考:Calico网络插件安装

7、以下是本人4台虚拟机的ip地址以及主机名信息,其中一台为镜像仓库

节点主机名ip
主节点k8s-master192.168.65.130
节点1k8s-node1192.168.65.131
节点2k8s-node2192.168.65.132
私有镜像仓库k8s-harbor192.168.65.135

三台虚拟机环境准备

克隆3台虚拟机

我这里已经安装好了一台CentOS 9的虚拟机,并且此虚拟机已经安装好了docker环境,在此虚拟机基础上克隆出来3台。

1、开始克隆

2、直接下一步

3、选择虚拟机中的当前状态,然后点击下一步

4、选择创建完整克隆,点击下一步

5、输入虚拟机名称,选择存储位置,点击完成

 6、等待克隆完成,点击关闭

7、重复步骤1-6,克隆出另外2台虚拟机,我的另外两台虚拟机名称分别为node1和 node2,克隆完成后如下,总共3台

修改虚拟机信息

修改虚拟机的 mac地址

1、点击编辑虚拟机设置

2、硬件-----网络适配器-----高级

3、点击生成,生成新的mac地址 ,然后点击确定

 4、点击处理器,勾选虚拟化引擎,然后点击确定

5、重复步骤1-4,修改另外2台虚拟机的mac地址,勾选虚拟化选项

修改虚拟机主机名、ip地址和uuid 

1、点击开启此虚拟机,启动虚拟机,使用终端登录虚拟机

2、修改虚拟机主机名称

# 修改主机名
hostnamectl set-hostname k8s-master

# 查看主机名
hostname

3、修改虚拟机ip地址和uuid

3.1、生成UUID

uuidgen

3.2、修改网卡信息

vim /etc/NetworkManager/system-connections/ens160.nmconnection

 修改以下信息并保存,新的ip地址要在vmware分配的ip范围内

4、重新启动网卡

nmcli connection reload ens160

 5、重复步骤1-4修改另外2台虚拟机的信息

关机做快照 (可选)

1、以上操作做好之后,防止后面做集群的时候出问题,我这里先关机做个快照(关机做快照速度快),这一步并非是必须要做的,看个人情况。

2、做好快照后,记得重新启动所有虚拟机 

集群前置工作(三台机器都执行)

修改hosts

1、修改hosts,域名映射 命令如下

echo "192.168.65.130 k8s-master.com k8s-master" >> /etc/hosts
echo "192.168.65.131 k8s-node1.com k8s-node1" >> /etc/hosts
echo "192.168.65.132 k8s-node2.com k8s-node2" >> /etc/hosts
echo "192.168.65.135 k8s-harbor.com k8s-harbor" >> /etc/hosts

2、另外2台也同样操作,最终3台虚拟机的hosts如下,我这里把镜像仓库的那台机器也做了域名映射,方便后面使用

k8s-master

k8s-node1

 k8s-node2

关闭防火墙

关闭防火墙,并禁止开机自启。修改防火墙的状态后需要把docker重启下

# 关闭防火墙
systemctl stop firewalld.service

# 禁止开机自启
systemctl disable firewalld.service

# 重启docker
systemctl restart docker

docker镜像加速

registry-mirrors:镜像加速地址,我这里使用的是阿里云的镜像加速器

insecure-registries:私有仓库地址,我这里使用的是自己的harbor仓库,如果你没有使用个人仓库也可以不用加

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://******.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.65.135","k8s-harbor.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker开机自启

systemctl enable docker

安装容器运行时

转发 IPv4 并让 iptables 看到桥接流量

vm.swappiness参数记得加上,禁止交换分区 

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
vm.swappiness						= 0
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

关闭交换分区

# 临时关闭
swapoff -a

# 永久关闭  
sed -ri 's/.*swap.*/#&/' /etc/fstab

确认 br_netfilteroverlay 模块被加载

lsmod | grep br_netfilter
lsmod | grep overlay

系统变量是否被设置为 1

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

安装配置containerd

安装containerd(略过)

这一步在安装docker的时候已经安装过了,不在重复安装,安装docker的时候会安装containerd.io,具体命令如下图

下面是官方文档的参考地址

https://github.com/containerd/containerd/blob/main/docs/getting-started.md
 配置containerd

1、查看默认内容

cat /etc/containerd/config.toml

2、生成默认配置内容

containerd config default > /etc/containerd/config.toml

3、修改生成的文件内容

vim /etc/containerd/config.toml

 主要修改三个地址

1、SystemdCgroup的值改为true
SystemdCgroup = true

2、替换sandbox的镜像地址和版本
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

3、添加镜像加速
[plugins]
    [plugins."io.containerd.grpc.v1.cri".registry]
      ...
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
      # 以下内容为新添加
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
        endpoint = ["https://te2osmuz.mirror.aliyuncs.com"]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
        endpoint = ["registry.aliyuncs.com/google_containers"]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s-harbor.com"]
         endpoint = ["http://k8s-harbor.com:80"]

3.1、修改SystemdCgroup的值

3.2、修改sandbox的镜像地址和版本

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

3.3、添加私有镜像

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://te2osmuz.mirror.aliyuncs.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
  endpoint = ["registry.aliyuncs.com/google_containers"]
​​​​​​​[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s-harbor.com"]
  endpoint = ["http://k8s-harbor.com:80"]

重启containerd
systemctl daemon-reload
systemctl restart containerd
systemctl status containerd

禁用SELinux

将 SELinux 设置为 permissive 模式(相当于将其禁用)

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

安装工具

添加 Kubernetes 的 yum 仓库

关于如何设置阿里云镜像源可以参考:Kubernetes镜像

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/rpm/repodata/repomd.xml.key
EOF

安装

yum install -y kubelet kubeadm kubectl

启动kubelet 

systemctl enable kubelet && systemctl start kubelet

 查看状态

kubelet会一直重启,这是正常现象,等集群初始化好之后就可以正常启动了

systemctl status kubelet

主节点初始化 (以下操作只在主节点执行)

生成默认配置文件

kubeadm config print init-defaults > kubeadm.conf

v1.29.5版本输出内容如下:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.k8s.io
kind: ClusterConfiguration
kubernetesVersion: 1.29.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

修改配置文件内容

主要修改以下几个地方

1、advertiseAddress:改为当前主机的ip地址

2、nodeRegistration.name:改为当前主机的hostname

3、imageRepository:我这里改成自己的私人仓库地址了,如果自己有的话可以改成自己的,没有的话可以改成阿里云的镜像源地址:registry.aliyuncs.com/google_containers

4、新添加KubeletConfiguration,指定驱动类型。内容如下:

---

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd

5、serviceSubnet:这个看情况,如果自己想改的话也可以改,我这里用的默认的

6、podSubnet:指定容器的ip段 

7、kubernetesVersion:改为当前对应的版本

上传镜像到私有仓库

如果不使用私有镜像仓库的可以直接跳过这一步。直接开始下面的初始化

脚本内容如下push_images.sh

#!/bin/bash

# 登录私有仓库
res=`docker login -u $1-p $2 k8s-harbor.com`

images=$(kubeadm config images list --kubernetes-version v1.29.5 | awk -F '/' '{print $NF}')
for item in ${images}
do
  docker pull registry.aliyuncs.com/google_containers/${item}
  # 镜像重新打标签
  docker tag registry.aliyuncs.com/google_containers/${item} k8s-harbor.com/google_containers/${item}
  # 上传到私有仓库 
  docker push k8s-harbor.com/google_containers/${item}
done

赋予可执行权限

chmod +x push_images.sh

# 执行脚本,记得传入参数
./push_images <username> <password>

脚本执行结束后就可以在私有仓库中看到刚才上传的镜像了

开始初始化

kubeadm.conf:自定义的配置文件的名称

kubeadm init --config kubeadm.conf

将下面这段话复制下来,后面会用到

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.65.130:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:8eaeb4ce72361621049e32c458d0a931e6e0f6d543529287c63d1c7dc4b35c34

创建配置文件

按照初始化成功的提示开始创建配置文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装网络插件

这里安装的网络插件是Calico,官方文档

下载并执行配置文件

文件下载后要使用kubectl create 命令去执行,不要使用kubectl apply ,官方文档对这个有特别说明

wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/tigera-operator.yaml
kubectl create -f tigera-operator.yaml

wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/custom-resources.yaml

修改custom-resources.yaml

vim custom-resources.yaml

修改cidr的值

calicoNetwork:
    ipPools:
    - name: default-ipv4-ippool
      blockSize: 26
      cidr: 192.168.110.0/24 # 修改为kubeadm.conf中podSubnet的值

执行 custom-resources.yaml

kubectl create -f custom-resources.yaml

节点加入

节点node1加入

 在node1上执行以下命令

kubeadm join 192.168.65.130:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:8eaeb4ce72361621049e32c458d0a931e6e0f6d543529287c63d1c7dc4b35c34

节点node2加入 

kubeadm join 192.168.65.130:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:8eaeb4ce72361621049e32c458d0a931e6e0f6d543529287c63d1c7dc4b35c34

在master查看节点信息

 如果节点显示NotReady,则等待几分钟,等所有pod创建完成即可

所有节点加入成功

安装kubepi

我这里并没有安装官方的可视化控制面板,而是使用了另外一个可视化管理工具kubepi

下载镜像

docker pull 1panel/kubepi

 创建挂载目录

mkdir -p /root/server/kubepi

启动镜像

docker run --privileged -p 8010:80 \
--name kubepi \
-v /root/server/kubepi:/var/lib/kubepi \
--restart=unless-stopped \
-d 1panel/kubepi

访问kubepi

访问地址:ip:port 例如我的:192.168.65.130:8010

默认的账户名和密码:admin/kubepi

 导入k8s集群

点击导入按钮,配置k8s。k8s的配置信息在$HOME/.kube/config中

查看集群信息 

集群搭建过程常见问题

1、安装网络插件calico域名raw.githubusercontent.com无法访问

可以使用第三方网站查看dns对应的ip地址,然后修改自己的hosts文件,这里只是举个例子

# 修改hosts
vim /etc/hosts

# 追加以下内容
185.199.111.133 raw.githubusercontent.com

# 重新下载文件

2、no matches for kind "Installation" in version "operator.tigera.io/v1"

1、这个是在安装Calico网络插件的时候遇到的,主要原因是因为我安装的时候使用的是kubectl apply命令,将其更换为kubectl create即可 ,具体原因可以参考官网说明

2、如果不是因为执行命令的问题,就是Calico版本不匹配,更换为合适的版本即可

3、机器重启后kubelet起不起来

1、看下是不是之前关闭交换分区的时候只是临时关闭了(swapoff -a)具体原因可以参考报错日志,我的没启起来是因为交换分区重启后又打开了,永久关闭即可,永久关闭的命令文章中已提过。

2、确保kubelet、docker、容器运行时(containerd)已启动

补充说明

文章中有两个地方配置了镜像仓库的地址

1、docker的配置文件/etc/docker/daemon.json文件,这个是使用docker拉取镜像是使用的加速器和仓库地址

2、容器运行时containerd的配置/etc/containerd/config.toml文件,因为这里使用的容器运行时是containerd,所以k8s拉取镜像的时候不会使用docker命令,而是使用crictl命令,所以k8s拉取镜像的时候会使用config.toml文件中关于镜像相关的配置

结束语

以上便是k8s集群的整个部署过程,部署过程中需要下载镜像信息,可以使用给的脚本将其提前下载下来 ,对于k8s的网络插件官方文档提供了多种,可以根据情况自行安装其中一个即可。最重要的一点要保证kubelet、docker、容器运行时(containerd)设置为开机自启。可以使用命令查看是否开启开机自启:systemctl is-enabled <服务名称>

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

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

相关文章

Python 实现乘数加密法

乘数加密是简单代替密码的一种。乘数加密法脱胎于凯撒加密法,加密和解密符号设计把他们转换成数字,加上或者减去密钥,然后把新的数字转换回符号,当我们把加减密钥变成乘以密钥,就是乘法加密法。有关凯撒加密法可以看之前的文章《Python实现凯撒加解密》。 加密过程 乘数加…

二叉树练习题(2024/6/5)

1翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]…

电子电气架构 —— 刷写模式:并行刷写

电子电气架构 —— 刷写模式:并行刷写 我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此…

C++ : 模板初阶

标题&#xff1a;C : 模板初阶 水墨不写bug 正文开始&#xff1a; C语言的问题 &#xff1a; 写不完的swap函数 在学习C语言时&#xff0c;我们有一个经常使用的函数swap函数&#xff0c;它可以将两个对象的值交换。 我们通常这样实现它&#xff1a; void swap(int t1,int t2)…

【网络协议 | HTTP】HTTP总结与全梳理(一) —— HTTP协议超详细教程

&#x1f525;博客简介&#xff1a;开了几个专栏&#xff0c;针对 Linux 和 rtos 系统&#xff0c;嵌入式开发和音视频开发&#xff0c;结合多年工作经验&#xff0c;跟大家分享交流嵌入式软硬件技术、音视频技术的干货。   ✍️系列专栏&#xff1a;C/C、Linux、rtos、嵌入式…

【微信小程序】模板语法

数据绑定 对应页面的 js 文件中 定义数据到 data 中&#xff1a; 在页面中使用 {{}} 语法直接使用&#xff1a; 事件绑定 事件触发 常用事件&#xff1a; 事件对象的属性列表&#xff08;事件回调触发&#xff0c;会收到一个事件对象 event&#xff0c;它的详细属性如下&…

28 hive安装-本地模式

1.安装mysql&#xff08;参考文章&#xff1a;centos7.8安装Mysql8.4-CSDN博客&#xff09; 2.将mysql驱动拷贝到/opt/module/hive/lib目录下 &#xff08;直接windows通过finalShell上传&#xff09; 3./opt/module/hive/conf目录下新建hive-site.xml文件&#xff0c;进行配置…

InvokeAI 最新版安装指南

由于stable diffusion webui不太好安装&#xff0c;或者你使用一些SD整合包&#xff0c;可免除复杂安装&#xff0c;但你认为SD的操作界面太复杂&#xff0c;所以今天介绍一款支持新手一键安装的Stable Diffusion工具包InvokeAI。 1.什么是InvokeAI InvokeAI 是一个创新的开源…

点量3D实时云渲染平台:三步轻松实现云流化

3D实时云渲染技术通过在云端执行3D渲染任务&#xff0c;并将渲染结果实时传送到用户端&#xff0c;它不仅降低了用户的硬件要求&#xff0c;还提高了数据处理的安全性和效率&#xff0c;为用户提供了高效的体验。 可以通过下载“点量云流服务单机版”进行低延时、高画质、沉浸…

vivado BEL

描述 通常&#xff0c;BEL或基本元素对应于设计的网表视图中的叶单元。 BEL是目标Xilinx FPGA上的设备对象&#xff0c;用于放置或映射基本网表 触发器、LUT和进位逻辑等对象。 BEL在SITE对象&#xff08;如SLICE和IO块&#xff09;中的设备上分组在一起 &#xff08;IOB&#…

kafka-消费者服务搭建配置简单消费(SpringBoot整合Kafka)

文章目录 1、使用efak 创建 主题 my_topic1 并建立6个分区并给每个分区建立3个副本2、创建生产者发送消息3、application.yml配置4、创建消费者监听器5、创建SpringBoot启动类6、屏蔽 kafka debug 日志 logback.xml7、引入spring-kafka依赖 1、使用efak 创建 主题 my_topic1 并…

VS2022,lib调用dll工程的一个函数

lib工程本身是一个静态库工程&#xff0c;没有链接器设置。然而&#xff0c;我们依然可以在lib工程中调用DLL工程中的函数&#xff0c;只需要确保头文件正确导入&#xff0c;并在最终使用lib的可执行文件项目中正确链接DLL的.lib文件。下面是一个详细的步骤说明&#xff1a; 假…

做自媒体素材哪里找?做自媒体必备的几个高质量素材网站分享

在自媒体的世界里&#xff0c;内容是王道。无论是视频还是文章&#xff0c;优秀的自媒体作品都需要有力的内容和高质量的素材作支撑。今天&#xff0c;我为大家整理了一些优质的素材网站&#xff0c;帮助每一位自媒体创作者&#xff0c;无论新手还是老手&#xff0c;都能找到适…

Vuforia AR篇(七)— 二维码识别

目录 前言一、什么是Barcode &#xff1f;二、使用步骤三、点击二维码显示信息四、效果 前言 在数字化时代&#xff0c;条形码和二维码已成为连接现实世界与数字信息的重要桥梁。Vuforia作为领先的AR开发平台&#xff0c;提供了Barcode Scanner功能&#xff0c;使得在Unity中实…

正则表达式运用

已经写了表达式&#xff0c;下一步就是匹配字符串得到结果 使用matcher的源码&#xff08;匹配&#xff09;普通方法&#xff0c;find&#xff08;寻找&#xff09;合适的代码&#xff0c;看字符串是否匹配成功 是否可以匹配上 匹配么&#xff0c;匹配就留下&#xff0c;fin…

DBeaver连接Elasticsearch

一、下载DBeaver 二、连接&#xff1a; 1、一定要选择开源的 Open Distro Elasticsearch 2、填写地址&#xff1a; 3、选择“URL”&#xff0c;将https改为http 否则会报SSL错误 4、测试连接

python学习笔记-05

函数 基本上所有的高级语言都支持函数&#xff0c;函数就是一种代码抽象的方式。之前所使用的len、print等都是python的内置函数。 1.初识函数 在编写程序过程中&#xff0c;如果一段代码经常出现&#xff0c;为了提高编写效率&#xff0c;将这类实现某个功能的代码作为一个…

【网络安全】Web安全基础 - 第二节:前置基础知识- HTTP协议,握手协议,Cookie及Session

本章节主要介绍一些基础知识 d(^_^o) HTTP协议 什么是HTTP 超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。 HTTP是一个基于请求与响应&#xff0c;无状态的&#xff0c;应用层协议&#xff0c;…

推荐系统学习 一

参考&#xff1a;一文看懂推荐系统&#xff1a;召回08&#xff1a;双塔模型——线上服务需要离线存物品向量、模型更新分为全量更新和增量更新_数据库全量更新和增量更新流程图-CSDN博客 一文看懂推荐系统&#xff1a;概要01&#xff1a;推荐系统的基本概念_王树森 小红书-CSD…

Web网站攻击技术

文章目录 Web应用体系结构脆弱性分析HTTP协议安全问题Cookie的安全问题 常见Web应用攻击及防范SQL注入攻击及防范SQL注入原理 防御注入漏洞跨站脚本(XSS)攻击及防范跨站脚本(XSS)攻击原理 跨站脚本攻击类型储存式XSS反射式XSSDOM式XSS Cookie欺骗及防范CSRF攻击及防范防御CSRF攻…