从头开始搭建kubernetes集群+istio服务网格(1)—— 前期准备、安装docker、kubernetes_kubernetes docker 18.09.8-程序员宅基地

技术标签: 微服务  服务网格  kuernetes  istio  

(win10 + virtualbox6.0 + centos7.6.1810 + docker18.09.8 + kubernetes1.15.1 + istio1.2.3)

本文参考网址:
https://www.jianshu.com/p/e43f5e848da1
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
https://www.jianshu.com/p/1aebf568b786
https://blog.csdn.net/donglynn/article/details/47784393
https://blog.csdn.net/MC_CodeGirl/article/details/79998656
https://blog.csdn.net/andriy_dangli/article/details/85062983
https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/calico
https://www.jianshu.com/p/70efa1b853f5
https://blog.csdn.net/weixin_44723434/article/details/94583457
https://preliminary.istio.io/zh/docs/setup/kubernetes/download/
https://www.cnblogs.com/rickie/p/istio.html
https://blog.csdn.net/lwplvx/article/details/79192182
https://blog.csdn.net/qq_36402372/article/details/82991098
https://www.cnblogs.com/assion/p/11326088.html
http://www.lampnick.com/php/823
https://blog.csdn.net/ccagy/article/details/83059349
https://www.jianshu.com/p/789bc867feaa
https://www.jianshu.com/p/dde56c521078

本系列分为三章,第一章是创建虚拟机、docker、kubernetes等一些基础设施;第二章是在此基础上创建一个三节点的kubernetes集群;第三章是再在之上搭建istio服务网格。
本文参考了大量其他优秀作者的创作(已经在开头列出),自己从零开始,慢慢搭建了istio服务网格,每一步都在文章中详细地列出了。之所以要自己重新从头搭建,一方面是很多CSDN、简书或其他平台的教程都已经离现在(2019.8.14)太过遥远,变得不合时宜,单纯地照着别人的路子走会遇到非常多的坑;另一方面是实践出真知。
由于我也是刚开始学习istio服务网格,才疏学浅,难免有不尽如人意的地方,还请见谅。

1 系统CentOS 下载

官网下载
DVD ISO:标准安装版,一般下载这个就可以了(推荐)
Minimal ISO:迷你版,小巧、安装快速、自带的软件少
DVD ISO:标准安装版,一般下载这个就可以了(推荐)Everything ISO:对完整版安装盘的软件进行补充,集成所有软件。(包含CentOS7的一套完整的软件包,可以用来安装系统或者填充本地镜像)Minimal ISO:迷你版,小巧、安装快速、自带的软件少
点进去之后选择阿里云
在这里插入图片描述然后就是正常的下载

2 虚拟机 virtualbox 下载

官网下载
之所以选择virtualbox 而不是vmware,是因为另一个教程上这样做的,所以…,等搭建完熟悉流程后就可以随心所欲啦。
在这里插入图片描述正常下载
在这里插入图片描述

3 创建虚拟机

打开安装好的VirtualBox,新建
在这里插入图片描述控制→新建
如下图进行设置
在这里插入图片描述内存至少2G
在这里插入图片描述默认
在这里插入图片描述在这里插入图片描述在这里插入图片描述虚拟硬盘至少20G
在这里插入图片描述创建成功
在这里插入图片描述接下来安装操作系统
点击设置
在这里插入图片描述如图

在这里插入图片描述选择之前下载好的 .iso 文件,正常安装 。
开启虚拟机,安装CentOS。
一些注意选项如下:
在这里插入图片描述如下图正在安装
在这里插入图片描述重启完成安装。
在这里插入图片描述

4 将xshell和虚拟机连接起来

接下来进行虚拟机的配置。由于直接在VirtualBox里操作bash是一件非常恶心的事情,我们使用第三方的终端模拟软件来控制虚拟机,本文选择的是xshell,当然其他的也可以。
返回virtualbox的控制界面,点开设置。
在这里插入图片描述

由于VirtualBox
默认使用NAT网络转换,宿主机无法直接访问虚拟机,但我们只要简单的在NAT网卡上添加端口转发,即可访问虚拟机。这里,我们通过端口转发暴露虚拟机的SSH端口(22),就可以远程连接到虚拟机。
在设置中,选择“网络”=>“网卡1”>=“高级”>=“端口转发”:

在这里插入图片描述

在我们真实的物理机上,可以利用Xshell,通过端口9000连接到虚拟机终端上。打开Xshell,新建一个连接。注意,因为端口是映射到宿主机上的,所以主机地址要填写为127.0.0.1:

