首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes(K8s) —— 容器编排管理技术

Kubernetes(K8s) —— 容器编排管理技术

作者头像
时间静止不是简史
发布2021-08-12 10:53:49
1.6K0
发布2021-08-12 10:53:49
举报
文章被收录于专栏:Java探索之路Java探索之路

K8s 容器编排管理技术

第一章 是什么

1. 背景

  • 一开始使用物理机部署项目, 但物理机成本较高
  • 为了节约成本和资源隔离, 开发了虚拟机技术, 但是其启动慢占用空间大, 非常浪费资源
  • 为了解决上述问题, 容器化技术应运而生. 启动快占用小. Docker 是应用最为广泛的容器技术
  • 随着微服务技术的广泛应用,部署项目容器的数量越来越多,由此衍生了管理容器的重大问题。Google 在 2014 年开源了容器编排引擎 Kubernetes,用于管理容器化应用 程序的部署、规划、和扩展,使我们应用的部署和运维更加方便。

注意事项

2. 基础概念

Kubernetes 来自于希腊语,含义是舵手或领航员,简称 k8s。是一种基于GO开发的开源的容器编排管理工具. 类似的容器编排工具有:Docker swarm、Apache Mesos 等

Pod

在 Kubernetes 集群中,Pod 是 k8s 管理的最小单位,它是一个或多个容器的组合。 在 Pod 中,所有容器都被统一安排和调度。 Pod 中的容器有两个特点。

  • 共享网络:Pod 中的所有容器共享同一个网络命名空间,包括 IP 地址和网络端口。
  • 共享存储:Pod 中的所有容器能够访问共享存储卷,允许这些容器共享数据。
在这里插入图片描述
在这里插入图片描述

在常见的微服务中, 往往会部署多个微服务. 而为了保证高可用, 往往需要部署一个以上具有相同功能的微服务. 但是如果让这两个接口能够同时生效的话往往需要nginx该改微服务进行反向代理, 而Pod的出现则解决了该问题, 同一个pod来存放一个以上相同业务功能的容器, 并且共享同一网络和存储

控制器

k8s 通过控制器管理和调度 Pod。k8s 有以下几种控制器:

  1. ReplicationController/ReplicaSet RC 能够确保容器的副本数始终保持用户定义的副本数。即如果有容器异常退出, 会自动创建新的 Pod 来替代,而由于异常多出来的容器也会自动回收。RS 跟 RC 没有 本质不同,新版本的 k8s 建议使用 ReplicaSet 取代 ReplicationController。 虽然 RS 可以独立使用,但一般还是建议使用 Deployment 自动管理 RS。
在这里插入图片描述
在这里插入图片描述
  1. Deployment Deployment 为 Pod 和 RS 提供了声明式定义方式管理应用,用来替代 RS 命令式定义方式管理应用。且 Deployment 提供了很多 RS 不支持的机制,比如滚动升级( 类似游戏中的不停服更新 )和回滚应用。
  2. DaemonSet DaemonSet 确保 Node 上只运行一个 Pod。当有 Node 加入集群时,会为集群新 增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。
  3. Job Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod成功结束。 比如运行一次 SQL 脚本
  4. Cron job 负责执行定时任务,即在给定时间点执行一次或周期性地在给定时间点执行任务

注意:

  • 命令式:侧重于如何实现程序,就像我们刚接触编程的时候那样,我们需要把程序的实现过程按照逻辑结果一步步写下来。
  • 声明式:侧重于定义想要什么,然后告诉计算机,让它帮你去实现。
  • 滚动升级和回滚应用是通过操作两个RS来实现的, 大致过程是首先会在第一个RS减去一个pod, 然后会在另一个RS加上一个pod. 以此类推.

Service

Service 可以管理多个 Pod 作为一个整体被外部访问。在 k8s 中有以下四种类型的 Service:

  • ClusterIP 默认类型,自动分配一个仅集群内部可以访问的虚拟 IP
  • NodePort 在 ClusterlP 基础上为 Service 绑定一个端口,可以通过该端口访问服务。
  • LoadBalancer 在 NodePort 的基础上创建一个负载均衡器,并将请求转发到 NodePort。
  • ExternalName 把集群外部的服务引入到集群内部,在集群内部直接使用

3. 架构

在这里插入图片描述
在这里插入图片描述

Master 节点

Master 节点是集群控制节点,负责管理和控制整个集群。基本上 k8s 的所有控制命令都发给它,它负责具体的执行过程。在 Master 上主要运行着:

  • apiserver: 提供了集群管理的接口及模块之间的数据交互和通信的枢纽。
  • etcd:保存整个集群的状态。
  • controllers:自动化控制中心,负责维护管理集群状态,如:故障检测,自动扩展, 滚动更新等。
  • scheduler: 负责资源调度,按照预定的调度策略将 Pod 调度到相应的机器上。

