0


【2024】k8s集群 图文详细 部署安装使用(两万字)

目录💻

一、前言

因为我只有一台服务器,我使用的是,所有我采用的是通过安装虚拟机的方式实现集群搭建,先把需要的配置环境拉取下来,然后再通过虚拟机的克隆的方式直接把配置克隆到新的服务器上,减少重复下载。
通过在ubuntu服务器上安装VMware和在MAC上安装parallels desktop都有部署成功,安装虚拟机的实体机配置内存需要够,并且需要可以连接🛜,因为需要下载一些配置依赖,因为是安装k8s集群需要安装三台ubuntu容器。当然如果是有多台服务器的话直接把安装命令都执行一遍就行

下面是我使用的配置:
信息配置节点主机Ubuntu20.4 / 22.4K8S版本1.28.1配置三台集群(内存:2G、磁盘:30G)SSH连接工具WindTerm / Tabby宿主机Ubuntu24.4 / M2虚拟机工具VMWaer / parallels desktop
ubuntu镜像(注意看后缀arm是 苹果的Apple M,Intel 的用amd): https://pan.baidu.com/s/16f1lzIqFOHlsyfzVV3lv9A?pwd=5p8a 提取码: 5p8a

WindTerm(ssh连接工具下载地址):https://github.com/kingToolbox/WindTerm/releases

二、下载依赖配置环境

1、配置系统环境

1.1、配置桥接网络

因为我们实际开发中肯定是把k8s部署在服务器上的嘛,所以需要把虚拟机内服务器的网络改为同物理机在同一网段的。所以需要在 “桥接网络”选项下的列表中选择虚拟机将要桥接的物理适配器。否则同一局域网的其他物理机都没法范围到这些虚拟机的ip

1.1.1、parallels desktop配置
  • 右击对应的虚拟机,点击配置,选择硬件中的网络,修改源为桥接网络中的默认适配器,如果有多个网络,则直接选择你想要用于外部连接的那个网络就行在这里插入图片描述
  • 通过ifconfig命令查看ip是否改为了外表局域网同一网段了在这里插入图片描述
1.1.2、VMware配置
  • 先点击网络适配器在这里插入图片描述
  • 选择第一个,然后保存退出在这里插入图片描述
  • 再右击每个主机服务器,点击设置(Settings)在这里插入图片描述
  • 选择网络,选择桥接网络,点击确认保存,然后就可以到对应的主机查看IP了在这里插入图片描述

1.2、配置root用户登陆

在创建虚拟机的时候需要先添加ssh连接,但我们创建后,是不能直接用root用户直接登陆的,虽然可以通过

sudo su

转为root,但每次都要转,也麻烦,可以通过修改配置,让直接通过root用户进行ssh登陆。

  1. 首先通过ssh工具连接上虚拟机,账号密码就是我们创建的时候设置的那个账号,然后通过sudo su切换为root管理员用户在这里插入图片描述
  2. 修改/etc/ssh/sshd_config文件配置 修改下面ssh的配置文件的,34行左右的位置(右下角可以看行数),把标注的三行的注释打开,并且把第34行改为 yesvim /etc/ssh/sshd_config·在这里插入图片描述
  3. 重制root用户的密码 把root用户的密码改为自己需要的sudo passwd root
  4. 重启ssh服务service ssh restart在这里插入图片描述
  5. 其他 如果是没有安装ssh命令,可以通过#更新软件包sudo apt update#安装sshsudo apt install openssh-server#安装ifconfig命令包(刚创建的虚拟机可能会没有)sudo apt install net-tools

2、环境配置安装下载

下面的步骤,如果是使用的下面的WindTerm的截图代表是集群的每个容器都需要执行的,如果是使用的上面的tabby的截图代表是只有master节点需要执行就行。
因为他们的配置一样,我免得都下载一遍,所以我直接一个下载好,然后通过克隆的方式直接克隆到其他的节点去,这样也避免出现一些不一样的东西

2.1、安装ipset和ipvsadm