打开Xshell如下配置新建会话。
在这里插入图片描述登陆成功(这里折腾了一会)
在这里插入图片描述

关闭图形界面 CentOS 7
安装好后,登录时默认启用了很占资源的图形界面,若启动三个虚拟机更会卡的飞起。因此,我们可以通过如下命令切换默认的登录方式:

命令模式 systemctl set-default multi-user.target

图形模式 systemctl set-default graphical.target
这里,强烈建议切换为命令模式,所有的操作都通过Xshell进行足以。注意,上面的命令执行后重启生效。

试了很多次一直失败,如下
在这里插入图片描述然后发现是需要需要进入root,使用su直接进入继续失败。

[centos_master@localhost ~]$ su
密码:
su: 鉴定故障

继续查资料,修改成

[centos_master@localhost ~]$ sudo su root

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] centos_master 的密码:
[root@localhost centos_master]# ^C
[root@localhost centos_master]# systemctl set-default multi-user.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
[root@localhost centos_master]# 

成功!
重启虚拟机,已经成功从图形界面变成命令模式。

备注:之后基本使用xshell连接虚拟机之后的第一件事就是sudo su root

在这里插入图片描述

5 虚拟机的一些基础配置

5.1 配置yum源

不建议使用CentOS 7自带的yum源,因为安装软件和依赖时会非常慢甚至超时失败。这里,我们使用阿里云的源予以替换,执行如下命令,替换文件/etc/yum.repos.d/CentOS-Base.repo:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
yum makecache

5.2 关闭防火墙

防火墙一定要提前关闭,否则在后续安装K8S集群的时候是个trouble maker。执行下面语句关闭,并禁用开机启动:

[root@localhost centos_master]# systemctl stop firewalld & systemctl disable firewalld
[1] 4223
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

5.3 关闭Swap

类似ElasticSearch集群,在安装K8S集群时,Linux的Swap内存交换机制是一定要关闭的,否则会因为内存交换而影响性能以及稳定性。这里,我们可以提前进行设置。

临时关闭swap分区, 重启失效:

swapoff -a

永久关闭swap分区:

sed -ri 's/.*swap.*/#&/' /etc/fstab

建议永久关闭,之后如下图即为正常:
在这里插入图片描述

6 安装docker

安装kubernetes前,必须要先安装Docker。

6.1 添加阿里云的Docker仓库

[root@localhost centos_master]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost centos_master]# yum makecache

6.2 执行以下命令,安装最新版Docker

[root@localhost centos_master]# yum install docker-ce -y

6.3 安装成功后,如下图所示

在这里插入图片描述

运行docker --version,可以看到安装了截止目前最新的18.09.8版本:

[root@localhost centos_master]# docker --version
Docker version 18.09.8, build 0dd43dd87f

6.4 启动Docker服务并激活开机启动

[root@localhost centos_master]# systemctl start docker & systemctl enable docker

6.5 验证

[root@localhost centos_master]# docker run hello-world

在这里插入图片描述成功~

7 安装kubernrtes

建议使用阿里源的仓库,执行以下命令添加kubernetes.repo仓库

[root@localhost centos_master]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# vim kubernetes.repo

出现如图
在这里插入图片描述

7.1 关闭swap、防火墙(之前已经关闭),可忽视。

7.2 关闭SeLinux

执行

setenforce 0

7.3 安装kubelet、kubeadm、kubectl

两种方式,因为我用的时候是1.15.1的版本,所以如果想完全跟着我的教程走的话,推荐第二种。
1.执行以下命令(安装最新版)

yum install -y kubelet kubeadm kubectl

2.执行以下命令(安装指定版本1.15.1)

yum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1

emmmm报错
在这里插入图片描述重新尝试,清一下缓存

yum clean all
yum makecache

接着顺手升级一下yum

yum -y update

重新安装kubelet、kubeadm、kubectl
在这里插入图片描述成功~

7.4 判断docker 的cgroup drive和kubelet的cgroup drive是否一样

在这里插入图片描述首先解决这两个警告

vim /etc/sysctl.conf

接着添加如下内容

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

最后执行

sysctl -p

接下来重启虚拟机
在这里插入图片描述警告消失~
备注:这里有个坑,虽然我们这里cgroup drive两者都是cgroupfs,是一样的。但是!在后面我们需要把这两者都改成systemd。不过现在可以不用管,后面可以再改;也可以直接参考第二章的2.2节跳过这个坑。

正常启动kubelet