Node 节点

除 master 以外的节点被称为 Node 节点,每个 Node 都会被 Master 分配一些工作 负载(Docker 容器),当某个 Node 宕机时,该节点上的工作负载就会被 Master 自动转移到其它节点上。在 Node 上主要运行着:

  • kube-proxy:实现 service 的通信与负载均衡。
  • kubelet:用来处理 Master 节点下发到本节点的任务,管理 Pod 和其中的容器。
  • container runtime:运行容器所需要的一系列程序

第二章 环境搭建与安装

搭建 Kubernetes 集群有多种方式:二进制包、kubeadm、第三方工具、云平台一键安装等方式都可以,这里我们采用 kubeadm 搭建 Kubernetes 集群

kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具 能通过两条指令完成一个 kubernetes 集群的部署:

创建 Master 节点
kubeadm init 
将 Node 节点加入到 Master 节点中 
kubeadm join <Master 节点的 IP 和端口>

1. 虚拟机集群搭建

  • 操作系统 CentOS7 以上
  • 硬件配置:内存 2G 以上,CPU 2 核以上
  • 集群内各个机器之间能相互通信,可以访问外网
  • 禁止 swap 分区 swap 分区:即硬盘交换区,当内存不够用时,可以临时使用硬盘中的这部分空间。

创建三台 Linux 虚拟机

创建三台 Linux 虚拟机,一台作为 Master 节点,两台作为 Node 节点。 每台系统为 CentOS7,CPU 双核,内存 2G,硬盘 100G,网络选择桥接模式。 安装好后使用 SSH 工具(如 XShell)连接虚拟机,方便操作。 相关软件和虚拟机光盘映像文件分享至底部百度云

命令批执行技巧

这里需要注意的是这些配置三台机器都需要配置, 可以使用xshell 撰写窗格功能, 作用是可以批量执行这些命令 可以在xshell 最上方工具栏的 查看 -> 撰写 -> 撰写窗格中打开 选择全部会话, 即可将当前打开的所有会话窗口都执行一样的命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. K8s相关软件安装

Kubernetes 的每个节点都需要安装 Docker、kubeadm、kubelet、kubectl

  • Docker:Kubernetes 默认容器运行环境是 Docker,因此首先需要安装 Docker
  • Kubectl:k8s 命令行工具,通过 kubectl 可以部署和管理应用,查看各种资源,创建、 删除和更新组件
  • Kubeadm:用于构建 k8s 集群
  • Kubelet:负责启动 POD 和容器

Docker安装配置

所有命令都需要批执行(master, node1, node2)

# 1. 安装yum必要的一些工具集
sudo yum install -y yum-utils device-mapper-persistent-data

# 2. 配置yum 镜像源, 加速yum 下载相关软件的速度, 选择任何一个源即可
## 阿里源
 sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 清华源
 sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

# 3. 安装 Docker 
yum -y install docker-ce
## 如果 yum 下载过程中断开,造成 yum 程序锁定,可运行以下命令关闭 yum 程序 
rm -f /var/run/yum.pid

# 4. Docker 配置加速器加速镜像下载(让docker可以更快下载docker镜像)
mkdir -p /etc/docker 
touch /etc/docker/daemon.json 
cat >> /etc/docker/daemon.json << EOF 
{ 
"registry-mirrors": ["https://registry.docker-cn.com"] 
}
EOF

# 5. 开机自启动 docker 服务 
systemctl enable docker.service

K8s安装配置

命令虽长, 但是直接全部复制一次执行即可 所有命令都需要批执行(master, node1, node2)

# 1. 配置 yum 源镜像
##  通过 cat  /etc/yum.repos.d/kubernetes.repo 查看自己配置的文件有问题(例如有空格)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo 
[kubernetes] 
name=Kubernetes 
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 
enabled=1 
gpgcheck=1 
repo_gpgcheck=1 
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg 
EOF

# 2. 安装软件 
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y

# 3. 开机自启动k8s服务
systemctl enable kubelet.service

# 4. 查看是否安装成功 , 这种命令可以通过xshell撰写窗口一次执行所有命令
yum list installed | grep kubelet 
yum list installed | grep kubeadm 
yum list installed | grep kubectl 

# 5. 重启虚拟机
reboot

K8s部署配置

安装网络插件

只在master node 执行下面命令

# 1. 安装命令行上传下载软件 lrzsz (如果使用的是本博客分享的光盘镜像的话无需执行这一步, 默认已安装)
yum install -y lrzsz

