自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 收藏
  • 关注

原创 k8s之配置资源管理

1,kubernetes.io/service-account-token:由 Kubernetes 自动创建,用来访问 APIServer 的 Secret,Pod 会默认使用这个 Secret 与 APIServer 通信, 并且会自动挂载到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目录中;在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容。2,内容用 base64 编码,创建Secret。

2023-11-09 17:24:48 588

原创 k8s之pod控制器

而在 deployment中pod模板中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,而statefulset定义中的每一个pod都不能使用同一个存储卷,由此基于pod模板创建pod是不适应的,这就需要引入volumeClainTemplate,当在使用statefulset创建pod时,会自动生成一个PVC,从而请求绑定一个PV,从而有自己专用的存储卷。帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。

2023-11-08 14:26:04 317

原创 k8s之数据卷

4、变成Released的PV会根据定义的回收策略做相应的回收工作。有了这两部分信息,Kubernetes 就能够根据用户提交的 PVC,找到对应的 StorageClass,然后 Kubernetes 就会调用 StorageClass 声明的存储插件,自动创建需要的 PV 并进行绑定。PVC 的使用逻辑:在 Pod 中定义一个存储卷(该存储卷类型为 PVC),定义的时候直接指定大小,PVC 必须与对应的 PV 建立关系,PVC 会根据配置的定义去 PV 申请,而 PV 是由存储空间创建出来的。

2023-11-07 14:18:27 487

原创 k8s约束调度其二

但我们可以在 Pod 上设置容忍(Tolerations),意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上。//由于指定 Pod 所在的 node01 节点上具有带有键 kgc 和标签值 a 的标签,node02 也有这个kgc=a的标签,所以 node01 和 node02 是在一个拓扑域中,反亲和要求新 Pod 与指定 Pod 不在同一拓扑域,所以新 Pod 没有可用的 node 节点,即为 Pending 状态。#如果 kgc 对应的值不一样就是不同的拓扑域。

2023-11-02 16:18:16 161

原创 k8s约束调度

比如 node01 的 CPU 和 Memory 使用率 20:60,node02 的 CPU 和 Memory 使用率 50:50,虽然 node01 的总使用率比 node02 低,但 node02 的 CPU 和 Memory 使用率更接近,从而调度时会优选 node02。(12)kubelet 是在 Node 上面运行的进程,它也通过 List-Watch 的方式监听(Watch,通过https的6443端口)APIServer 发送的 Pod 更新的事件。除了知道 Pod 的副本数量,副本内容。

2023-11-01 14:45:36 580

原创 k8spod详解其二

类似的,如果给容器设置了 CPU 的 limit 值但未设置 CPU 的 request 值,则 Kubernetes 自动为其设置 CPU 的 request 值 并使之与 CPU 的 limit 值匹配。就绪探测情况下的放弃 Pod 会被打上未就绪的标签。可以以整数表示,或者以10为底数的指数的单位(E、P、T、G、M、K)来表示, 或者以2为底数的指数的单位(Ei、Pi、Ti、Gi、Mi、Ki)来表示。如果 Pod 运行所在的节点具有足够的可用资源,容器可以使用超出所设置的 request 资源量。

2023-11-01 13:51:05 350

原创 k8spod详解其一

2,初始化容器(init容器):阻塞或者延迟应用容器的启动,可以为应用容器实现提供好运行环境和工具。Pod是k8s中最小的创建与运行单元,一个pod包含一个根容器/父容器/基础容器,一个或多个应用容器/业务容器。1,自主式/静态pod:不被控制器管理的pod,没有自愈能力,一旦pod挂掉,不会被重新拉起。2,控制器管理pod:被控制器管理的pod,有自愈能力,一旦pod挂掉就会重新拉起。3,应用容器(main容器):在所有init容器成功启动和退出后应用容器才会启动,并行启动,提供应用程序业务。

2023-10-31 15:38:10 84

原创 k8s声明式资源管理方式

targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器。port 是 k8s 集群内部访问service的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service。YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读。●“---”表示YAML格式,一个文件的开始,用于分隔文件间。

2023-10-31 15:02:01 142

原创 k8s陈述式资源管理方法

比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。2.kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。滚动发布:按照比例一部分一部分的滚动更新,k8s默认的更新机制,无创建一定的比例的新pod,再删除一定比例的旧pod。

2023-10-30 15:01:06 337

原创 k8s修改apiserver证书可用年限

使用 kubeadm 部署的 K8S 集群中,apiserver 证书的默认可用年限只有一年。如果直接用在生产环境,当证书过期后会造成 K8S 集群瘫痪,从而影响现网业务。2,查看 apiserver 证书信息,默认可用年限只有一年。3,查看 ca 证书信息,默认可用年限为10年。1,查看 K8S 集群所有证书存放位置。6,更新个节点证书到master。5,更新kubeadm。4,修改证书可用年限。

2023-10-30 14:02:14 535

原创 k8s高可用部署