[root@localhost centos_master]# systemctl enable kubelet && systemctl start kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

7.5 列出需要的镜像

使用kubeadm config images list列出我们需要的镜像

[root@localhost centos_master]# kubeadm config images list
W0723 18:09:53.292065    5839 version.go:98] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
W0723 18:09:53.292483    5839 version.go:99] falling back to the local client version: v1.15.1
k8s.gcr.io/kube-apiserver:v1.15.1
k8s.gcr.io/kube-controller-manager:v1.15.1
k8s.gcr.io/kube-scheduler:v1.15.1
k8s.gcr.io/kube-proxy:v1.15.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

得到所有需要的组件,也就是以下七个组件。
k8s.gcr.io/kube-apiserver:v1.15.1
k8s.gcr.io/kube-controller-manager:v1.15.1
k8s.gcr.io/kube-scheduler:v1.15.1
k8s.gcr.io/kube-proxy:v1.15.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
接着参考下面的这堆代码进行配置(一行一行地输入命令),这个地方需要十分小心!!

这里下载v1.15.1版本   
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.15.1
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.15.1
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.15.1
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.15.1
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.10
docker pull coredns/coredns:1.3.1

镜像打标
docker tag  mirrorgooglecontainers/kube-apiserver-amd64:v1.15.1 k8s.gcr.io/kube-apiserver:v1.15.1
docker tag  mirrorgooglecontainers/kube-scheduler-amd64:v1.15.1 k8s.gcr.io/kube-scheduler:v1.15.1
docker tag  mirrorgooglecontainers/kube-controller-manager-amd64:v1.15.1 k8s.gcr.io/kube-controller-manager:v1.15.1
docker tag  mirrorgooglecontainers/kube-proxy-amd64:v1.15.1 k8s.gcr.io/kube-proxy:v1.15.1
docker tag  mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10
docker tag  mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag  coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

镜像分发打包
docker save -o k8s-master.tar.gz  `docker image ls |grep k8s |awk '{position=$1":"$2;print $1,position}' |awk '{print $2}'`

导入镜像
[root@master ~]# docker load -i k8s-master.tar.gz 
Loaded image: k8s.gcr.io/etcd:3.3.10
Loaded image: k8s.gcr.io/pause:3.1
Loaded image: k8s.gcr.io/kube-proxy:v1.15.1
Loaded image: k8s.gcr.io/kube-apiserver:v1.15.1
Loaded image: k8s.gcr.io/kube-controller-manager:v1.15.1
Loaded image: k8s.gcr.io/kube-scheduler:v1.15.1
Loaded image: k8s.gcr.io/coredns:1.3.1

成功~如图

[root@localhost centos_master]# docker images
REPOSITORY                                                    TAG                 IMAGE ID            CREATED             SIZE
mirrorgooglecontainers/kube-controller-manager                v1.15.1             d75082f1d121        5 days ago          159MB
k8s.gcr.io/kube-controller-manager                            v1.15.1             d75082f1d121        5 days ago          159MB
mirrorgooglecontainers/kube-apiserver-amd64                   v1.15.1             68c3eb07bfc3        5 days ago          207MB
mirrorgooglecontainers/kube-apiserver                         v1.15.1             68c3eb07bfc3        5 days ago          207MB
k8s.gcr.io/kube-apiserver                                     v1.15.1             68c3eb07bfc3        5 days ago          207MB
mirrorgooglecontainers/kube-proxy                             v1.15.1             89a062da739d        5 days ago          82.4MB
k8s.gcr.io/kube-proxy                                         v1.15.1             89a062da739d        5 days ago          82.4MB
mirrorgooglecontainers/kube-scheduler                         v1.15.1             b0b3c4c404da        5 days ago          81.1MB
k8s.gcr.io/kube-scheduler                                     v1.15.1             b0b3c4c404da        5 days ago          81.1MB
mirrorgooglecontainers/kube-apiserver-amd64                   v1.15.0             201c7a840312        4 weeks ago         207MB
k8s.gcr.io/coredns                                            1.3.1               eb516548c180        6 months ago        40.3MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns   1.3.1               eb516548c180        6 months ago        40.3MB
hello-world                                                   latest              fce289e99eb9        6 months ago        1.84kB
mirrorgooglecontainers/etcd                                   3.3.10              2c4adeb21b4f        7 months ago        258MB
k8s.gcr.io/etcd                                               3.3.10              2c4adeb21b4f        7 months ago        258MB
mirrorgooglecontainers/pause                                  3.1                 da86e6ba6ca1        19 months ago       742kB
k8s.gcr.io/pause                                              3.1                 da86e6ba6ca1        19 months ago 

