在过去,我们在进行程序部署的时候,是直接将环境和程序统一配置部署到主机上,但是这样做容易造成程序与程序之间的混淆,所以为了处理这种问题,我们可以搭建一台不可变的虚拟机镜像,将环境和程序配置部署到虚拟机镜像中,但是虚拟机镜像部署存在体量过于庞大并且不可移动的问题,所以容器技术应运而生,容器技术是基于操作系统级别的虚拟化技术,各个容器与宿主机是隔离的,各个容器之间也是是隔离的,它比虚拟机镜像更容易搭建,并且可以很方便在不同的主机上移动。但是随着分布式、集群等技术在实际应用中越来越多,在实际的生产环境中,我们可能会涉及到多个容器,而这些容器可能会跨越多个服务器主机进行部署,所以一个基于容器技术的分布式架构解决方案应用而生,它就是Kubernetes。
2. Kubernetes的概念
Kubernetes(k8s)是一个基于容器技术的的分布式架构解决方案,是Google开源的容器集群管理系统,Google内部称为Borg,主要用于自动部署、扩展和管理容器化的应用程序,是以Docer为基础的分布式系统架构。
Kubernetes可以对分布式系统进行完美的支撑,它具备完善的集群控制能力,内建有智能的负载均衡器,拥有强大的故障发现和自我修复能力。同时还针对开发、部署测试、运维监控等提供了完善的管理工具。
Kubernetes的核心思想是:一切以服务为中心,根据这一核心思想,Kubernetes可以让在其上构建的系统独立运行在物理机、虚拟机群或者云上,所以,Service(服务)是Kubernetes进行分布式集群构建的核心,必须拥有如下关键特征:
-
拥有一个唯一指定的名称。
-
拥有一个虚拟IP和端口。
-
能够提供某种远程服务能力。可以被映射到提供这种远程服务能力的一组容器应用上。
推荐学习:
Kubernetes(K8S)超快速入门教程
完整视频:http://yun.itheima.com/course/640.html?2012stt
配套资料:https://pan.baidu.com/s/1TQX72tx2HS9eIJFBr4ztcg 提取码:sgo3
完整视频:http://yun.itheima.com/course/640.html?2012stt
配套资料:https://pan.baidu.com/s/1TQX72tx2HS9eIJFBr4ztcg 提取码:sgo3
3. Kubernetes的术语
3.1 Master
Kubernetes的集群控制节点,负责整个集群的管理和控制,拥有一个etcd服务,用来保存所有资源对象的数据,我们执行的所有控制命令会发给他,他负责具体的执行过程,Master节点通常会独占一个服务器,在其上会运行以上一组关键的进程:
-
Kubernetes API Server:提供Http Rest接口的关键服务进程,是Kubernetes中增、删、改、查等操作的唯一入口,是集群控制的入口进程。
-
Kubernetes Controller Manager:Kubernetes中所有资源对象的自动化控制中心。
-
Kubernetes Scheduler:负责资源调度的进程。
3.2 Node
Kubernetes集群中的其他机器被称为Node节点,Node节点可以是一台物理主机,也可以是一台虚拟机,每个Node节点会被Master节点分配一些负载,所以Node节点是Kubernetes集群中工作负载节点,当某个Node节点宕机时,工作负载会被Master自动转移到其他节点。Node节点之上会运行一组关键进程:
-
kubelet:负责Pod对应容器的创建,启动、停止等任务。
-
kube-proxy:实现Kubernetes Service通讯与负载均衡机制的重要组件。
-
Docker Engine:Docker引擎,负责容器的创建和管理
3.3 Pod
Pod是Kurbernetes进行创建、调度和管理的最小单位,Pod运行在Node节点之上,其中包含多个业务容器,这些业务容器之间共享网络命名空间、Ip地址、端口,可以通过localhost进行通讯。Pod有两种类型:普通Pod和静态Pod。
3.4 Replication Controller
Kurbernetes用来管理和保证集群中拥有的Pod。
4. Kubernetes的架构
Kubernetes的一切都是基于分布式的,下面这张图就是Kubernetes的架构图
![](https://i-blog.csdnimg.cn/blog_migrate/a5b4dbfb8e0f0340e2de316f9e085ed8.png)
通过这张架构图我们发现Kurbernetes主要由以下几个核心组件组成:
-
Etcd:保存整个集群的状态。
-
API Server:提供认证、授权、访问控制、API注册和发现等机制,是资源操作的唯一入口。
-
Kurbernetes Controller:负责维护集群的状态。
-
Scheduler:负责资源的调度。
-
kubelet:负责维护容器的生命周期,同时管理Volume和网络。
-
Container:负责镜像管理以及Pod和容器的真正运行。
-
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡。
5. Kubernetes的搭建5.1 准备工作
因为Kubernetes的一切都是基于分布式的,那么,要想搭建Kubernetes就需要准备多台服务器主机,因为条件有限,这里我采用搭建多台虚拟机系统的方式进行,所以需要将虚拟机和镜像系统准备好。
-
虚拟机:这里的虚拟机我采用的是VMware,当然也可以采用VirtualBox,VMware下载地址如下:
-
镜像系统:虚拟机的镜像系统我采用的是:CentOS-7-x86_64-DVD-1810,下载地址如下:
5.2 虚拟机环境搭建
我们准备安装三个虚拟机节点,一个为Kubernetes的Master节点,剩下两个为Kubernetes的Node节点,这里我们只演示第一个安装第一个节点,剩下的两个节点,采用VMware复制镜像的方式进行。
5.2.1 虚拟机环境要求
搭建Kubernetes,虚拟机环境至少要满足以下要求:
-
操作系统 CentOS 7
-
内存 2G 【至少】
-
CPU 2核【至少】
-
硬盘 20G 【至少】
5.2.2 创建虚拟机
打开VMware,选择“文件”菜单“新建虚拟机”选项,或者直接点击界面上的“创建新的虚拟机”选项,创建新的虚拟机,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/b766a35703ef2a8828465c32846d043e.jpeg)
在弹出的弹窗中选择“经典”选项,点击“下一步”按钮,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/6431d633a8304c6cc05c29848d09a13b.jpeg)
在弹出的新的弹窗中选择“稍后安装操作系统”选项,点击“下一步”按钮,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/fc4179a308441b226265e5c6bae44a0c.jpeg)
在弹出的新的弹窗中选择客户机操作系统为“Linux”,版本为“CentOS 64位”,点击“下一步”按钮,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/63fa6fa1f3b551e120c524d9aa184f37.jpeg)
在弹出的新的弹窗中设置虚拟机名称为“K8S_Node1”,选择虚拟机系统的安装位置,点击“下一步”按钮,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/ef88c7ddaec6e8c717c21d50f7a18fe1.jpeg)
在弹出的新的弹窗中设置最大磁盘大小为20G,选择“将虚拟磁盘存储为单个文件”,点击“下一步”按钮,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/71ce37f0db9c1324d8e3437e5cc80309.jpeg)
在弹出的新的弹窗中选择“自定义硬件”选项
![](https://i-blog.csdnimg.cn/blog_migrate/40e0c14416a76e6f3ad288344ee8c6ac.png)
在弹出的硬件配置弹窗中,内存设置为2048M,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/e13a62b449b5a76294468ca50679d75f.png)
处理器设置为2个,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/23ebb108f1cc788cc1b22ea2a5b17e0f.png)
镜像文件选择本地下载好的镜像文件,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/1735188ced0c70467472409a4dd1e5a5.png)
设置完内存、处理、镜像文件之后,点击“关闭”按钮,回到新建虚拟机向导页面,点击“完成”按钮,完成新建虚拟机。
5.2.3 安装操作系统
![](https://i-blog.csdnimg.cn/blog_migrate/7a1f9a573ed0bb83036d3df655067a75.jpeg)
最后点击“开始使用CentOS Linux(s)”按钮,开始进入到CentOS 7系统中,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/771f7ce9c805d054752c2bec9d14df97.jpeg)
进入系统之后,使用“ifconfig”指令查看系统的ip地址,发现没有ip地址,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f4a6e82b140bf38c61766f51292a1611.jpeg)
没有ip地址的原因,查看之前2.2.8的配置步骤,发现已经配置了网络适配器为NAT,那没有ip地址的原因可能就是系统在启动的时候没有加载网卡造成的,所以使用“vi”指令打开“/etc/sysconfig/network-scripts/ifcfg-ens33”文件,将其中的“ONBOOT=no”改为“ONBOOT=yes”,使用“wq”指令保存文件,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/78c4d5d601c98517661023aac61af56c.jpeg)
修改文件之后,需要通过“service network restart”重启网络服务,之后在使用“ifconfig”指令查看,就会发现ip地址就有了,如下图所示:
5.2.4 远程操作操作系统
5.2.5 安装Docker
在新建好虚拟机之后,在VMware主界面,选择对应的虚拟机,点击“开启此虚拟机”选项,启动虚拟机,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/920b8a6a54b926519d24f0041ef4d63d.jpeg)
在打开的系统界面中选择“Install CentOS 7”,进行CentOS 7系统的安装,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/a2cb1e98d243656ea9954e9e944f9777.jpeg)
在打开的界面中选择中文语言环境,点击“继续”按钮,继续进行安装,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/621acbb12051d87294d872decf433826.jpeg)
在打开的界面中进行安装配置,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/cee816cf159f47365b89f4eaef4425b0.jpeg)
注意:"软件选择”建议选择最后一个“开发及生产工作站”,“安装位置”选择默认“自动分区”,禁用Kdump,打开网络,让你的虚拟机可以连接到互联网。
在新打开的页面中设置Root密码,进行安装CentOS 7系统
![](https://i-blog.csdnimg.cn/blog_migrate/02679d5427c70b5abbd3fcf9543b6023.jpeg)
安装完成后,会进入到系统的基本配置操作页面,可以进行语言环境的配置,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/a6ce1b9836c30ad56d20c8a25db50a7a.jpeg)
系统键盘布局和输入方式选择配置,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/7a1f9a573ed0bb83036d3df655067a75.jpeg)
最后点击“开始使用CentOS Linux(s)”按钮,开始进入到CentOS 7系统中,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/771f7ce9c805d054752c2bec9d14df97.jpeg)
进入系统之后,使用“ifconfig”指令查看系统的ip地址,发现没有ip地址,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f4a6e82b140bf38c61766f51292a1611.jpeg)
没有ip地址的原因,查看之前2.2.8的配置步骤,发现已经配置了网络适配器为NAT,那没有ip地址的原因可能就是系统在启动的时候没有加载网卡造成的,所以使用“vi”指令打开“/etc/sysconfig/network-scripts/ifcfg-ens33”文件,将其中的“ONBOOT=no”改为“ONBOOT=yes”,使用“wq”指令保存文件,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/78c4d5d601c98517661023aac61af56c.jpeg)
修改文件之后,需要通过“service network restart”重启网络服务,之后在使用“ifconfig”指令查看,就会发现ip地址就有了,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/68bd5e510ee420840e746caab63625cb.jpeg)
因为在操作系统的终端中直接操作指令不太方便,比较好的方法是使用第三方的终端模拟软件,比如Xshell、SecureCRT登录,我这里使用的是SecureCRT进行操作。打开SecureCRT软件,配置一个连接,连接CentOS 7操作系统,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/99ea5e4a379c0cf0600b12fb24528dff.jpeg)
在远程连接成功之后,我们还需要配置CentOS 7的yum源,因为使用CentOS 7自带的yum源,在安装软件和下载依赖的时候会非常的慢,甚至有时候还会超时失败,所以这里不建议使用CentOS 7自带的yum源,我们可以执行如下命令,使用阿里云的源替换CentOS 7自带的yum源,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/8757778a1f4d5cb3e76314fd025cd61c.jpeg)
考虑到后续我们需要安装Kubernetes集群需要各种网络,所以需要将防火墙关闭,避免因为防火墙的问题导致连网失败,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/ffe5a17a9e86a9dab813b5b9dc111e48.jpeg)
在安装Kubernetes集群的时候,为了避免因为内存交互而影响性能以及稳定性,所以这里我们需要关闭Swap内存交互机制。使用“vi”指令打开“/etc/fstab”文件,将其中的swap配置注释掉,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/c93e2e82902a9f3555c5558a5f31c9ab.jpeg)
Kubernetes是以Docker为基础的一个全新的分布式系统架构,安装Kubernetes必须要先安装Docker,可以参考Docker官方文档进行操作:
https://docs.docker.com/install/linux/docker-ce/centos/#prerequisites
因为使用yum安装Docker的时候经常会超时失败,所以可以添加阿里云的Docker仓库,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/8361521258f03a1b523a5a29af5d48d6.jpeg)
使用yum安装Docker最新版本,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/a89859a4d56e2c15d85ad11243ff08ce.jpeg)
执行如下命令启动Docker并激活开机自动启动,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/bccf147b9a51ec6cecf0d69edb5a4212.jpeg)
5.3 Kubernetes集群搭建
5.3.2 安装kubelet、kubeadm、kubectl
5.4 复制虚拟机
使用“vi”指令编辑“/etc/hosts”文件,在其最后添加192.168.149.129 k8s-node1,如下图所示:
5.5.2 创建网络
5.6 配置Kubernetes集群
5.6.2 将其他节点添加到集群
虚拟机环境我们在上边已经搭建好了,接下来我们就该搭建Kubernetes集群,我们将现在的虚拟机作为主节点,先安装Kubernetes,之后再复制出两个虚拟机作为工作节点。
5.3.1 安装Kubernetes
我们可以参考Kubernetes官方文档进行安装Kubernetes,下面是官方文档网址:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/, 官方仓库因为被墙的原因我们无法使用,所以还是使用阿里云的仓库,执行以下命令添加kubernetes仓库:
![](https://i-blog.csdnimg.cn/blog_migrate/09d43dfcb00137a1c6f7543e255e4800.jpeg)
Linux会对我们的访问进行控制,所以需要关闭,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/05108cb65f301b74d7d6fbb1f55f53f1.jpeg)
执行以下的指令安装Kubernetes的kubelet、kubeadm、kubectl,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/26e1c4d24909bc199a48e506b9c7c799.jpeg)
执行以下的指令配置kubelet的cgroup drive,要和docker的cgroup drive保持一致,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/156ed4aedfff808295635af031c1c71d.jpeg)
执行以下指令,启动kubelet
![](https://i-blog.csdnimg.cn/blog_migrate/51b4bd449b010c2a8bf4c02ecc3c4792.jpeg)
但是启动kubelet会失败,因为缺少证书,但是不用担心,之后我们在执行kubeadm init命令的时候会创建证书,这里不启动也不影响后续的配置。
5.3.3 下载Kubernetes的Docker镜像
接下来我们需要使用Kubernetes官方提供的kubeadm工具来初始化Kubernetes集群,但是kubeadm init默认会访问谷歌服务器,使用的Docker镜像仓库是k8s.gcr.io,国内是无法访问的,我们可以使用docker.io/mirrorgooglecontainers中转一下,所以需要执行以下命令,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/9a63ea7a33b812a7b4d175c5bdb8a5b8.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/0219e22bc12f916fe32041e6177b56fc.jpeg)
但是coredns没包含在docker.io/mirrorgooglecontainers中,所以需要手工到coredns官方镜像转换下,执行以下命令进行操作,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/cf52c0637b8eb0364ef35d235446f944.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/5ff9cee7a8169a9d6e73f6ee30cd5004.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/18e9511771f9f0fc9c05af698ee34c3f.jpeg)
最后通过“docker images”查看所有的镜像,会发现所有镜像都已经下载完成,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/359ef780ae2fb8665caf0b8d0db2c44e.jpeg)
上面执行完成,Kubernetes就已经安装完毕了,接下来就需要复制虚拟机将其他节点创建出来。
5.4.1 复制虚拟机
关闭之前的虚拟机,在VMware的界面中,右键点击第一个节点,我这里叫做K8S_Node1,选择“管理”选项中的“克隆”选项,开始复制虚拟机,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/b5b1026066e8d308bbc94ef291d51ae8.jpeg)
进入到选择克隆源的选择,选择“虚拟机中的当前状态”选项,然后点击“下一步”按钮,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/37245413216d9589a2f6c57427816301.jpeg)
在弹出的选择克隆类型的窗口中选择“创建完整克隆”选项,点击“下一步”按钮,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/cfc04a8e1a00fd26830d30256f9c855c.jpeg)
在弹出的设置新的虚拟机名称的窗口中设置新的虚拟机的名称为K8S_Node2,并设置保存位置,然后点击“完成”按钮,进行复制操作,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/ea762df35a042e0f00bb984d4714ff76.jpeg)
重复上面的步骤复制出名称为K8S_Node3的虚拟机。
5.4.2 设置虚拟机网络
复制虚拟机结束之后,我们会发现三个节点ip为:
-
K8S_Node1:192.168.149.129
-
K8S_Node2:192.168.149.130
-
K8S_Node3:192.168.149.131
但是我们还需要进行一些配置,以便后续操作可以配置连接,这里以K8S_Node1为例:
-
使用“vi”指令编辑“/etc/hostname”文件,将hostname改为k8s-node1,注意这里不能大写,不能使用“_”,不然后续的Kubernetes配置会出问题,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/da648b155c8cf5a97d8d229b353d8431.jpeg)
使用“vi”指令编辑“/etc/hosts”文件,在其最后添加192.168.149.129 k8s-node1,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/31a7c81b7caaa9210094878f699dcbc2.jpeg)
配置完毕之后,重启生效,剩下的两个节点也是如此的配置,这里不再演示。
5.5 创建Kubernetes集群
前面的准备工作都已经准备好了,接下来我们就可以开始创建Kubernetes集群了,这里我们使用之前安装的kubeadm来快速、方便的创建一个Kubernetes集群。
5.5.1 初始化Kubernetes集群
在主节点(K8S_Node1)上执行以下的命令,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/044cb3af59fa7d02ccda384beca326ab.jpeg)
当看到如下信息时,就表示Kubernetes集群初始化成功了,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/263c6335276400964fb1999cbc9cfcda.jpeg)
我们需要将初始化成功的提示信息中的kubeadm join记录下来(之后会使用到),同时需要执行提示信息中关于以下的几个指令,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/2765392fc6162977406b19d625180d2a.jpeg)
当初始化好Kubernetes集群之后,我们还需要配置网络,以便实现各个节点之间的通讯,设置网络可以使用Calico或者是flannel,这里我们采用flannel来设置网络,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/ee06eb7d11bcfb5c9e3bdad8da8752fc.jpeg)
当Kubernetes集群初始化成功并设置好网络之后,我们就需要将Pod调度到Master上,因为Kubernetes默认是不会将Pod调度到Master中,所以我们需要手动设置。
5.6.1 将Master作为工作节点
可以执行以下命令,将Master节点作为工作节点,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/4b3cdc120038f9ffef46f92b2b2b6210.jpeg)
在K8S_Node2和K8S_Node3的节点上执行K8S_Node1节点进行kubeadm init初始化集群成功之后提示的kubeadm join指令,将K8S_Node2和K8S_Node3添加到集群中,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/95d2337a250ff69866e1e330a79a7844.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/92e17e0337c51fa7b786be8ae60cb86b.jpeg)
如果kubeadm join指令失败了,可以执行kubeadm reset进行重置,然后再次执行kubeadm join。
最后我们通过“kubectl get nodes”查看节点是否添加到集群中,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/e2e40bb47796c13e3d365762f7c66955.jpeg)
到此,Kubernetes集群就搭建完毕了。
6. 总结
通过上述的案例,我们就可以把Kubernetes集群搭建完成,之后我们可以在此基础上继续搭建Kubernetes的Dashboard,也可以在Kubernetes部署nginx、redis等软件。总之,通过Kubernetes我们可以很方便的进行分布式、集群操作,很方便的实现在物理机、虚拟机或者是云上进行项目的部署和迁移。