master01(2C/4G,cpu核心数要求大于2) 192.168.80.20。master02(2C/4G,cpu核心数要求大于2) 192.168.80.14。master03(2C/4G,cpu核心数要求大于2) 192.168.80.15。3,所有 master 节点上修改 K8S 集群配置文件。1,所有节点安装docker。2,部署master节点。

2023-10-30 13:53:27 190

原创 k8s二进制安装部署

目前比较常用的CNI网络组件是flannel和calico,flannel的功能比较简单,不具备复杂的网络策略配置能力,calico是比较出色的网络管理插件,但具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多网络策略,则使用calico更好。将 Pod 的 IP 和所在的 Node 的 IP 关联起来,通过这个关联让不同 Node 上 Pod 之间直接通过内网 IP 地址通信。

2023-10-27 14:28:47 358

原创 K8S基础

从 Master 节点获取自己节点上 Pod 的期望状态(比如运行什么容器、运行的副本数量、网络或者存储如何配置等), 直接跟容器引擎交互实现容器的生命周期管理,如果自己节点上 Pod 的状态与期望状态不一致,则调用对应的容器平台接口(即 docker 的接口)达到这个状态。在K8S的集群里,虽然每个Pod会被分配一个单独的IP地址,但由于Pod是有生命周期的(它们可以被创建,而且销毁之后不会再启动),随时可能会因为业务的变更,导致这个 IP 地址也会随着 Pod 的销毁而消失。K8S 的存储服务。

2023-10-20 14:28:06 34

原创 ansible-playbook剧本

Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。(4)Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作。(2),修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量。(3),编写playbook。3,定义,引用变量示例。

2023-10-17 14:05:29 146

原创 ansible基础

YAML格式文件,多个任务定义在一个文件中,定义主机需要哪些模块来完成的功能core modulest核心模块主要操作是通过调用核心模块来管理任务。dest:指出复制文件的目标及位置,使用绝对路径,如果是源目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容。ansible_password 连接时的用户的ssh密码,仅在未使用密钥对验证的情况下有效。ansible_ssh_private_key_file 指定密钥认证ssh连接时的私钥文件。

2023-10-17 13:41:20 357

原创 Docker--harbor

可以做到 harbor RBAC(基于角色访问控制),可以对不同的用户和用户组进行灵活全向控制,并且提供灵活的复制和问步策略,可以实现多个harbor实例的镜像复制和同步。由于要对用户进行访问控制,即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。

2023-10-11 18:44:13 454

原创 Docker服务更新与发现

若sock有变化,registator会把数据发给consul服务器的自动注册模块,consul服务器会注册服务名称,ip,端口号,注册完成后通过ui界面(ip:8500)来进行web ui展示。这是一个基于分布式的服务发现和管理工具,它具有快速构建分布式框架,提供服务发现和服务治理等特点。服务注册与发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。和服务发现的集成,可以防止服务转发到故障的服务上面。三,consul用到的端口。

2023-10-10 19:05:40 816 1

原创 Docker-compose

Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

2023-10-10 10:18:53 64

原创 Docker 数据管理和网络通信

但是当编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。(5)镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。

2023-10-09 09:40:48 88

原创 docker资源控制

cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。所以 cgroups(Control groups)实现了对资源的配额和度量。●优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级。●资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等。●任务控制:cgroup可以对任务执行挂起、恢复等操作。●资源限制:可以对任务使用的资源总额进行限制。

2023-10-05 10:11:23 389

原创 docker网络

如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。一,docker网络实现原理。二,docker的网络模式。

2023-10-05 10:08:47 129

原创 docker容器基础

因为大部分的镜像都是基于某个操作系统来构建,所以很轻松的就可以构建本地和远端一样的环境,这也是Docker镜像的精髓。Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用push命令将它上传到公有仓库(Public)或者私有仓库(Private)。通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件。Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向 Docker 容器引擎的只读模板。

2023-10-05 09:57:44 152

原创 zabbix

被动模式:被动模式就是zabbix server向agent发出指令获取数据, zabbix agent被动的去获取数据并返回给zabbix server ,zabbix server端周期性的向agent索取数据,这种模式的最大的问题就是加大zabbix*server的工作量,在数百台服务器的环境下zabbix server 不能及时回去到最新的数据,但是这也是默认的工作方式。监控cpu负载,内存使用,硬盘使用,网络状态,端口监视,日志监视,可以插件开发自定义。

2023-10-05 09:40:21 73

原创 Kafka

Kafka 是最初由 Linkedin 公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于 Zookeeper 协调的分布式消息中间件系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景,比如基于 hadoop 的批处理系统、低延迟的实时系统、Spark/Flink 流式处理引擎,nginx 访问日志,消息服务等等,用 scala 语言编写,消息被消费以后,消息队列中不再有存储,所以消息消费者不可能消费到已经被消费的消息。

2023-09-20 10:11:32 397

原创 zookeeper集群

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且此时SID为3的服务器是Leader。(1)服务器1启动,发起一次选举。

2023-09-20 10:06:50 182

原创 zookeeper集群

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持LOOKING。

2023-09-19 09:36:05 270