# 2. 使用 rz 上传 kube-flannel.yml 文件, 文件在博客底部分享

# 3. 应用 kube-flannel.yml 文件得到运行时容器 
kubectl apply -f kube-flannel.yml

# 4. 等一会儿后查看节点状态(2min左右) 
kubectl get nodes

# 5. 如果需要删除节点, 则执行 
kubectl delete node 节点名
在这里插入图片描述
在这里插入图片描述

第三章 部署K8s容器化应用

容器化应用:把一个应用程序放在 docker 里部署,这个 docker 应用就是容器化应用, 在 docker 中我们通过启动镜像部署容器化应用

如何在 k8s 中部署容器化应用:

  1. 获取镜像:编写 Dockerfile 制作镜像,或者从仓库拉取镜像
  2. 控制器创建 pod:控制器启动镜像,创建容器并将容器放入 pod 中
  3. 暴露应用,使外界可以访问应用

1. K8s常用命令

# 查看节点 
kubectl get nodes (node)

# 查看 service 
kubectl get service 

# 查看控制器: 
kubectl get deployment (deploy) 

# 查看 pod
kubectl get pod 

# 删除 service 
kubectl delete service 服务名 

# 删除控制器 
kubectl delete deployment 控制器名 

# 删除 pod 
kubectl delete pod pod 名

2. 安装 nginx

图1

在这里插入图片描述
在这里插入图片描述

图2

在这里插入图片描述
在这里插入图片描述
  1. 关闭 nginx
# 1, 删除service (首先要通过kubectl get service查看要删除的service名称, 这里为nginx, 如图1)
## 删除Service以后其实相当于关闭Docker中的Container, nginx已经被关闭
kubectl delete service nginx

# 2. 删除控制器(图2)
kubectl get deploy
kubectl delete deploy nginx

# 3. 删除pod(图3)
## 因为控制器deployment用于管理pod, 所以在上一步我们将控制器删除后, 也将它管理的pod一并删除了
## 理论上删除pod命令不会用到, 具体原因可见下面注意事项
kubectl get pod
kubectl delete podname

注意: 
删除顺序不能相反, 不能先删除pod, 再删除控制器. 
因为控制器管理着pod, 你删除一个pod它会再次重启一个pod(图4)

图1

在这里插入图片描述
在这里插入图片描述

图2

在这里插入图片描述
在这里插入图片描述

图3

在这里插入图片描述
在这里插入图片描述

图4

在这里插入图片描述
在这里插入图片描述

3. 安装 Tomcat

# 1. 从仓库拉取镜像,通过deployment 控制器创建 pod
kubectl create deployment tomcat --image=tomcat
## 确认创建pod是否完成 , 确认该pod对应的 Ready是否为: 1/1 (准备完成), 0/1(未准备完成)
kubectl get pod 

# 2. 创建 service 暴露 pod 端口(图1)
kubectl expose deployment tomcat \
 --port=8080 \
 --type=NodePort
## 查看 Service暴露后对应的外部端口号, 在PORT(S) 属性后 8080: 后面的端口号
 kubectl get service

# 3. 访问(图2)
http://192.168.10.44:30471/

图1

在这里插入图片描述
在这里插入图片描述

图2

在这里插入图片描述
在这里插入图片描述

4. 部署 SpringBoot 项目

所需的 jdk以及springboot测试用jar已分享至底部百度云

构建 JDK 镜像

# 1. 创建Dockerfile文件
cat <<EOF > Dockerfile 
# 基于 centos7,如果没有这个镜像那么它会下载这个镜像。 
FROM centos:7 
# 创建者 
MAINTAINER timepause
# 复制文件到指定目录并自动解压(不是真实目录而是docker容器目录) 
ADD jdk-8u144-linux-x64.tar.gz /usr/local/jdk 
# 设置环境变量 
ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_144 
ENV CLASSPATH=.:$JAVA_HOME/lib 
ENV PATH=$JAVA_HOME/bin:$PATH:/usr/local/jdk/jdk1.8.0_144/bin 
EOF

# 2. 构建 JDK 镜像 (注意不要少了".")
docker build -t='jdk1.8' .

# 3. 查看所有的镜像,此时就多了一个 jdk1.8 17
docker images

# 4. 创建容器 
docker run -di --name=jdk1.8 jdk1.8 /bin/bash 

# 5. 进入容器 
docker exec -it jdk1.8 /bin/bash
java -version

构建项目镜像

# 1. 使用 maven 将项目打成 jar 包,使用 rz 上传到虚拟机中