它们在 Kubernetes (k8s) 中用于网络管理和负载均衡。

  1. 首先执行安装apt-get install ipset ipvsadm执行的时候需要你输入y确认,确认就行在这里插入图片描述
  2. 然后执行配置 ipvsadm 模块,用于开机自启动的,可以使用vi /etc/modules-load.d/ipvs.conf查看是否配置成功cat << EOF |tee/etc/modules-load.d/ipvs.confip_vsip_vs_rrip_vs_wrrip_vs_shnf_conntrackEOF在这里插入图片描述
  3. 因为本次也需要启动,所以需要在配置一个脚本用于本次启动的 配置脚本文件cat << EOF |tee ipvs.sh#!/bin/shmodprobe -- ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe -- nf_conntrackEOF执行刚刚创建的脚本sh ipvs.sh
  4. 通过下面的命令查看是否配置成功lsmod | grep ip_vs如下图,就表示加载成功了在这里插入图片描述

2.2、关闭SWAP分区

直接通过修改

/etc/fstab

文件,永久关闭SWAP分区,避免重启时打开

  • 永久关闭vim /etc/fstab打开后,把最后一行/swap.img开头的注释调就行在这里插入图片描述 修改swap需要重启才能使得配置文件生效,因为现在就需要用,可以直接重启,也可以先临时关闭掉
  • 临时关闭swapoff -a
  • 查看是否关闭成功free -m变0了表示关闭了在这里插入图片描述

3、配置Containerd容器

Containerd 在 Kubernetes 中扮演了容器运行时的角色,负责创建、管理和运行容器,提供了一个标准的容器运行时环境和安全特性。

3.1、下载安装Containerd

  1. 下载Containerd,因为是在github上所以如果没有外网可能会下载不成功,我上面的百度网盘有放下载好的(注意看后缀arm是 苹果的Apple M,Intel 的用amd),直接导入到服务器里面去就行,如果自己下载也是,别下载错了wget https://github.com/containerd/containerd/releases/download/v1.7.5/cri-containerd-1.7.5-linux-amd64.tar.gz
  2. 安装 Containerd 解压后会自动安装到指定位置去#解压文件tar xf cri-containerd-1.7.5-linux-amd64.tar.gz -C /#查看安装containerd --version在这里插入图片描述

3.2、创建&修改配置文件

  1. 创建配置文件#创建配置文件目录mkdir /etc/containerd#生成默认的配置文件containerd config default > /etc/containerd/config.toml#查看是否生成成功ls/etc/containerd在这里插入图片描述
  2. 修改配置文件vim /etc/containerd/config.toml
  • 修改第65行sanbox_image的值改为registry.aliyuncs.com/google_containers/pause:3.9,改为阿里的镜像地址和版本号。(镜像地址也可以不修改,只需要修改版本号也行,需要和后面–>8.1、集群初始化介绍的kubeadm-config.yaml文件的一致就行)在这里插入图片描述
  • 需要137行的false改为true在这里插入图片描述 修改好后保存退出

3.3、启动Containerd&开机自启

  • 执行开机启动,并且现在就启动systemctl enable --now containerd
  • 验证是否启动成功systemctl status containerd在这里插入图片描述

4、添加K8S集群组件

4.1、修改下载源

  • 添加阿里的软件源echo"deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"| sudo tee/etc/apt/sources.list.d/kubernetes.list
  • 验证是否添加成功ls/etc/apt/sources.list.d
  • 更新软件源apt-get update这个时候会失败,因为没有公钥,缺少 GPG 的key导致的在这里插入图片描述
  • 把公钥添加到服务器 上面图片箭头的B53DC80D13EDEF05就是你的公钥,需要添加自己的apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B53DC80D13EDEF05导入之后就会更新成功apt-get update在这里插入图片描述

4.2、安装组件

下面三个是k8s必要的组件,

  • kubeadm:创建、升级和管理 Kubernetes 集群
  • kubelet:管理节点上的容器生命周期
  • kubectl:管理和调试 Kubernetes 应用程序
  1. 执行安装 安装的时候需要y,y就行apt-get install kubeadm=1.28.1-00 kubelet=1.28.1-00 kubectl=1.28.1-00

