



本节构建一个虚拟机节点centos8,它将作为表2-1中master和node01的基础节点。本节将从零开始,依次介绍定制VMware虚拟机centos8、在centos8节点上最小化安装Linux发行版CentOS 8、实现centos8远程登录和文件传输、ssh远程无密码登录和Docker的安装与使用,这些都将为下一步构建Kubernetes集群打下基础,具体说明如下。
所谓定制虚拟机,就是利用虚拟机软件“VMware Workstation”来创建一台符合用户要求的虚拟机。这台虚拟机和真实的物理机一样,有CPU、内存、硬盘和网卡等,其CPU的核数、内存的大小、硬盘的大小和网卡的个数可以根据用户的要求定制。
本节属于实践内容,因为后续章节都会用到此部分内容所构建的虚拟机, 所以本实践必须完成 。请参考本书配套免费电子书 《Kubernetes快速进阶与实战——实践教程》 中的“ 实践1:定制虚拟机 ”。
上一节定制了centos8虚拟机,本小节将在该虚拟机上安装CentOS 8。本节内容属于实践内容,因为后续章节都会用到此部分内容所安装的CentOS 8, 所以本实践必须完成 。请参考本书配套免费电子书 《Kubernetes快速进阶与实战——实践教程》 中的“ 实践2:最小化安装CentOS 8 ”。
本节介绍远程登录工具ssh和PuTTY,以及文件传输工具scp和WinSCP的使用。其中ssh和scp运行在Linux下,PuTTY和WinSCP运行在Windows下,它们都是Linux系统操作和运维的常用工具。
本节内容属于实践内容,因为后续章节会用到此部分内容, 所以本实践必须完成 。请参考本书配套免费电子书 《Kubernetes快速进阶与实战——实践教程》 中的“ 实践3:远程登录和文件传输”。
上节介绍了ssh远程登录工具的使用,每次登录都需要密码验证。这种方式在主机较少的情况下可行,但是如果主机很多的话,那么每次的验证就会成为一个很大的负担,而且还容易出错;特别是集群规模达到成百上千个节点时,这个验证工作就会成为一个瓶颈。因此,这些大规模分布式系统往往都会用到“远程无密码登录”技术,它可以实现ssh无密码远程登录其他主机,这样可以极大地简化验证工作,降低出错概率和提升效率。
下面以Linux主机A(192.168.0.226)登录主机B(192.168.0.226)为例,说明远程无密码登录的工作机制和步骤。
本示例中主机A和主机B是位于同一台物理主机,但逻辑上A是ssh客户端,B是ssh服务端,它们之间是通过网络进行连接的。因此,其无密码登录的工作机制以及操作步骤和两台物理上分开的主机是完全一样的。
1.主机A生成公钥和私钥文件
公钥和私钥都是密钥,其中公钥加密的数据,只能用私钥解开,私钥加密的数据只能由公钥解开,拿到公钥和私钥中的任何一个密钥,都没有办法推导出对方。这种加密和解密不是同一个密钥的加密体制称为 非对称加密体制 ,与此相对的是 对称加密体制 ,即加密和解密都是同一个密钥。
主机A生成公钥和私钥文件后,会将公钥文件分发到主机B存储,这就相当于在主机B上登记了身份信息。当主机A要登录主机B时,可以用私钥加密数据发送给主机B,主机B如果能用公钥进行解密,那它就可以确定该请求一定是来自主机A:因为该公钥只能解密主机A私钥加密的数据,而只有主机A拥有私钥。再加上A已经在B上登记了身份信息,因此B会允许A验证通过。此机制可以实现主机A的身份验证,操作命令如下。
上述命令及参数说明如下。
● ssh-keygen是密钥生成命令,它将自动创建~/.ssh目录,.ssh以点“.”开头,是一个隐藏目录。
● ssh-keygen会在~/.ssh下自动生成:id_rsa和id_rsa.pub两个文件,其中,id_rsa是私钥,由主机A保存,不能外泄,id_rsa.pub是公钥,将来要分发到无密码登录的主机。
● “-t rsa”用来指定加密算法为rsa,因为非对称加密的算法也有很多种,rsa就是其中一种加密算法。
● -P用来指定私钥文件的加密密码。
注意: -P后面的''是两个单引号,不是双引号,单引号内没有任何内容,表示加密密码为空。
● “-f~/.ssh/id_rsa”用来指定密钥文件生成路径和文件名前缀,本例中密钥文件将生成在~/.ssh目录下,公钥和私钥文件名都以id_rsa开头。
上述命令执行后,检查~/.ssh/,命令如下所示,id_rsa是私钥文件,id_rsa.pub是公钥文件,它们都以id_rsa为文件名前缀。
2.分发密钥
在主机A的公钥文件id_rsa.pub内容写入主机B的authorized_keys,命令如下。
设置权限,命令如下。
3.验证
在主机A上使用ssh命令连接主机B(192.168.0.226),如果不需要输入密码,可以直接登录,则说明无密码登录设置成功。
本节介绍Docker的安装和使用,包括:准备Docker的安装源、安装Docker、运行Docker、Docker服务操作、给普通用户添加使用Docker的权限、Docker容器操作和Docker镜像操作等,具体说明如下。
1.准备Docker的安装源
Docker有两种版本,一个是免费的社区版本,一个是收费的企业版本,本书安装的是社区版本,安装工具使用yum,首先要安装Docker的安装源,具体步骤说明如下。
挂载CentOS 8的光盘,用于后续yum安装。
安装wget,用于后续下载文件,命令如下。
使用wget下载Docker的安装源配置文件docker-ce.repo,命令如下。
docker-ce.repo必须保存在/etc/yum.repos.d目录下。
2.安装Docker
查看可安装的Docker版本,命令如下。
上述命令的输出如下。
安装指定的版本:docker-ce-3:19.03.13-3.el8,命令如下。
正常安装后,会有如下的输出。可以看到,安装的Docker版本是docker-ce-3:19.03.13-3.el8.x86_64,其余安装的Package则是Docker的依赖。
3.运行Docker
安装结束后,如果可以运行docker命令,则说明安装成功。
Docker安装后,除了docker命令,还包括dockerd、containerd、containerd-shim和runc等命令,它们分别对应Docker实现层面的架构的各个组成部分,详细内容参考艾叔编著的《Linux快速入门与实战——基础知识、容器与容器编排、大数据系统运维》。
查看Docker版本的命令如下,安装的Docker版本为19.03.13。
注意: 以上命令查看的是Docker服务端的版本,此处Docker客户端的版本查看命令如下。
4.Docker服务操作
(1)设置Docker服务自启动
Docker会在CentOS 8安装一个名字为docker的服务(Service)来启动Docker守护进程dockerd,该Service默认没有加入到CentOS 8的自启动进程中,因此需要运行下面的命令,使得Docker服务加入自启动。这样,CentOS 8启动时就会自动启动Docker服务。
(2)手动启动/关闭Docker服务
1)有的情况需要手动启动/关闭Docker服务,启动Docker服务的命令如下。
Docker服务是一个Systemd的unit文件,该文件路径为/usr/lib/systemd/system/docker.service。
2)查看Docker服务的状态,命令如下。
如果能看到running(如下所示),则说明Docker服务启动成功。
3)关闭Docker服务的命令如下。服务关闭后同样可以使用status来查看Docker的状态。
启动和关闭Docker服务需要root权限,也可以配置sudo,使得普通用户能够操作。
5.给普通用户添加使用Docker的权限
在Linux下,除非万不得已,不要在root用户下操作,对于Docker同样也是如此。而Docker操作默认需要root权限,可以将普通用户加入到Docker的Group,即可实现普通用户操作Docker,具体命令如下,其中Docker的Group名字为docker。
在普通用户user下执行以下Docker命令,如果能够执行,则说明配置成功。
后续的Docker操作都将在普通用户下进行,一定要注意后续命令中的登录提示符中的#和$。
6.Docker容器操作
在进行容器操作前,要先准备好镜像。Docker安装好后默认是没有镜像的,可以从公有Registry中拉取一个镜像到本地,命令如下。
上述命令会将名字为centos,TAG为centos8.2.2004的镜像从公有Registry拉取到本地。该命令执行后,可以使用下面的命令来查看本地镜像,如果能看到下面centos镜像的信息,则说明拉取成功。
由于上述镜像的TAG比较长,为方便起见,重新给该镜像打一个TAG,命令如下。
接下来在centos镜像的基础上介绍Docker的常用容器操作示例,具体如下。
(1)运行容器
运行容器的命令如下,它将通过centos镜像启动一个容器,在容器中运行/bin/bash程序。
上述命令的参数说明如下。
● run是docker命令的command,表示运行容器,docker是一个总的命令,它通过command来区分不同的操作,目前docker命令支持超过30种的command。
● -t表示为容器分配一个伪终端,并将其绑定在容器的stdin上。
● -i表示打开容器的stdin,从而接受输入。
“-i-t”是运行交互式容器的标准配置。
如果只使用“-t”,会发现容器可以正常显示登录提示符,但无法接受用户的输入,这是因为没有使用“-i”,容器的stdin并没有打开。
如果只使用“-i”,可以接受用户的输入,并返回结果,但返回结果的显示并不正常,而且也没有登录提示符,这是因为没有使用“-t”,容器没有分配伪终端,从而无法按终端格式解析返回结果。
因此,如果要和容器进行交互,则要使用“-i-t”或者“-it”选项;如果容器需要在后台运行,则可以使用“-d”选项。
● centos是镜像名字,如果本地存在该镜像,则使用本地镜像,否则Docker会自动从Registry中查找并拉取该镜像。
此处标准的写法是Repository:Tag,Tag默认值是latest,因此上例中centos其实是centos:latest。此外,Repository:Tag也可以用镜像ID代替,它们都是镜像的标识。
● /bin/bash是在容器中运行的程序路径,容器启动后,将创建一个隔离的程序运行环境,在该环境中运行/bin/bash程序。因此,这个路径是容器的root文件系统中的路径,不是Host系统上的路径。也可以不指定/bin/bash,那么容器启动后会运行默认程序,这个默认程序的路径是在构建镜像的Dockerfile中指定的。
使用“man docker run”可以查看更多的容器启动的说明。
(2)查看容器
查看容器的命令如下。
上述命令可以获得容器的重要信息,显示如下。
上述输出自左向右分别是:“CONTAINERID”是容器ID,它是容器的唯一标识,后续可以使用307fee1bc0ea来标识该容器;IMAGE是运行容器的镜像名称,此处的值为centos;COMMAND是容器启动所运行的程序,此处的值是/bin/bash;CREATED为容器创建的时间,此处的值为“56minutesago”,表示容器是在56min以前创建的;STATUS是容器的当前状态,“Up 56 minutes”表明容器已经运行56min了,当前状态是running;PORTS为端口转发设置,该设置会将访问Host主机某个端口的请求转发到该容器的另一个端口上,从而实现从外部访问内部容器的服务,此处PORTS没有值,说明没有设置端口转发;NAMES是容器的名字,可以在“docker run”时指定容器的名字,特别是在同一个镜像启动多个容器的时候,或者一次启动多个容器,需要明确每个容器的含义做区分的时候,指定容器的名字非常有必要,如果不指定,Docker会自动给容器分配一个名字。
(3)执行指定容器中的程序
很多情况需要在容器启动后,对容器内部进行相关操作,例如:查看容器的文件;进入到容器内部和容器交互;停止容器中的某个进程,等等。所有这些场景都需要用到一项操作——执行指定容器中的程序,示例如下。
假设容器(d5cd1c226772)中运行的是一个后台进程,那么该容器是无法同用户交互的。那我们要同该容器交互,在容器内部操作,该怎么办呢?我们可以执行该容器内bash程序,这样就可以同容器直接交互了。具体示例如下,它实现了在d5cd1c226772容器内部执行/bin/bash。
上述命令参数说明如下。
● exec是docker命令的command,表示在指定容器内执行程序。
● -i和-t用于打开容器的stdin和分配伪终端。
● d5cd1c226772用来指定执行程序的容器ID。
● /bin/bash用来指定容器内执行的程序路径。
上述docker命令执行后结果如下,登录提示符“[root@d5cd1c226772/]#”就是容器中运行/bin/bash的结果,此时已经进入到容器内部,可以进行相关操作了。
容器内可以有多个进程,除了第一个进程是由容器启动时执行COMMAND得到的外,其他进程都可以用“执行指定容器中的程序”这种方式来得到。
重要: 关闭当前虚拟机,复制E:\vm\02\centos8为E:\vm\02\centos8_docker,centos8_docker将作为一个Docker环境的基础版本,后续章节的实验环境可以从该版本直接复制。而本章的后续实验将继续在虚拟机centos8上完成。