# 2. 编写Dockerfile文件
cat <<EOF > Dockerfile 
FROM jdk1.8 
MAINTAINER timepause
ADD springboot-k8s-1.0.0.jar /opt 
RUN chmod +x /opt/springboot-k8s-1.0.0.jar 
CMD java -jar /opt/springboot-k8s-1.0.0.jar 
EOF

# 3. 构建项目镜像: 
docker build -t springboot-k8s-1.0.0.jar .

# 4. 使用镜像启动容器(外部访问端口8085)
docker run -d -p 8085:8080 springboot-k8s-1.0.0.jar

# 5. 访问测试
http://192.168.10.44:8085/demo
在这里插入图片描述
在这里插入图片描述

上传镜像

上传镜像到Docker官方仓库, 作用是方便其他节点下载, 否则其他节点就必须一个个去通过上面两个步骤去构建了

# 1. 注册登录 DockerHub 网站 
https://hub.docker.com

# 2. 在 DockerHub 创建镜像仓库 (springboot-k8s)
https://hub.docker.com/repositories

# 3. 在 master 节点登录 DockerHub
docker login

# 4. 将本地镜像修改为规范的镜像名称
docker tag docker 镜像名 注册用户名/仓库名

# 5. 上传镜像
docker push 注册用户名/仓库名

K8s集群部署

1. 命令行部署项目

kubectl create deployment springboot-k8s --image=注册用户名/仓库名

2. yml 文件部署项目

yml 文件是 k8s 的资源清单文件,我们可以通过 yml 文件精确修改构建参数。

暴露服务端口

暴露服务接口后, 外部便可访问

# 对外暴露pod端口
kubectl expose deployment springboot-k8s --port=8080 --type=NodePort
# 查看对外暴露端口
kubectl get service
在这里插入图片描述
在这里插入图片描述

访问项目

http://NodeIP:NodePort/资源路径
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. Ingress

Ingress 相当于是服务网关,可以通过 URL 路径代理 service,只需要暴露一个端口就可以满足所有 service 对外服务的需求,生产环境建议使用这种方式。(因为生产环境会对开放的端口进行严格的限制)

Ingress 产生的背景

  • 使用 LoadBalancer 暴露服务可以解决端口过多的问题,但 LoadBlancer 需要向云平台申请负载均衡器,与云平台的耦合度太高,相当于购买了服务。
  • NodePort 方式最大的缺点是每个 service 都要暴露端口,在部署微服务时会暴露大量 端口加大管理难度,所以在生产环境中不推荐使用这种方式来直接发布服务.
在这里插入图片描述
在这里插入图片描述

我们通过 kubectl create deployment pod-name 这种命令能够快速去安装k8s 软件,本质上还是通过 yml/yaml 去安装配置并运行相关软件(但没有暴露端口因此无法访问), 我们可以通过 kubectl get service 服务名 -o yaml 来查看这个配置文件

配置文件资源清单中有三个端口(如下图):

  • nodePort:定义外部访问的端口
  • port:定义集群内部通信的端口
  • targetPort:定义容器中服务的端口
在这里插入图片描述
在这里插入图片描述

安装部署 Ingress

. Ingress不是k8s的内置软件,需要单独安装,k8s官方使用Ingress Nginx实现Ingress功能

  1. 下载 Ingress Nginx 资源清单文件(也可以直接下载博客底部资料): wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/d eploy/static/provider/baremetal/deploy.yaml
在这里插入图片描述
在这里插入图片描述

6. 部署微服务项目

准备

我们准备一个微服务项目 demo,该项目只有一个功能:借阅图书。项目包括 eureka 注册中心,gateway 网关,用户服务,会员服务。借阅图书调用图书服务的方法,该方法 内会使用 Feign 调用会员服务的方法验证是否存在该会员。

在这里插入图片描述
在这里插入图片描述

注意事项

k8s 主要是针对无状态应用设计的,所以一般情况下我们不在 K8S 中部署有状态应用,如 mysql、Eureka 等。

  • 无状态应用:是指应用不会在会话中保存下次会话所需要的客户端数据。每一个会话都 像首次执行一样,不会依赖之前的数据进行响应。如 WEB 服务器。
  • 有状态应用:是指应用会在会话中保存客户端的数据,并在客户端下一次的请求中来使 用那些数据。如数据库、Eureka 注册中心。 案例中我们部署了 Eureka,但实际运维过程中一般不会将其放入 k8s 集群。

具体步骤:

在这里插入图片描述
在这里插入图片描述

补充: 可通过DashBoard 对部署的服务进行动态扩容

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7. DashBoard

DashBoard 是 k8s 的可视化管理工具,可以基于 web 对 k8s 集群进行集中管理。