上面是我安装的版本,如果想安装其他版本可以用下面的命令查看,如果不加版本号,会下载最新的

  • 查看版本apt-cache madison kubeadmapt-cache madison kubeletapt-cache madison kubectl在这里插入图片描述
  • 查看是否安装成功kubeadm versionkubelet --versionkubectl version
  1. 锁定版本 安装好后需要需要锁定版本,避免自动更新造成的一些问题apt-mark hold kubeadm kubelet kubectl在这里插入图片描述

5、克隆服务器

因为我们是要建立k8s集群嘛,所以需要有三台服务器用做搭建集群,
如果是本身有多台服务器的,并且前面的命令都在全部服务器执行过了的,就可以跳过这一步。

克隆服务器在VMware和parallels desktop执行都比较简单

5.1、通过parallels desktop克隆

  1. 先把服务器关闭在这里插入图片描述
  2. 右击你刚刚下载的好配置依赖的容器,点击克隆在这里插入图片描述
  3. 定义名称,点击确认 重复两次克隆两台从服务器出来在这里插入图片描述

5.2、通过VMware克隆

  1. 克隆 先关闭虚拟机,然后右击点击在这里插入图片描述
  2. 然后一路next确认在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述 然后等待克隆完成,启动

6、主机配置

6.1、设置静态ip

  1. 复制配置文件 避免配置错了无法恢复。可能有些版本的配置文件不是叫00-installer-config.yaml这个名字,反正修改/etc/netplan下的那个文件就行cp/etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
  2. 修改配置文件vim /etc/netplan/00-installer-config.yaml
  • 配置文件(三台虚拟机服务器都需要配置本虚拟机的ip) 需要修改下面文件的addresses: [192.168.5.55/24]via: 192.168.5.1,!!!注意不要有多余空格- addresses需要把ip改为本服务器的- via:网段改为自己的,网段通过route -n命令查看在这里插入图片描述
  • 安装的arm架构的# This is the network config written by 'subiquity'network:version:2ethernets:enp0s5:dhcp4: no addresses:[192.168.5.55/24]routes:-to: default via: 192.168.5.1 nameservers:addresses:[119.29.29.29,114.114.114.114,8.8.8.8]
  • 安装的amd架构的network:version:2renderer: networkd ethernets:ens33:dhcp4: no addresses:- 192.168.3.170/24 routes:-to: default via: 192.168.3.1 nameservers:addresses:[119.29.29.29,114.114.114.114,8.8.8.8]
  1. 配置生效netplan apply配置好之后可以ping一下局域网的其他物理机的网络,看是否可以ping通在这里插入图片描述

6.2、修改主机名

三台服务器分别执行

  • master01执行hostnamectl set-hostname master01
  • worker01执行hostnamectl set-hostname worker01
  • worker02执行hostnamectl set-hostname worker02然后exit退出当前用户,在重新登陆一下就可以了,可以看名字都一句以及已经改为了对应的名字在这里插入图片描述

6.3、主机名解析ip