8 复制虚拟机

当Node1的Kubernetes安装完毕后,就需要进行虚拟机的复制了。复制前需要退出虚拟机,我们选择“正常关机”。右键虚拟机点击复制:
在这里插入图片描述

注意上述的所有箭头。点击“复制”,稍等几分钟,即可完成复制,一共复制两台。
现在我们就有了三个虚拟机,master、node2、node3。
复制结束后,不要马上启动虚拟机,而先要为每一个虚拟机添加一个网卡,用于节点间的互通访问。如下图所示,连接方式选择“Host-Only”模式:
在这里插入图片描述
网卡添加结束后,启动三个虚拟机,查看各个IP。以主节点master为例,运行ip addr
在这里插入图片描述可以看到,网卡enp0s8为新添加的网卡2,IP地址为192.168.56.103。三个节点IP分别为:

master:192.168.56.103
Node2:192.168.56.101
Node3:192.168.56.102

三台虚拟机互相ping一下瞅瞅网络连通性。
接着根据之前master连接xshell的步骤,使用xshell连接另外两台虚拟机,只是把主机端口分别改成9023、8081。

网卡添加结束后,即可启动三个虚拟机,我们需要进行一些简单的设置,以主节点Node1为例:

编辑/etc/hostname,将hostname修改为k8s_master

编辑/etc/hosts,追加内容IP k8s_master,其中上IP为网卡2的IP地址,修改后重启生效。另外两个节点修改同理,主机名分别为k8s_node2、k8s_node3。

(这里也折腾了很久,后来发现正确的步骤是用vi打开之后,再点一下i进入编辑模式,编辑好之后,点Esc,接着输入:wq保存退出;另外编辑hostname时用hostnamectl set-hostname 主机名 同样可以)
备注:这里有个坑,主机名中不要有_,在第二章中我折腾了很久才发现这个问题,所以这里可以把主机名直接改为k8s-master、k8s-node2、k8s-node3跳过这个坑。
最后,输入hostname可以看到当前的hostname。

9 小结

目前我们有了三个虚拟机,每个虚拟机上都有docker、kubernetes。下一章我们开始正式创建集群。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42711936/article/details/96897915

智能推荐

Golang Web 实战_golang web 项目实战-程序员宅基地

文章浏览阅读1.6k次。Golang Web 实战1. 前言在开发一个应用,也就是我们俗称 App 时,最低的配置是需要一个前端和一个后端。由前端技术人员为用户开发接触到的页面,由后端为前端的各类用户事件提供处理和数据响应。比较常见的,如手机 App 应用(QQ、微信),网页 Web 应用(GitChat、CSDN 页面),桌面应用(YY、QQ 游戏)…… 不管是什么应用,都需要有后端技术与之匹配。而我们今天介绍的,..._golang web 项目实战

C++11 mutex方便的自解锁lock_guard_std mutex cpprefer-程序员宅基地

文章浏览阅读1.6w次。下面是cpprefrence里的使用mutex的代码。 #include #include #include #include #include #include std::map g_pages; std::mutex g_pages_mutex; void save_page(const std::string &url) { // si_std mutex cpprefer

LINUX学习-用C语言实现FTP项目_linux 下c语言开发ftp下载工具-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏23次。FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,..._linux 下c语言开发ftp下载工具

【小白必胜-xpath】lxml.etree.HTML(),lxml.etree.fromstring()和lxml.etree.tostring()三者的区别与联系_html.fromstring()含义-程序员宅基地

文章浏览阅读3.5k次,点赞5次,收藏30次。对于使用xpath()之前的文档格式化问题,可能不同的人,会遇到不一样的情况,但是基本上只要搞懂了lxml.etree.HTML(),lxml.etree.fromstring()和lxml.etree.tostring()这三者之间的区别和联系,那么文档格式化这一步一定不会有问题……_html.fromstring()含义

Android过渡动画基础使用_gradentdrawable过渡-程序员宅基地

文章浏览阅读2k次。前言Android从API19引入了Transition过渡动画框架,它通过场景Scene概念来表述动画的关键帧,只要提供了开始和结束场景的内容就会自动做动画。过渡动画其实是对属性动画的一种封装,它能够一次对多个对象做动画而不需要特别复杂的配置。除此之外Activity之间的切换效果也可以使用过渡动画来实现。基础使用首先需要定义Scene也就是场景对象,场景其实就是某个事件点所有的..._gradentdrawable过渡