8. Helm

Helm 是一个 k8s 的应用管理工具,可以很方便的通过管理 yaml 文件来部署应用,更新应用版本。目前 Heml 的 V3 版本发布,极大简化了之前繁琐的使用方式

出现背景: k8s 上的 deployment、service 等应用对象,都是由资源清单部署的。对于一个复杂的应用,会有很多类似的资源清单文件。例如微服务架构应用,组成应用的服务可能多达几 十个。如果有更新或回滚应用的需求,可能要修改维护大量 yml 文件。

Helm 中有 3 个重要概念:

  • helm:命令行客户端工具,能够进行 chart 的创建,项目打包、发布和管理。
  • chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
  • release:基于 chart 部署的资源,chart 被 helm 运行后将会生成对应 release。

安装 release

自定义 chart 安装 release

# 1. 构建 Chart 
helm create mychart 

# 2. 进入构建好的 Chart 
cd mychart/

# 3. 进入 template 文件夹 
cd template/

# 4. 删除文件夹内所有自带文件 
rm -rf *

# 5. 通过上面上传到docker hub的springboot生成 deployment 和 service 的 yml 文件
kubectl create deployment springboot-k8s --image=461618768/springboot-k8s --dry-run --output yaml > deployment.yaml
kubectl expose deployment springboot-k8s --port=8080 --type=NodePort --dry-run -o yaml > service.yaml

# 6. 退出到上一级目录 
cd ..

# 7. 如果之前通过k8s部署安装了springboot项目, 需要删除对应的service, deploy, pod. (反之直接执行下一步)
kubectl get all
kubectl delete service springboot-k8s
kubectl delete deploy springboot-k8s
kubectl delete pod springboot-k8s

# 8. 部署 release 
## helm 命令 . => 空格+点的作用是在当前文件下生效
helm install springboot-k8s .

# 9. 应用升级 helm (如下图)
## helm 命令 . => 空格+点的作用是在当前文件下生效
upgrade springboot-k8s .
在这里插入图片描述
在这里插入图片描述

使用 chart 模板安装 release

在上一个实操中, 我们自定义 chart 安装 release, 通过构建 Chart 生成了一个 mychart 文件夹, 我们可以通过修改这个文件下的values.yaml 来作为 chart 模板安装 release

9. 搭建高可用集群

Master 节点扮演着总控中心的角色。如果 Master 节点故障,将无法进行任何集群管理。搭建高可用集群即在集群中搭建多个 master 节点,保证集群的安全性和稳定性。

高可用集群架构

在这里插入图片描述
在这里插入图片描述

高可用集群技术图:

在这里插入图片描述
在这里插入图片描述

搭建高可用环境准备

在原来基础上 (1台k8s-master, 两台 node虚拟机外), 再额外安装一台新的虚拟机, 作为master节点宕机后的备用 master 节点

安装反向代理服务器 haproxy

重新部署 Master1 节点


点赞私聊获取这些资源哦~~~

微服务项目案例代码百度云链接:https://pan.baidu.com/s/1LMApff81raccNHeFB5l0rg

提1取码:vmwj

在这里插入图片描述
在这里插入图片描述

项目所需所有软件百度云链接:https://pan.baidu.com/s/1m1wACTkCufPjbkD8-3xaeQ 点赞关注+私信获取提取码

提取码:y0ua

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-06-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • K8s 容器编排管理技术
  • 第一章 是什么
    • 1. 背景
      • 2. 基础概念
        • Pod
        • 控制器
        • Service
      • 3. 架构
      • 第二章 环境搭建与安装
        • 1. 虚拟机集群搭建
          • 命令批执行技巧
        • 2. K8s相关软件安装
          • Docker安装配置
          • K8s安装配置
          • K8s部署配置
          • 安装网络插件
      • 第三章 部署K8s容器化应用
        • 1. K8s常用命令
          • 2. 安装 nginx
            • 3. 安装 Tomcat
              • 4. 部署 SpringBoot 项目
                • 构建 JDK 镜像
                • 构建项目镜像
                • 上传镜像
                • K8s集群部署
                • 暴露服务端口
                • 访问项目
              • 5. Ingress
                • 6. 部署微服务项目
                  • 准备
                  • 注意事项
                  • 具体步骤:
                • 7. DashBoard
                  • 8. Helm
                    • 安装 release
                    • 自定义 chart 安装 release
                    • 使用 chart 模板安装 release
                  • 9. 搭建高可用集群
                    • 搭建高可用环境准备
                    • 安装反向代理服务器 haproxy
                    • 重新部署 Master1 节点
                相关产品与服务
                容器镜像服务
                容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档