全部都需要执行(!!!!这个要改为自己集群的主机ip

cat >> /etc/hosts << EOF
192.168.5.53 mater01
192.168.5.54 worker01
192.168.5.55 worker02
EOF

通过WindTerm的频道功能,可以实现同频道中,只要一个页面输入,其他的都会同步输入
在这里插入图片描述
再执行查看是否写入

cat/etc/hosts

在这里插入图片描述

6.4、时间同步

  1. 更改时区为上海时区timedatectl set-timezone Asia/Shanghai
  2. 安装ntpdate ntpdate是一个用于同步系统时钟与NTP服务器的工具apt-get install ntpdate
  3. 通过ntpdate命令同步时间ntpdate time1.aliyun.com
  4. 通过定时任务去实现定时同步crontab -e中间会让你选择输入2在这里插入图片描述 把下面这行加入进去0 */1 *** ntpdate time1.aliyun.com在这里插入图片描述

6.5、配置内核转发、网桥过滤配置

  1. 配置依赖模块到 /etc/modules-load.d/k8s.conf,用于实现开启自动加载
  • overlay: 这是 OverlayFS 的内核模块,用于支持 Docker 和 Kubernetes 等容器化技术。
  • br_netfilter: 这是 Linux 内核中的网桥过滤器模块,用于支持 Kubernetes 的网络功能。cat << EOF |tee/etc/modules-load.d/k8s.confoverlaybr_netfilterEOF配置完成之后,本次启动这两个配置,因为配置上配置后期开机启动的,当下也需要先启动modprobe overlay``````modprobe br_netfilter在这里插入图片描述 2. 查看是否启动成功lsmod | egrep "overlay"``````lsmod | egrep "br_netfilter"在这里插入图片描述
  1. 转发配置到k8s.conf文件中cat << EOF |tee/etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF
  2. 加载内核参数:sysctl --system
  3. 然后在查看是否加载成功sysctl -a | grep ip_forward``````net.ipv4.ip_forward = 1net.ipv4.ip_forward_update_priority = 1都变为1了表示加载成功在这里插入图片描述

三、部署集群

1、配置部署k8s集群

1.1、集群初始化

下面的只需要

master节点

的主机执行,其他的两个从机不用执行

  1. 创建kubeadm-config配置文件 把配置文件打印到本地,用于编辑kubeadm config print init-defaults > kubeadm-config.yaml在这里插入图片描述
  2. 修改文件 修改拉下来的配置文件vim kubeadm-config.yaml
  • 修改advertiseAddress的ip为mater01节点的ip
  • 修改name为mater01节点的主机名
  • 修改imageRepository仓库地址为阿里云的镜像仓库registry.aliyuncs.com/google_containers。因为前面/etc/containerd/config.toml文件修改了,如果前面的文件镜像仓库地址没修改,这个地方也可以不修改
  • 修改kubernetesVersion版本号,前面下载的是什么版本就写什么版本
  • dnsDomain表示DNS域名,可以不修改,但一个局域网内只能有一个相同的,如果有两个k8s集群用的一样的DNS名字就会冲突,一般推荐修改为公司的域名
  • networking中的 serviceSubnet 后面添加podSubnet: 10.244.0.0/16
  • 在最后面在添加下面的配置---kind: KubeletConfigurationapiVersion: kubelet.config.k8s.io/v1beta1cgroupDriver: systemd红色的是修改,绿色的是添加在这里插入图片描述
  1. 重启服务 修改完,分别重启containerd 和 kubeletsystemctl restart containerdsystemctl restart kubelet
  2. 下载镜像 下载k8s所需要的镜像到主节点
  • --image-repository:指定镜像仓库
  • --kubernetes-version:版本号,改为你的k8s版本kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version v1.28.1在这里插入图片描述
  1. 执行初始化kubeadm init --config kubeadm-config.yaml出现下面的,就表示初始化成功了在这里插入图片描述

1.2、准备kubectl配置文件

  1. 添加配置文件 把上面输出的内容在master节点执行一遍mkdir -p $HOME/.kubesudo cp-i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g)$HOME/.kube/config
  2. 查看节点kubectl get nodes在这里插入图片描述

1.2、添加从节点

复制刚刚自己初始化的地址,到从节点执行,也就是另外两个worker02节点
(!!!这个是我的,需要复制自己的)

  1. 复制tokenkubeadm join 192.168.5.53:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:55917a9c22cb444e83ce19517b8b9f1856401cf3ca11df4e661978fd9eed222e在这里插入图片描述
  2. 查看 在到主节点进行查看kubectl get nodes在查看,就可以看到刚刚加入的worker节点了在这里插入图片描述

2、安装k8s网络插件Calico