h2ouve工具使用_GitHub - sha310139/Edit_BIOS_Setting_Interface: H2OUVE是使用command修改BIOS設定的工具,此介面結合H2OUVE,對...-程序员宅基地

文章浏览阅读4.7k次。Edit_BIOS_Setting_Interface簡介H2OUVE是個可透過command的方式修改BIOS設定的工具,我們利用Python3撰寫一個簡易的介面,透過H2OUVE去修改BIOS的設定,省去使用者一一下指令並修改設定檔的麻煩。當多台server需套用同一個BIOS設定時,只要先針對一台電腦修改所需的BIOS設定,匯出設定檔後,即可透過deploy kit執行這個程式,讓多台ser..._h2ouve

随便推点

AMD GPU 内核驱动分析(三)-gpu scheduler ring fence同步工作模型_dma_fence_put-程序员宅基地

文章浏览阅读968次,点赞3次,收藏4次。在Linux Kernel 的AMDGPU驱动实现中,dma-fence扮演着重要角色,AMDGPU的Render/解码操作可能涉及到多个方面同时引用buffer的情况,以渲染/视频解码场景为例,应用将渲染/解码命令写入和GPU共享的BUFFER之后,需要将任务提交给GPU的运行队列等待执行,这个时候,应用不仅要监听buffer中任务的执行情况,还要保证在任务执行完毕之前,不能再去修改BUFFER中的数据。而AMDGPU也需要排它性地执行BUFFER命令。_dma_fence_put

excel培训机构_中金中国企业跨境并购流程、重点问题和交易架构设计(内部培训)42页...-程序员宅基地

文章浏览阅读486次。今天,资本库新增最新资料▼中金-跨境并购流程管理和交易架构设计下载IPO、并购重组最新内部文件扫描下方二维码下载审计、法律、投行、评估最新资料资本数据库原价449元扫描闫总微信二维码今天加入资本库,优惠价格298元并购圈隆重推出资本市场精选资料数据库,聚焦最新、最优资本市场政策解读资料,投资尽调资料,财务审计、资产评估、法律、保代培训资料,会计师事务所工作底稿、资产评估机构工作底稿......_跨境并购中的法律尽调 培训

快速从0-1完成聊天室开发——环信ChatroomUIKit功能详解_环信快速搭建聊天室-程序员宅基地

文章浏览阅读1.1k次,点赞26次,收藏13次。环信 Chatroom UIKit 采用最新的 UI 框架和开发语言,可以快速上手。同时,该 UIKit 对标国际主流的社交应用,提供开箱即用的社交组件,一方面,可以快速将其集成到自己的应用程序中,另一方面还支持对功能组件进行自定义,灵活定制符合自身需求的聊天室应用。弹幕消息是聊天室最为核心的功能。环信 Chatroom UIKit 支持业内主流的消息样式,包括发送时间显示、用户身份标识、用户头像、昵称等元素,提供极为灵活的弹幕消息自定义能力。还可以根据业务需要,通过开关控件控制所有元素的显示或隐藏。_环信快速搭建聊天室

RUST——封装的实现_rust 封装-程序员宅基地

文章浏览阅读685次。rust对象封装学习笔记_rust 封装

DSP_TMS320F2802x_CMPSS逐波限流功能实现_dsp逐波限流-程序员宅基地

文章浏览阅读4.6k次,点赞4次,收藏49次。此功能为了使过流时进行单拍电流进行封波设定,实现逐波限流 DAC->COMP->DCEVT->TZ.CBC(1)Comp 设定如下:AIO->COMPGpioCtrlRegs.AIOMUX1.bit.AIO2 = 0; // Configure AIO2 for CMP1A (analog input) operationComp1Regs.COMPCTL.bit.SYNCSEL = 1; // Sync with SYSCLK / use Qualif._dsp逐波限流

对留学最有用的8种英语考试_哪类考试单词到了国外贴合日常使用-程序员宅基地

文章浏览阅读1k次。 1. IELTS 中文通常译作“雅思”,是前往英联邦国家留学或移民参加的一种英语水平考试。考试内容分移民类(G类)和学术类(A类),包括听、说、读、写四部分。G类与A类只在阅读和写作两个单项上有区别,考试形式为笔试,满分为9分,中国学生的成绩集中于4-7分之间。英语全称: International English Language Testing System 考试时间: 16_哪类考试单词到了国外贴合日常使用

推荐文章

热门文章

相关标签