原创 ELK+filebeat部署

根据前文elk的环境,需要额外一台服务器部署filebeat。

2023-09-17 11:22:05 59

原创 ELK部署

集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用 grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。

2023-09-17 11:19:59 313

原创 GFS分布式存储

File1 和 File2 存放在 Server1,而 File3 存放在 Server2,文件都是随机存储,一个文件(如 File1)要么在 Server1 上,要么在 Server2 上,不能分块同时存放在 Server1和 Server2 上。类似 RAID0,文件被分成数据块并以轮询的方式分布到多个 Brick Server 上,文件存储以数据块为单位,支持大文件存储, 文件越大,读取效率越高,但是不具备冗余性。创建卷时,存储服务器的数量如果等于条带或复制数,那么创建的是条带卷或者复制卷;

2023-09-13 11:09:57 375

原创 rsync 远程同步

Rsync 是 Linux 系统下的数据镜像备份工具,使用快速增量备份工具 Remote Sync 可以远程同步, 可以在不同主机之间进行同步,可实现全量备份与增量备份,保持链接和权限,且采用优化的同步算法, 传输前执行压缩,因此非常适合用于架构集中式备份或异地备份等应用。rsync(Remote Sync,远程同步) 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。

2023-09-12 08:43:51 108

原创 redis主从复制

(4)Master机器收到Slave端机器的连接后,将其完整的数据文件发送给Slave端机器,如果Mater同时收到多个Slave发来的同步请求,则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。●自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其它从节点改为复制新的主节点。●哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。

2023-09-08 10:56:39 126

原创 redis高可用

为了提高文件写入效率,在现代操作系统中,当用户调用write函数将数据写入文件时,操作系统通常会将数据暂存到一个内存缓冲区里,当缓冲区被填满或超过了指定时限后,才真正将缓冲区的数据写入到硬盘里。持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;everysec是前述两种策略的折中,是性能和数据安全性的平衡,因此是Redis的默认配置,也是我们推荐的配置。

2023-09-08 08:36:58 104

原创 redis基础与安装

Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。要支持更多并发量,SQL数据库是纵向扩展,也就是说提高处理能力,使用速度更快速的计算机,这样处理相同的数据集就更快了。例如,在读写分离的MySQL数据库环境中,可以把经常访问的数据存储在非关系型数据库中,提升访问速度。非关系型数据库的数据保存在缓存中,利于快速读取与查询数据,非关系型数据库在架构中的位置灵活,采用的是分布式架构,扩展性高。select:切换数据库。

2023-09-07 09:18:08 132

原创 mha高可用

MHA 的出现就是解决MySQL 单点的问题,MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作,MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。●使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。●自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。三,mha的重要配置文件。

2023-09-05 18:22:19 132

原创 mysql主从复制与读写分离

其中当有数据写入主的时候,会被存储为二进制日志,从服务器的io进程会每隔一段时间定时访问主的dump进程,主的dump进程监听到访问后会发送二进制日志给io,从会将二进制日志存储为中继日志,最后由sql将中继日志捞出并执行到自己数据库内部。所以读写分离,解决的是,数据库的写入,影响了查询的效率。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。(2)ROW:基于行的复制。

2023-09-04 10:15:54 1375

原创 mysql连接查询与存储过程

当需要使用该存储过程时,只需要调用它即可。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足。

2023-09-01 17:36:47 423

原创 mysql高阶语句

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,可以使用 ORDER BY 语句来对语句实现排序,并最终将排序后的结果返回给用户。

2023-08-31 11:21:24 773

原创 mysql日志管理,备份与恢复

只有那些在上次完全备份或者增量备份后被修改的文件才会被备份以上次完整备份或上次增量备份的时间为时间点,仅备份期间内的数据变化,因而备份的数据量小,占用空间小,备份速度快。每次对数据进行完整备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础完全备份的备份与恢复操作都非常简单方便,但是数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长。备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份数据量会越来越大。

2023-08-30 11:14:43 118

原创 mysql事物和存储引擎

案列:假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。悲观锁:是采用一种持悲观消极的态度,默认数据被外界访问时,必然会产生冲突,所以在数据处理的整个过程中都采用加锁的状态,保证同一时间,只有一个线程可以访问到数据,实现数据的排他性。这是由于查询时系统中其他事务修改的提交而引起的。

2023-08-29 11:25:23 287

原创 mysql索引

1,若存储引擎是myisam,则索引需要占用额外的磁盘空间。2,当表很大或者查询涉及多个表的时候,可以成千上万倍的提高查询速度。4,组合索引:多列多字段组合的形式的索引,按照排序的顺序,否则无效。3,主键索引:特殊的主键索引,一般会随主键一起创建,不允许空值。3,可以降低数据库的IO成本,并且还可以降低数据库的排序成本。2,在插入和修改数据时要花费更多的时间,因为索引也要随之变动。4,经常与其他表进行连接的表,在连接字段上应该建立索引。1,普通索引:针对所有字段,没有特殊的需求和规则。

2023-08-28 11:18:26 91

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除