k8s常用的网络插件主要有

  • Flannel:Flannel是Kubernetes官方推荐的网络插件之一。它提供了一种基于UDP的网络通信方式,支持多租户和多网段。
  • Calico:Calico是另一个流行的K8S网络插件。它提供了一种基于BGP的网络通信方式,支持多租户和多网段。
  • Weave:Weave是一种基于 Overlay 网络的K8S网络插件。它提供了一种简单易用的方式来管理集群中的网络通信。
  • Cilium:Cilium是一种基于 Linux 内核的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。
  • OpenVSwitch:OpenVSwitch是一种基于开源的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。

2.1、执行安装tigera-operator

  1. 下载 我这安装的是3.26.1,如果需要安装其他版本,直接改版本号就行,其他目录都是一样的kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml在这里插入图片描述
  2. 查看是否安装成功tigera-operator``````kubectl get ns
  3. 查看pod状态 如果是Runing 状态就代表成功了,如果不是就代表有问题kubectl get pods -n tigera-operator在这里插入图片描述

2.2、配置custom-resources

custom-resources.yaml 是一个用于配置 Kubernetes 的自定义资源定义(CRD)文件

  1. 先拉取下来wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
  2. 修改配置 修改配置网段,这个网段是前面初始化时设置的podSubnet的网段 cidr: 10.244.0.0/16``````vim custom-resources.yaml在这里插入图片描述
  3. 拉取镜像 因为一些原因,选择不能下载,需要通过一些大佬弄的映射加速仓库去拉。!!!全部节点都要拉取。 如果下面的地址不行,可以到里面去找最新的 https://github.com/DaoCloud/public-image-mirror/issues/2328```ctr image pull docker.1panel.live/calico/cni:v3.26.1ctr image pull docker.1panel.live/calico/pod2daemon-flexvol:v3.26.1ctr image pull docker.1panel.live/calico/node:v3.26.1ctr image pull docker.1panel.live/calico/kube-controllers:v3.26.1ctr image pull docker.1panel.live/calico/typha:v3.26.1ctr image pull docker.1panel.live/calico/node-driver-registrar:v3.26.1ctr image pull docker.1panel.live/calico/csi:v3.26.1```在这里插入图片描述
  4. 查看是否下次完成ctr image list要确保全部都是application/vnd.docker.distribution.manifest.list.v2+json没有出现 Init:ErrImagePull在这里插入图片描述
  5. 应用配置 下载完成之后执行下面命令,应用配置kubectl create -f custom-resources.yaml
  6. 查看命名空间kubectl get ns看到calico-system代表ok了在这里插入图片描述
  • 查看podkubectl get pods -n calico-system大概等个几分钟,都是 Runing,代表成功在这里插入图片描述
  • 再查看节点信息,就会发现状态已经变成 Ready 状态kubectl get nodes在这里插入图片描述到这一步,说明就是全部安装完成了

2.3、错误解达。

如果哪个节点有问题
执行下面命令直接删除掉k8s相关的东西,然后重新安装三个组件,在去重新通过链接加入就行。

