参考文档:
https://blog.csdn.net/red_sky_blue/article/details/131107273
https://blog.csdn.net/HappyLearnerL/article/details/129080317
https://zahui.fan/posts/lq0y87n5/
https://blog.csdn.net/engchina/article/details/129776809
https://zhuanlan.zhihu.com/p/668795734
https://blog.csdn.net/weixin_43968988/article/details/124285995
设置主机名
1timedatectl set-timezone Asia/Shanghai
设置时区
1hostnamectl set-hostname master.com
设置静态ip(/etc/NetworkManager/system-connections)
almalinux9.x 放弃了 老的网络配置方式;新的配置文件位于:
/etc/NetworkManager/system-connections(文件名可能各不相同)
注意先备份默认配置文件,然后再进行修改;修改后的内容如下:
1[connection]
2id=ens33
3uuid=c2e8f9fc-85a7-3af4-aaf0-3c3687f73632
4type=ethernet
5autoconnect-priority=-999
6interface-name=enp0s25
7timestamp=1704078368
8[ethernet]
9[ipv4]
10address1=192.168.0.91/24,192.168.0.1
11dns=114.114.114.114;8.8.8.8;
12method=manual
13[ipv6]
14addr-gen-mode=default
15method=auto
16[proxy]
设置hosts:
vim /etc/hosts,添加如下内容:
1192.168.0.91 master.com
关闭防火墙
1systemctl disable firewalld
2systemctl stop firewall
关闭 SELINUX
1setenforce 0
2sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
修改ssh配置
vim /etc/ssh/sshd_config
修改如下内容:
PermitRootLogin yes
PasswordAuthentication yes
永久关闭swap
1vim /etc/fstab
把swap所在的行注释
临时关闭swap
1swapoff -a
系统启动时加载内核模块
1cat <<EOF > /etc/modules-load.d/k8s.conf
2overlay
3br_netfilter
4ip_tables
5iptable_filter
6EOF
将桥接的IPV4流量传递到iptables的链
1cat > /etc/sysctl.d/k8s.conf <<EOF
2net.bridge.bridge-nf-call-ip6tables = 1
3net.bridge.bridge-nf-call-iptables = 1
4net.ipv4.ip_forward = 1
5EOF
应用规则:
1sysctl --system
安装Docker
1yum install -y yum-utils
2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3yum install -y docker-ce docker-ce-cli
docker配置国内源
mkdir -p /etc/docker
vim /etc/docker/daemon.json
内容如下:
1{
2 "exec-opts": ["native.cgroupdriver=systemd"],
3 "data-root": "/home/zhangcong/dev/docker",
4 "dns": ["8.8.8.8","114.114.114.114"],
5 "live-restore":true,
6 "registry-mirrors":["https://registry.docker-cn.com",
7"https://hub-mirror.c.163.com",
8"https://docker.mirrors.ustc.edu.cn"
9]
10}
设置开机启动
systemctl enable docker
systemctl start docker
安装containerd
1yum install -y containerd.io
从yum源安装的containerd默认禁用了cri,可以使用命令重新生成默认配置:
1containerd config default > /etc/containerd/config.toml
修改Containerd配置文件
vim /etc/containerd/config.toml
查找 disabled_plugins,发现其值为:[],说明已经没有禁用cri了
查找 sandbox_image,修改 registry.k8s.io/pause:3.6 为 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
查找 plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options 项,在下面修改 SystemdCgroup = true
查找 [plugins.“io.containerd.grpc.v1.cri”.registry.mirrors],在其下面添加国内镜像源:
1 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
2 endpoint = ["https://registry.cn-hangzhou.aliyuncs.com"]
- 自定义镜像存储的配置路径(可选,如果空间不够可更新该配置)
root = “/var/lib/containerd”
state = “/run/containerd”
其中:
root 是用来保存持久化数据,包括 Snapshots, Content, Metadata 以及各种插件的数据,每一个插件都有自己单独的目录,Containerd 本身不存储任何数据,它的所有功能都来自于已加载的插件。
state 是用来保存运行时的临时数据的,包括 sockets、pid、挂载点、运行时状态以及不需要持久化的插件数据。
总的示例如下:
1disabled_plugins = []
2......
3 sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6"
4......
5 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
6......
7SystemdCgroup = true
8......
9 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
10 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
11 endpoint = ["https://registry.cn-hangzhou.aliyuncs.com"]
12......
启动Containerd服务
1systemctl enable containerd
2systemctl restart containerd
安装kubelet,kubeadm,kubectl
添加阿里云的k8s软件源
1cat <<EOF > /etc/yum.repos.d/kubernetes.repo
2[kubernetes]
3name=Kubernetes
4baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
5enabled=1
6gpgcheck=1
7repo_gpgcheck=1
8gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
9EOF
重建缓存:yum makecache
查看可用的kubernetes版本:yum list kubectl –showduplicates | sort -r
安装最新版(如果执行过程中出现: XXXX.rpm 的公钥尚未安装,加上 –nogpgcheck 参数)
1yum install -y kubelet kubeadm kubectl
或者指定版本安装,例如:yum install -y kubelet-1.23.0-0 kubeadm-1.23.0-0 kubectl-1.23.0-0
运行,并设置开机启动
1systemctl enable kubelet && systemctl start kubelet
查看安装版本
1kubectl version
2kubeadm version
3kubelet --version
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
1[root@k8s-node1 ~]# kubeadm config images list
2registry.k8s.io/kube-apiserver:v1.28.2
3registry.k8s.io/kube-controller-manager:v1.28.2
4registry.k8s.io/kube-scheduler:v1.28.2
5registry.k8s.io/kube-proxy:v1.28.2
6registry.k8s.io/pause:3.9
7registry.k8s.io/etcd:3.5.9-0
8registry.k8s.io/coredns/coredns:v1.10.1
k8s.gcr.io 被墙,无法连接,下面提供了一种替代方案:
创建 init-k8s-images.sh,内容如下:
1#!/bin/bash
2images=(
3 kube-apiserver:v1.28.2
4 kube-controller-manager:v1.28.2
5 kube-scheduler:v1.28.2
6 kube-proxy:v1.28.2
7 pause:3.9
8 etcd:3.5.9-0
9 coredns:v1.10.1
10)
11for imageName in ${images[@]} ; do
12 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
13 #docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
14 #docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
15done
k8s 初始化
1kubeadm init \
2--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
3--apiserver-advertise-address=192.168.0.91 \
4--kubernetes-version=v1.28.2 \
5--service-node-port-range=30000-39999 \
6--service-cidr=10.96.0.0/12 \
7--pod-network-cidr=10.244.0.0/16
–apiserver-advertise-address 本机ip,即网卡的地址
–image-repository 国内仓库
–kubernetes-version 指定k8s版本
–service-node-port-range为nodeport分配端口的指定范围(可选;默认30000-32767)
–service-cidr 服务使用IP地址的替代范围
–pod-network-cidr 指定Pod网络的IP地址范围。如果设置,控制平面将自动为每个节点分配CIDR
正常情况返回如下内容:
1......
2Your Kubernetes control-plane has initialized successfully!
3To start using your cluster, you need to run the following as a regular user:
4mkdir -p $HOME/.kube
5sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
6sudo chown $(id -u):$(id -g) $HOME/.kube/config
7Alternatively, if you are the root user, you can run:
8export KUBECONFIG=/etc/kubernetes/admin.conf
9You should now deploy a pod network to the cluster.
10Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
11https://kubernetes.io/docs/concepts/cluster-administration/addons/
12Then you can join any number of worker nodes by running the following on each as root:
13kubeadm join 192.168.0.91:6443 --token uoh2m9.lvimwlrvjbh82t8h
14--discovery-token-ca-cert-hash sha256:ac54e20399b7fa87d7469b761c0a27ea4a64bcb828fe9d69c0e1654efe8a8bb4
如果初始化失败,查看错误:
1journalctl -xeu kubelet
如果提示:Unable to register node “xxxxxxxx” with API server: Unauthorized
说明 /var/lib/kubelet/pki 中的 kubelet-client-current.pem 证书不对,通过下面的命令重新生成 kubelet 证书:
1kubeadm init phase kubeconfig kubelet
可执行下面的步骤后再次重新初始化:
1# 删除进程:
2kill -9 <kubelet 进程>
3
4# 删除配置文件:
5rm -rf /etc/kubernetes/*
6rm -rf /var/lib/etcd
7
8# 重启服务等:
9swapoff -a && kubeadm reset && systemctl daemon-reload && systemctl restart kubelet && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
在master节点上安装POD网络插件(CNI):
1kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看k8s状态:
1[zhangcong@master k8s]$ kubectl get nodes
2NAME STATUS ROLES AGE VERSION
3master.com Ready control-plane 39m v1.28.2
Ready 表示正常
查看node的信息
1[zhangcong@master k8s]$ kubectl describe nodes master.com
2Name: master.com
3Roles: control-plane
4Labels: beta.kubernetes.io/arch=amd64
5 beta.kubernetes.io/os=linux
6 kubernetes.io/arch=amd64
7 kubernetes.io/hostname=master.com
8 kubernetes.io/os=linux
9 node-role.kubernetes.io/control-plane=
10 node.kubernetes.io/exclude-from-external-load-balancers=
11Annotations: flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"6a:60:51:5b:6e:93"}
12 flannel.alpha.coreos.com/backend-type: vxlan
13 flannel.alpha.coreos.com/kube-subnet-manager: true
14 flannel.alpha.coreos.com/public-ip: 192.168.0.91
15 kubeadm.alpha.kubernetes.io/cri-socket: unix:///var/run/containerd/containerd.sock
16 node.alpha.kubernetes.io/ttl: 0
17 volumes.kubernetes.io/controller-managed-attach-detach: true
18CreationTimestamp: Fri, 05 Jan 2024 23:01:47 +0800
19Taints: node-role.kubernetes.io/control-plane:NoSchedule
20Unschedulable: false
21Lease:
22 HolderIdentity: master.com
23 AcquireTime: <unset>
24 RenewTime: Fri, 05 Jan 2024 23:53:31 +0800
25Conditions:
26 Type Status LastHeartbeatTime LastTransitionTime Reason Message
27 ---- ------ ----------------- ------------------ ------ -------
28 NetworkUnavailable False Fri, 05 Jan 2024 23:38:01 +0800 Fri, 05 Jan 2024 23:38:01 +0800 FlannelIsUp Flannel is running on this node
29 MemoryPressure False Fri, 05 Jan 2024 23:53:22 +0800 Fri, 05 Jan 2024 23:01:44 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
30 DiskPressure False Fri, 05 Jan 2024 23:53:22 +0800 Fri, 05 Jan 2024 23:01:44 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
31 PIDPressure False Fri, 05 Jan 2024 23:53:22 +0800 Fri, 05 Jan 2024 23:01:44 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
32 Ready True Fri, 05 Jan 2024 23:53:22 +0800 Fri, 05 Jan 2024 23:38:03 +0800 KubeletReady kubelet is posting ready status
33Addresses:
34 InternalIP: 192.168.0.91
35 Hostname: master.com
36Capacity:
37 cpu: 4
38 ephemeral-storage: 71616Mi
39 hugepages-2Mi: 0
40 memory: 15942096Ki
41 pods: 110
42Allocatable:
43 cpu: 4
44 ephemeral-storage: 67585336823
45 hugepages-2Mi: 0
46 memory: 15839696Ki
47 pods: 110
48System Info:
49 Machine ID: d148657499e14e37b1f6d56535aabe61
50 System UUID: f82d5cc0-1c64-2d18-aaa1-203040506099
51 Boot ID: c4d76a54-aa59-4922-ad31-dc3f92aa3ace
52 Kernel Version: 5.14.0-362.13.1.el9_3.x86_64
53 OS Image: AlmaLinux 9.3 (Shamrock Pampas Cat)
54 Operating System: linux
55 Architecture: amd64
56 Container Runtime Version: containerd://1.6.26
57 Kubelet Version: v1.28.2
58 Kube-Proxy Version: v1.28.2
59PodCIDR: 10.244.0.0/24
60PodCIDRs: 10.244.0.0/24
61Non-terminated Pods: (8 in total)
62 Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
63 --------- ---- ------------ ---------- --------------- ------------- ---
64 kube-flannel kube-flannel-ds-8cd6j 100m (2%) 0 (0%) 50Mi (0%) 0 (0%) 17m
65 kube-system coredns-6554b8b87f-924js 100m (2%) 0 (0%) 70Mi (0%) 170Mi (1%) 51m
66 kube-system coredns-6554b8b87f-nx7w9 100m (2%) 0 (0%) 70Mi (0%) 170Mi (1%) 51m
67 kube-system etcd-master.com 100m (2%) 0 (0%) 100Mi (0%) 0 (0%) 51m
68 kube-system kube-apiserver-master.com 250m (6%) 0 (0%) 0 (0%) 0 (0%) 51m
69 kube-system kube-controller-manager-master.com 200m (5%) 0 (0%) 0 (0%) 0 (0%) 51m
70 kube-system kube-proxy-gp5rz 0 (0%) 0 (0%) 0 (0%) 0 (0%) 51m
71 kube-system kube-scheduler-master.com 100m (2%) 0 (0%) 0 (0%) 0 (0%) 51m
72Allocated resources:
73 (Total limits may be over 100 percent, i.e., overcommitted.)
74 Resource Requests Limits
75 -------- -------- ------
76 cpu 950m (23%) 0 (0%)
77 memory 290Mi (1%) 340Mi (2%)
78 ephemeral-storage 0 (0%) 0 (0%)
79 hugepages-2Mi 0 (0%) 0 (0%)
80Events:
81 Type Reason Age From Message
82 ---- ------ ---- ---- -------
83 Normal Starting 51m kube-proxy
84 Normal Starting 51m kubelet Starting kubelet.
85 Warning InvalidDiskCapacity 51m kubelet invalid capacity 0 on image filesystem
86 Normal NodeAllocatableEnforced 51m kubelet Updated Node Allocatable limit across pods
87 Normal NodeHasNoDiskPressure 51m (x7 over 51m) kubelet Node master.com status is now: NodeHasNoDiskPressure
88 Normal NodeHasSufficientPID 51m (x7 over 51m) kubelet Node master.com status is now: NodeHasSufficientPID
89 Normal NodeHasSufficientMemory 51m (x8 over 51m) kubelet Node master.com status is now: NodeHasSufficientMemory
90 Normal Starting 51m kubelet Starting kubelet.
91 Warning InvalidDiskCapacity 51m kubelet invalid capacity 0 on image filesystem
92 Normal NodeHasSufficientMemory 51m kubelet Node master.com status is now: NodeHasSufficientMemory
93 Normal NodeHasNoDiskPressure 51m kubelet Node master.com status is now: NodeHasNoDiskPressure
94 Normal NodeHasSufficientPID 51m kubelet Node master.com status is now: NodeHasSufficientPID
95 Normal NodeAllocatableEnforced 51m kubelet Updated Node Allocatable limit across pods
96 Normal RegisteredNode 51m node-controller Node master.com event: Registered Node master.com in Controller
97 Normal NodeReady 15m kubelet Node master.com status is now: NodeReady
98[zhangcong@master k8s]$
解除master节点不能跑pod
默认k8s的master节点是不能跑pod的业务,原理就是为每个主节点设置污点。
查看是否有污点:
1[zhangcong@master ~]$ kubectl describe node master.com | grep Taints
2Taints: node-role.kubernetes.io/control-plane:NoSchedule
解除某个node不能跑pod的限制:
1[zhangcong@master ~]$ kubectl taint node master.com node-role.kubernetes.io/control-plane:NoSchedule-
将 Master 恢复成 Master Only 状态:
1[zhangcong@master ~]$ kubectl taint node master.com node-role.kubernetes.io/control-plane:NoSchedule
说明:master.com 是节点的名字
安装 Kubernetes Dashboard。
下载:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
为了可以在集群外面访问,我们把recommended.yaml里访问方式调整为nodeport
再执行apply部署 Kubernetes-Dashboard v2.7.0
1kubectl apply -y recommended.yaml
部署完成后,可以在地址栏访问了:https://192.168.0.91:32678
页面上提示需要token,按照如下步骤生成:
1# 创建账户
2[zhangcong@master k8s]$ kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
3
4
5# 查看账户信息
6[zhangcong@master k8s]$ kubectl get serviceaccount dashboard-admin -o yaml -n kubernetes-dashboard
7
8
9
10
11# 绑定角色
12[zhangcong@master k8s]$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin -n kubernetes-dashboard
13
14
15
16# 生成临时token(这个token是临时的,长时间不操作会退出登录)
17[zhangcong@master k8s]$ kubectl create token dashboard-admin -n kubernetes-dashboard
18eyJhbGciOiJSUzI1NiIsImtpZCI6IkZidmppeHJDcHEydk83REM1Z0JZZFpJQ3JJRUsxbFZSaHNzSFl6TElhQ1kifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA0NzAzMTkyLCJpYXQiOjE3MDQ2OTk1OTIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJkYXNoYm9hcmQtYWRtaW4iLCJ1aWQiOiI0ODhkZjliMi0xMzE4LTQyODAtODA5OC1lM2M0YTI4MDY2YTEifX0sIm5iZiI6MTcwNDY5OTU5Miwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.sPtX5L-O7jyvKZV0X_eXuX7g2OC9sx4PxOfRM5eKR6Ym0n0NtyR6AED1PcSjispGE1ZQbsllDdDldMx54lSl-rdVt16s7wKRl8Hp-1CY48ztiAQSVkBDQAwAMuEBLAxekKx5VYZmr3RVA-Edwh3PJ7oRO-Eu2i6fprasIRWqMapp0RFQwgNEeeVZj4hzihoB8Y8FHHL-hVafwsNyHZ2MDPhad2WQ4QiqNGXmzzYe2js0qraBh8d5ktaRoRtBammO0p_u70j4M-ZLYDZ93IpRDksofsHs7B4LwTB0KuII11B5WfwLuQtSp82i2LuLJXUHuLopoL-Iyo0hIaZ_zoMJQw
19
20
21# 生成永久token
22[zhangcong@master ~]$ vim dashboard-admin-secret.yaml
23apiVersion: v1
24kind: Secret
25metadata:
26 name: dashboard-admin-secret
27 namespace: kubernetes-dashboard
28 annotations:
29 kubernetes.io/service-account.name: dashboard-admin
30type: kubernetes.io/service-account-token
31
32
33
34[zhangcong@master ~]$ kubectl apply -f dashboard-admin-secret.yaml
35secret/dashboard-admin-secret created
36
37# 查看生成永久token
38[zhangcong@master ~]$ kubectl get secret -n kubernetes-dashboard
39NAME TYPE DATA AGE
40dashboard-admin-secret kubernetes.io/service-account-token 3 6s
41kubernetes-dashboard-certs Opaque 0 101d
42kubernetes-dashboard-csrf Opaque 1 101d
43kubernetes-dashboard-key-holder Opaque 2 101d
44
45[zhangcong@master ~]$ kubectl describe secret dashboard-admin-secret -n kubernetes-dashboard
46Name: dashboard-admin-secret
47Namespace: kubernetes-dashboard
48Labels: <none>
49Annotations: kubernetes.io/service-account.name: dashboard-admin
50 kubernetes.io/service-account.uid: 488df9b2-1318-4280-8098-e3c4a28066a1
51
52Type: kubernetes.io/service-account-token
53
54Data
55====
56ca.crt: 1107 bytes
57namespace: 20 bytes
58token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkZidmppeHJDcHEydk83REM1Z0JZZFpJQ3JJRUsxbFZSaHNzSFl6TElhQ1kifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tc2VjcmV0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRhc2hib2FyZC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjQ4OGRmOWIyLTEzMTgtNDI4MC04MDk4LWUzYzRhMjgwNjZhMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDpkYXNoYm9hcmQtYWRtaW4ifQ.kTnl9Z14Tm_z-ERRbs6ht9Ifo58-1Sf8TgIUfY3HGBW-Z2jjFmdCQZma-j2_gG-vy_Fpil73Nakf3hjbm2Hb7hTwbHOk-qSi0_t_qvJZYX1klXWagxN6wmZCjRWQh9Ef1-2KHBnSHFOZdiZskG28R15vX3xcedmOkc2SNwS9s8UeVkqgKmlA5jk6ofnV_Rtrc22-db4v0ITTVzzPH5akuTMbWo2HsH-8Zu7g-pBHNWZcwx5HfQzeHaFn7gjtktTxe2oV2so__P8emYs-nPq0oNJDWd61WZQ6Ogf20QK95NU1qlTXmV_pU8px0wzils8hJhALp4D_dn0byfpBbkW-4w
把生成的token复制到页面上即可进入
评论