K8s节点运维与多集群上下文管理
·
Node and Cluster
查看节点
#查看节点清单
root@master30~ 16:28:24# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.hgq.cloud Ready control-plane 158m v1.30.2
worker31.hgq.cloud Ready <none> 156m v1.30.2
worker32.hgq.cloud Ready <none> 156m v1.30.2
#查看特定节点的详细信息
root@master30~ 16:49:00# kubectl describe node master30.hgq.cloud
......
删除节点
以worker31节点为例
# 设置节点为维护模式
root@master30~ 16:50:09# kubectl drain worker31.hgq.cloud --ignore-daemonsets
node/worker31.hgq.cloud cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/calico-node-48jmh, kube-system/kube-proxy-w62wv
node/worker31.hgq.cloud drained
#查看节点情况,可知worker31变为SchedulingDisabled
root@master30~ 16:51:53# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.hgq.cloud Ready control-plane 162m v1.30.2
worker31.hgq.cloud Ready,SchedulingDisabled <none> 160m v1.30.2
worker32.hgq.cloud Ready <none> 160m v1.30.2
#删除worker31节点
root@master30~ 16:52:41# kubectl delete node worker31.hgq.cloud
node "worker31.hgq.cloud" deleted
root@master30~ 16:53:24# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.hgq.cloud Ready control-plane 163m v1.30.2
worker32.hgq.cloud Ready <none> 161m v1.30.2
删除集群
删除集群流程:
- 删除所有的node
- 删除所有的master
#删除所有的node
root@master30~ 16:53:32# kubectl drain worker32.hgq.cloud --ignore-daemonsets
root@master30~ 16:55:44# kubectl delete node worker32.hgq.cloud
root@master30~ 16:55:59# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.hgq.cloud Ready control-plane 165m v1.30.2
#删除master
# 删除集群前可先获取集群配置
root@master30~ 16:57:30# kubectl get cm kubeadm-config -n kube-system -o yaml > kubeadm.yml
# 修改kubeadm.yml内容如下:
root@master30~ 16:58:42# vim kubeadm.yml
# 删除1-3和22-28行,效果如下
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: v1.30.2
networking:
dnsDomain: cluster.local
podSubnet: 10.224.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
root@master30~ 16:59:05# kubectl delete node master30.hgq.cloud
root@master30~ 16:59:24# rm -rf .kube/
重建集群
#先对节点reset一遍
root@master30~ 16:59:55# kubeadm reset -f
root@worker31~ 14:19:31# kubeadm reset -f
root@worker32~ 14:12:21# kubeadm reset -f
#可指定config.yaml文件进行初始化集群
root@master30~ 17:03:50# kubeadm init --config kubeadm.yaml
#配置凭据,即给当前用户授予集群管理员访问凭证
root@master30~ 17:05:08# mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#配置网络
root@master30~ 17:08:19# kubectl apply -f calico.yaml
#令worker节点加入集群
root@worker31~ 17:03:59# kubeadm join 10.1.8.30:6443 --token lr7rw7.ckf0zy9s56rm1gkq \
--discovery-token-ca-cert-hash sha256:fe9c8ec695bfb6aff54fbd226ab0d5d68efb12843b5ad38be8b068dac7a4d522
root@worker32~ 17:04:02# kubeadm join 10.1.8.30:6443 --token lr7rw7.ckf0zy9s56rm1gkq \
--discovery-token-ca-cert-hash sha256:fe9c8ec695bfb6aff54fbd226ab0d5d68efb12843b5ad38be8b068dac7a4d522
#查看集群节点情况
root@master30~ 17:08:35# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master30.hgq.cloud Ready control-plane 4m57s v1.30.2
worker31.hgq.cloud Ready <none> 44s v1.30.2
worker32.hgq.cloud Ready <none> 42s v1.30.2
Namespace and Contexts
什么是Namespace
Namespace**,简写ns,也称之为 project,代表资源集合,用于分组集群资源。Kubernetes 使用 Namespace 可以将一个物理的 Cluster 逻辑上划分成多个资源集合, 每个集合就是一个Namespace。 不同Namespace 里的资源是完全隔离的。
Kubernetes 默认创建以下Namespace:
- default: 创建资源时如果不指定Namespace, 将被放到这个Namespace中。
- kube-system: Kubernetes 自己创建的系统资源将放到这个Namespace中。
- kube-public:该命名空间中所有对象可以被所有用户(包括未验证身份的用户)读取。
- kube-node-lease:该命名空间含有与每个节点关联的Lease对象。节点租用允许kubelet发送heartbeat(心跳),以便控制平面能检测节点故障。
Namespace管理
#查看Namespace清单
root@master30~ 17:10:16# kubectl get ns
NAME STATUS AGE
default Active 95m
kube-node-lease Active 95m
kube-public Active 95m
kube-system Active 95m
#获取Namespace资源yaml格式定义文件
root@master30~ 18:40:25# kubectl get ns default -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2026-06-23T09:05:04Z"
labels:
kubernetes.io/metadata.name: default
name: default
resourceVersion: "37"
uid: f4a26a2a-1905-4d31-a2e1-e92062cd734d
spec:
finalizers:
- kubernetes
status:
phase: Active
#创建Namespace
root@master30~ 18:40:54# kubectl create ns webapp
namespace/webapp created
#直接编辑Namespace
root@master30~ 18:41:28# kubectl edit ns webapp
#查看Namespace的详细信息
root@master30~ 18:41:57# kubectl describe ns webapp
Name: webapp
Labels: kubernetes.io/metadata.name=webapp
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.
#删除Namespace
root@master30~ 18:42:40# kubectl delete ns webapp
namespace "webapp" deleted
# 注意:
# 删除一个namespace会自动删除该namespace中所有资源。
# default和kube-system命名空间不可删除。
除了使用命令创建Namespace之外,还可以使用yaml文件来创建
# webapp.yaml
apiVersion: v1
kind: Namespace
metadata:
name: webapp
root@master30~ 18:44:25# kubectl apply -f webapp.yaml
namespace/webapp created
操作特定ns中特定对象,需要使用选项-n指定ns,例如:
root@master30~ 18:48:02# kubectl run web --image nginx -n webapp
pod/web created
root@master30~ 18:50:25# kubectl get pods -n webapp -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web 1/1 Running 0 2m24s 10.224.96.193 worker32.hgq.cloud <none> <none>
root@master30~ 18:50:47# curl 10.224.96.193
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, nginx is successfully installed and working.
Further configuration is required for the web server, reverse proxy,
API gateway, load balancer, content cache, or other features.</p>
<p>For online documentation and support please refer to
<a href="https://nginx.org/">nginx.org</a>.<br/>
To engage with the community please visit
<a href="https://community.nginx.org/">community.nginx.org</a>.<br/>
For enterprise grade support, professional services, additional
security features and capabilities please refer to
<a href="https://f5.com/nginx">f5.com/nginx</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Namespace切换
查看当前所在的ns
root@master30~ 18:51:06# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
此时NAMESPACE列对应的属性为空,不属于任何NAMESPACE。
设置默认ns
root@master30~ 18:52:17# kubectl config set-context --current --namespace webapp
Context "kubernetes-admin@kubernetes" modified.
root@master30~ 18:53:43# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin webapp
可见,此时NAMESPACE的值为webapp。
Cluster切换
~/.kube/config 详解
单集群配置
获取凭据文件内容(不显示敏感信息):
root@master30~ 18:53:59# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.1.8.30:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: webapp
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
配置文件示例:
root@master30~ 18:56:46# cat .kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJUUFzVDlnOElmTTR3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBMk1qTXdPRFU1TlRaYUZ3MHpOakEyTWpBd09UQTBOVFphTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURIOEZOM1RDbVlleG1yZjNqeCs2RzNjWmhmVVlMZlpna08xK0M4aFlXNVdRYnJRWUlqTWtjSVM1MVcKdEpjdFNSNEFYdkFUMWExR0I5ZUswRlUwZWlPbHZlYWVYZHVMZ2lXSzNCcVcvb213RXpLVEVxUEdMcWNUeGEyZApHRVFESWlWWng5aEtYblpFQnV1Ly9SaUhYVTIrQWZxYXpSMko4b29ITjc0T1A4aXFxN0ppM1ljRzB6WWdWSjBjCjZhN0VYVHcvRkNOazFqdUFKUXJXck1xaWtHVFM1NVVjZ0l1UERVclBSbDhCVVR4bU53eXFNRzVCdDZjd0RaRTIKU0ovMTNrcjRzdjdwTytpNmhqWnI0L09ZeWhPZ2kzQ1RjcTVoTzV6QVo1Z1VJRE5oN04rcSswcS9Za0pOWS9kZwo3UGNZS2pPUmwwZVhNL1hPZWR1R0Y3d0pldGhkQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJURm1GU0R0b1R6RzBZYlBSZGw2N0dkMnEwZU9UQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQys5REllYVB3SQpObnl5ZGlSenpHcEFPdUhjeE1WckhFcERxNWkvNzJVTUQxNFAyTWpDY2RKQzNWTWhXZ0YvTlg5UlBPUWRvbzIrClBKRUVDNlVpb2pveEtWTDlBVEVxajFrZ1ZhbUdZblNLck9FL1FVVkR4MUo3M1IrRmdVZUQreWRKZmtQR2x4NWwKOVkwRjRuSFJybkZNUS9LczYrTG5XeXFGNXNYU2JobHJFeVJ2TGxJT1MxS0hRU3ZhM3NLRHJKeXpNSW9NMmF5bwovRHZUSlR2dUhuMjRKV25aWjFqZ2ZWdFdncXdEMXlEc0IwaW03RE1wbVBjdURicDZtalJSWjg0ZGlsL2pRR2VYCk1GV3JwRWJwWXRiRW5ma3MwMXVacHJYMktCN3NTUUlkOTg3b2RmdlU3aU0yc0FJeERQKzFDcFBlSE81bUdJWGgKR2xVRUFoc0FYYTZFCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K #certificate-authority-data 指定CA证书,通过base64编码。
server: https://10.1.8.30:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: webapp
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLVENDQWhHZ0F3SUJBZ0lJWGZvbFJJdkF6RGN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TmpBMk1qTXdPRFU1TlRaYUZ3MHlOekEyTWpNd09UQTBOVGxhTUR3eApIekFkQmdOVkJBb1RGbXQxWW1WaFpHMDZZMngxYzNSbGNpMWhaRzFwYm5NeEdUQVhCZ05WQkFNVEVHdDFZbVZ5CmJtVjBaWE10WVdSdGFXNHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEYmg5VzkKZ29BeURya0ZWLzd2KzgzOWNtczFFOERQQnNWaEpreUkvd1NuWlpuU1IyRFdhTHYvUXlOTGtrQ3BVWWt5NlFxWApZMktmM2x5ZlZNSEZLTVU0ZmFQQTk3bThjNU5wWld3ZHZMeklBYTlQRTZKWHA3WlN6MXM2VzE3VEM2S3ZzeXNmCmtRY3RpNkhGQ0Q5R01ndjJUcm0ySnc3enZ5NTZncTg1elhldGRsTldkUm1OTTFnSlJYWStWWnZ4ZDY2WThVQVoKUkpOcnhZRGJ3NGh3RjVtWHc4TGxpQnZ6OEoxQ3RiTml0U2xFblZqYWFnbzRGMGFNakoxWG9UZDNJcmRtY3lmRgpubVNrWjd0V0k1YkYxdFdUQ2FMcC9nYmdHZUk4Mkd2OHIwelZER1k3K29WUTl0Rk5SZTZyMUxkQjlETkFVN0lZCnV0cWRCUk52L2RoRUszbVZBZ01CQUFHalZqQlVNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUsKQmdnckJnRUZCUWNEQWpBTUJnTlZIUk1CQWY4RUFqQUFNQjhHQTFVZEl3UVlNQmFBRk1XWVZJTzJoUE1iUmhzOQpGMlhyc1ozYXJSNDVNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFyb2dkRUwxbys4bmlpNVhRd0pydCtUaDFVCjRZSFpEQjJOOFZaTWMrbDJnVGpiNEdRMjhHVmpVRlVIcTNaN0w3ZkIycmY3a2FCTnkxN3VFTUx4dDVnZm14emoKUmJtbkNkeExFZllhcytsTlZCdGFVdjc4am9iNjUzcnhHRmV5RFBmUC9UaUt1aUg5anlqS2xpSFpBMmMxMUt5RwpKNVZtWVJzTGRyWW9NSDhBVW1PMFFsR1NkMTMwTmViT3VoSXYyMzJuVEd5ZUY3WjJqVDMzVlFuQUtzaE5FYXNCCm5DZCsrQmcrTUtrbWxHTUhBZEl2dWhVQ3M4U1dTYWczOGFYc3ErRy8yUkV0NEpKaHB3dTY3UzRjVUVhVWN6SnIKMThMUTROS3BaUHd1ejgzZXYxSVFNcmRSNWJyUkJWaG9KYWdsakpQN2l3cEI2cFR6SDBGUEI0YzNMcnFkCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K #client-certificate-data 指定用户证书,同样是 base64 编码。
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMjRmVnZZS0FNZzY1QlZmKzcvdk4vWEpyTlJQQXp3YkZZU1pNaVA4RXAyV1owa2RnCjFtaTcvME1qUzVKQXFWR0pNdWtLbDJOaW45NWNuMVRCeFNqRk9IMmp3UGU1dkhPVGFXVnNIYnk4eUFHdlR4T2kKVjZlMlVzOWJPbHRlMHd1aXI3TXJINUVITFl1aHhRZy9SaklMOWs2NXRpY084Nzh1ZW9Ldk9jMTNyWFpUVm5VWgpqVE5ZQ1VWMlBsV2I4WGV1bVBGQUdVU1RhOFdBMjhPSWNCZVpsOFBDNVlnYjgvQ2RRcld6WXJVcFJKMVkybW9LCk9CZEdqSXlkVjZFM2R5SzNabk1ueFo1a3BHZTdWaU9XeGRiVmt3bWk2ZjRHNEJuaVBOaHIvSzlNMVF4bU8vcUYKVVBiUlRVWHVxOVMzUWZRelFGT3lHTHJhblFVVGIvM1lSQ3Q1bFFJREFRQUJBb0lCQUh4NDVVa0JnSHhoZXFpNwoveEhGSFVQU0oxVTk4UG14WmlLeVczemwwNWF5ZGVnVGpxV2pWc3ppSFZZUkE5YTlJMlNaVytjQWRBQWZUVGNPCkVKd2doTXFGK2w1RVY2eXhmMmlvR0FnNFpuV2s5dWlJUW1rZTc3SytYWVNXSUFyYnN3K2FNQjVDMWVZT0lOZ2QKMS9xT0Q5aEZST2t4OWpsZ01oTkdtK0hUVFVNdElhVmJjV2Y3R3pJSVd5Mm9zRldmcVAzUFRwekNiZWRXTDIwNwpaU1BDRjlrOHAzYXQ0dFlidjZOV0h6ZVpZelYzbWJ6TFc4b2crNy8wbE0xRGFlTHpDZ1dPcHUwWVZmbmxva0NSCmppMll4K05kM0p6cSs0U0dwS0duVHVRWEFYK0tYVnA1bUljWFFYUy80Q2tyMzNYM0hwZGdEUEJZenBHWU1kb0gKQmpqa2RNRUNnWUVBM2hCOEQ5cnh3Tlh5d05TUTREdXB3Vk5jak5ObEF0QUphOFJUcDhaazVMU3prV2ZRL1BwUwpra05QZnJpNVhPeFRCK2d6OTFjQ3BFYWFoUmh5WUkya3NDQThzdjlYZWlDUTZHREMveUNPaUNqL3Bxd0VFRVZFCnRHQTZqd0p3TXllQlhpRjNOV0YrL3dFdjRKVUpMMTIrcWROVVNiSjZMZ1labTVrem9vMDd1UVVDZ1lFQS9SUTUKZGlOWS85SVZZT2JmV01HK1hkVkRKOHhmZ2pZVzByc1dSY3BCWDRvMVZDdHB4V2c2WjVHYkhLRU5CZGdXbjgveApjRG5mSTZKZ21CWUN6VTVOMjhqcGdZNVIrUklORWNtamJXWTVqbEZDaHF1cnZURlNZS2VYQzhEVEpBV2FiaFNOCjFRdkhHWlMyQk1SNWNuc0dwclYyUXBUTWNESHVWTHlIVnlZbFkxRUNnWUJrQ1FNS1ZYUkFqV0RjOHlVTWpuUUwKYmhVc0wzSzZrS01kMUFSbmVSMHNWaWJxWXQwbmlWQzNLUEZmd2JGbkplTEZsaG9LMnp5S2FtL2pjejdiTmhPeApiK1JJTW5UaXhGYmpCK3Z2NkdlcytPTXAzeVc1ZXFyWG90M2VYSmZVdzRBb3VtU3NQRzVzUzhtWW55clRGcVQwCmRnbnJaU1piSTA1WDVPejQxaXpJVFFLQmdRQ1RNSVFLOVp2NWpWSHB2ZDBBWGc0OXZKOEdNcE1KeERPWjlEMkwKOFluNzZ3SUJKZzZxUldoU2ZCamVtYnhkUGNSS3hrSUJwMmJqN3JpSE82WDlpaUUyUnErb0xnSDIva3lqbjhaeApCaGRMY205aXE4MkNoNEVGdmZMWFh4cHR4T1NBU1d3RUVJbUhrem9abzd1T25ZYk14cFUxUEIxNjAwOXQ4UWcxCjQzV3pRUUtCZ0MrN3M4b3FvK1Y3Uld3Q1dMZ2t4NmNFZ1BXd0FpR3MzMkRvYWZrWjVNeHl1SlMvYjAvTDNLODEKRHhnZ0drZVcwaGZtNmZVR1ZWcEtGSDl4b2ZqcjNVLzVBSjV1eFQ1b1lTVHM2bW9DTkRYZ0hERmZ2SG1FM29CYQo1d2h6TmR3YXZ4dXB5VDNxeXVoTmtFLzA0VzJ3ZU8vNU1MZXNkUVVZb3puQVlldktmY0JSCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== #client-key-data 指定用户私钥,同样是 base64 编码。
多集群配置
示例:
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.1.8.30:6443
name: cluster1
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.1.8.150:6443
name: cluster2
contexts:
- context:
cluster: cluster1
namespace: default
user: cluster1-admin
name: cluster1-context
- context:
cluster: cluster2
namespace: default
user: cluster2-admin
name: cluster2-context
current-context: cluster1-context
kind: Config
preferences: {}
users:
- name: cluster1-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
- name: cluster2-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
配置文件定义了以下资源:
- clusters:集群信息,包括集群名、authority、地址和端口。
- users:用户信息,包括用户名、certificate和key。
- contexts:上下文信息,包括上下文名称、集群名、用户名和namespace。
多集群切换
kubernetes 自带工具
环境准备:
root@master30~ 19:10:00# cp .kube/config .kube/config.bak
root@master30~ 19:10:32# vim .kube/config #使用上面的多集群配置实例覆盖原内容
# *代表的是当前使用的上下文
root@master30~ 19:11:30# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* cluster1-context cluster1 cluster1-admin default
cluster2-context cluster2 cluster2-admin default
#查看集群清单
root@master30~ 19:11:39# kubectl config get-clusters
NAME
cluster2
cluster1
#切换上下文
root@master30~ 19:11:48# kubectl config use-context cluster2-context
Switched to context "cluster2-context".
root@master30~ 19:13:14# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
cluster1-context cluster1 cluster1-admin default
* cluster2-context cluster2 cluster2-admin default
更多推荐



所有评论(0)