#重置 Kubernetes 集群,它会删除所有与 Kubernetes 相关的配置文件、数据和组件。
sudo kubeadm reset
rm-rf /var/lib/cni/
rm-rf /var/lib/kubelet/*rm-rf /etc/cni/*rm-rf /root/.kube
rm-rf /etc/kubernetes/*

ipvsadm -C
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

四、测试使用

1、安装可视化Web工具:Kuboard v3

1.1、使用kubectl安装(master01节点执行)

发生错误可以查看kuboard官网
https://press.demo.kuboard.cn/install/v3/install-in-k8s.html

  1. 下载配置文件wget https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
  2. 执行创建kubectl apply -f vim kuboard-v3-swr.yaml如果镜像拉取不下来可以修改下镜像仓库地址改为我的阿里云的进行仓库地址vim kuboard-v3-swr.yaml``````# 地址:registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard-agentregistry.cn-hangzhou.aliyuncs.com/zhengfp_images/etcd-host:3.4.16-1registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard:v3registry.cn-hangzhou.aliyuncs.com/zhengfp_images/questdb:6.0.4分别把地址放入下面对应的地方在这里插入图片描述在这里插入图片描述在这里插入图片描述 继续执行部署kubectl apply -f vim kuboard-v3-swr.yaml
  3. 查看部署kubectl get pods -n kuboard都是Running即可在这里插入图片描述
  4. web测试
  • 在浏览器打开链接http://节点IP:30080
  • 输入初始用户名和密码,并登录- 用户名: admin- 密码: Kuboard123在这里插入图片描述
1.1.2、常见错误

通过

kubectl get pods -n kuboard

查看pod,看哪个pod不成功
查看对应的错误

powershell kubectl logs kuboard-v3-7979bc788f-hln74 -n kuboard 
  • desc = "transport: Error while dialing dial tcp: missing address"错误表明 Kuboard 无法连接到 etcd。在这里插入图片描述
  • kuboard-v3-xxxxx 的容器出现 CrashLoopBackOff 的状态,可能的原因有 需要执行

前面两个错误都是执行下面的命令

kubectl label nodes mater01 k8s.kuboard.cn/role=etcd

1.2、web配置

  1. 刚进去会有一个错误的集群,删除掉,点击添加集群在这里插入图片描述
  2. 输入集群名称和描述在这里插入图片描述
  3. 复制kubeConfig 在master01节点执行cat ~/.kube/config命令,把全部内容复制到kubeConfig框内,点击确认在这里插入图片描述 如图显示,代表成功在这里插入图片描述

2、部署Nginx服务

2.1、使用Kuboard部署

  1. 在首页点击集群,选择命名空间在这里插入图片描述
  2. 填写信息 左边选择,名称空间>常用操作>创建工作负载,然后再填写基本信息在这里插入图片描述
  3. 填写容器信息 阿里云镜像地址registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest> 如果镜像拉取不下来可以看我【docker镜像加速服务搭建】这篇文章,自己搭建一个加速服务填写好之后点击上面的保存>应用>确认>在这里插入图片描述在这里插入图片描述
  4. 查看在这里插入图片描述

5.访问对应的节点进行测试

在这里插入图片描述

2.2、使用yaml方式创建

  1. 创建yamlvim nginx-deployment.yaml
  2. 编写配置---apiVersion: apps/v1kind: Deploymentmetadata: name: nginxweb # 部署的名称spec: replicas: 2 # 设置副本数量为2 selector: matchLabels: app: nginxweb1 # 用于选择匹配的Pod标签 template: metadata: labels: app: nginxweb1 # Pod的标签 spec: containers: - name: nginxwebc # 容器名称 image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 镜像拉取地址,换成阿里云的,不然会拉取失败 imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取 ports: - containerPort: 80 # 容器内部监听的端口---apiVersion: v1kind: Servicemetadata: name: nginxweb-service # 服务的名称spec: externalTrafficPolicy: Cluster # 外部流量策略设置为集群 selector: app: nginxweb1 # 用于选择匹配的Pod标签 ports: - protocol: TCP # 使用TCP协议 port: 80 # 服务暴露的端口 targetPort: 80 # Pod中容器的端口 nodePort: 30080 # 在每个Node上分配的端口,用于外部访问type: NodePort # 服务类型,使用NodePort
  3. 应用配置kubectl apply -f nginx-deployment.yaml
  4. 检查是否成功
  • 查看pod``````kubectl get pods
  • 查看service> service 可以查看到对应pod的名称还有端口映射kubectl get service
  • 查看访问ipcurl http://10.244.5.3curl http://10.244.30.69在这里插入图片描述
  1. 通过对应的节点IP进行测试

⌨️码字不易,觉得可以的话可以一键三连一下!!!

标签: kubernetes 容器 java

本文转载自: https://blog.csdn.net/weixin_52315708/article/details/140894347
版权归原作者 方渐鸿 所有, 如有侵权,请联系我们删除。

“【2024】k8s集群 图文详细 部署安装使用(两万字)”的评论:

还没有评论