【图灵干货】Java高级教程第十三节:Kubernetes核心原理和搭建

发布时间:2021-11-24 13:37:21

  以前,当我们部署一个程序时,我们会直接在主机上部署统一的环境和程序,但是这样会导致程序和程序之间的混乱。为此,本文提出了一种常量虚拟机镜像,并在虚拟机镜像上部署环境和程序配置以实现虚拟机镜像。但是,虚拟机镜像部署存在着体积大且不可移动的问题,因此容器技术应运而生。容器技术是一种基于操作系统的虚拟化技术。每一个容器和主机被隔离,每一个容器也被隔离。这比建立虚拟机镜像要简单得多,可以在不同的主机上移动。但是,随着分布、集群化等技术的实际应用不断增多,在实际生产环境中,可能涉及跨多个服务器主机来部署的多个容器,于是,一个分布式的体系结构解决方案应用,Kubernetes应运而生。

  ##2.Kubernetes概念。

  Kubernetes(K8s)是一个基于容器技术的分布式架构解决方案,它是Google开放源码的容器集群管理系统。Google内称其为Borg,主要用于自动部署、扩展和管理容器化应用,是一个基于Docer的分布式系统体系结构;Kubernetes能很好地支持分布式系统,具备良好的机群控制能力,内部智能负载均衡,故障检测及自我修复能力。并为开发、部署测试、运行监控等提供了完善的管理工具。

  Kubernetes的核心理念是:每件事情都以服务为中心,Kubernetes可以让构建在它上面的系统独立运行在物理机、虚拟机或云上。所以,作为构建Kubernetes分布式集群的核心服务(服务),必须具备下列主要特性:

  具有唯一指定的名称。

  有虚拟IP和端口。

  能提供一定的远程服务能力。

  -可以映射到一组容器应用程序,提供这种远程服务的能力。

  ##3.Kubernetes术语。

  ###3.1Master。

  Kubernetes的集群控制节点负责整个集群的管理和控制。该工具具有用于存储所有资源对象数据的etcd服务。所有我们执行的控制命令都会交给他。他们有责任实施具体程序。主节点通常独占一台服务器并运行上面的关键流程:

  **KubernetesAPIServer**:提供一个Httprest接口的关键服务流程是惟一的Kubernetes进行增加、删除、修改、查询的操作。

  一进门就是集群控的入口。

  **KubernetesControlerManager**:Kubernetes中所有资源对象的自动控制中心。

  **KubernetesScheduler**:负责资源调度流程。

  ###3.2节点。

  Kubernetes集群中的其他机器被称为节点节点。节点可以是物理主机或虚拟机。Master节点对每个Node节点分配一定的负载,所以Node节点是Kubernetes集群中的工作负载节点。Node节点停止运行时,工作负载会自动转移到其他节点。运行一组重要的过程在Node节点的上方:

  ***kubelet**:负责创建Pod、启动和停止对应容器。

  **kube-proxy**:实现kubernetesservice通信和负载平衡机制的重要部分。

  **Dockerengine**:Docker引擎,负责创建和管理容器。

  ###3.3点钟。

  Pod是Kurbernetes创造的最小的调度和管理单元。Pod在包含多个业务容器的Node节点上运行,IP地址和端口可以通过localhost共享来进行通信。Pod分为两类:普通Pod和静态Pod。

  ##3.4复制控制器。

  Kurbernetes用来管理并保证集群中的Pod。

  ##4.Kubernetes架构

  所有的Kubernetes都基于分布式,下图是Kubernetes的构架结构。

Kubernetes的构架结构

  通过这张架构图我们发现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下载地址如下:

  https://www.vmware.com/cn.html

  - **镜像系统**:虚拟机的镜像系统我采用的是:CentOS-7-x86_64-DVD-1810,下载地址如下:

  http://mirrors.zju.edu.cn/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso

  ### 5.2 虚拟机环境搭建

  我们准备安装三个虚拟机节点,一个为Kubernetes的Master节点,剩下两个为Kubernetes的Node节点,这里我们只演示第一个安装第一个节点,剩下的两个节点,采用VMware复制镜像的方式进行。

  #### 5.2.1 虚拟机环境要求

  搭建Kubernetes,虚拟机环境至少要满足以下要求:

  - 操作系统 CentOS 7

  - 内存 2G 【至少】

  - CPU 2核【至少】

  - 硬盘 20G 【至少】

  #### 5.2.2 创建虚拟机

  打开VMware,选择“文件”菜单“新建虚拟机”选项,或者直接点击界面上的“创建新的虚拟机”选项,创建新的虚拟机,如下图所示:

  在弹出的弹窗中选择“经典”选项,点击“下一步”按钮,如下图所示:

  在弹出的新的弹窗中选择“稍后安装操作系统”选项,点击“下一步”按钮,如下图所示:

  在弹出的新的弹窗中选择客户机操作系统为“Linux”,版本为“CentOS 64位”,点击“下一步”按钮,如下图所示:

  在弹出的新的弹窗中设置虚拟机名称为“K8S_Node1”,选择虚拟机系统的安装位置,点击“下一步”按钮,如下图所示:

  在弹出的新的弹窗中设置最大磁盘大小为20G,选择“将虚拟磁盘存储为单个文件”,点击“下一步”按钮,如下图所示:

  在弹出的新的弹窗中选择“自定义硬件”选项

  在弹出的硬件配置弹窗中,内存设置为2048M,如下图所示:

  处理器设置为2个,如下图所示:

  镜像文件选择本地下载好的镜像文件,如下图所示:

  设置完内存、处理、镜像文件之后,点击“关闭”按钮,回到新建虚拟机向导页面,点击“完成”按钮,完成新建虚拟机。

  #### 5.2.3 安装操作系统

  在新建好虚拟机之后,在VMware主界面,选择对应的虚拟机,点击“开启此虚拟机”选项,启动虚拟机,如下图所示:

  在打开的系统界面中选择“Install CentOS 7”,进行CentOS 7系统的安装,如下图所示:

  在打开的界面中选择中文语言环境,点击“继续”按钮,继续进行安装,如下图所示:

  在打开的界面中进行安装配置,如下图所示:

  注意:"软件选择”建议选择最后一个“开发及生产工作站”,“安装位置”选择默认“自动分区”,禁用Kdump,打开网络,让你的虚拟机可以连接到互联网。

  在新打开的页面中设置Root密码,进行安装CentOS 7系统

  安装完成后,会进入到系统的基本配置操作页面,可以进行语言环境的配置,如下图所示:

1604042045847628.png

  系统键盘布局和输入方式选择配置,如下图所示:

1604042068600211.png

  最后点击“开始使用CentOS Linux(s)”按钮,开始进入到CentOS 7系统中,如下图所示:

1604042113342362.png

  进入系统之后,使用“ifconfig”指令查看系统的ip地址,发现没有ip地址,如下图所示:

1604042131876313.png

  没有ip地址的原因,查看之前2.2.8的配置步骤,发现已经配置了网络适配器为NAT,那没有ip地址的原因可能就是系统在启动的时候没有加载网卡造成的,所以使用“vi”指令打开“/etc/sysconfig/network-scripts/ifcfg-ens33”文件,将其中的“ONBOOT=no”改为“ONBOOT=yes”,使用“wq”指令保存文件,如下图所示:

1604042152553357.png

  修改文件之后,需要通过“service network restart”重启网络服务,之后在使用“ifconfig”指令查看,就会发现ip地址就有了,如下图所示:

1604042169277751.png

  #### 5.2.4 远程操作操作系统

  因为在操作系统的终端中直接操作指令不太方便,比较好的方法是使用第三方的终端模拟软件,比如Xshell、SecureCRT登录,我这里使用的是SecureCRT进行操作。打开SecureCRT软件,配置一个连接,连接CentOS 7操作系统,如下图所示:

1604042190481440.png

  在远程连接成功之后,我们还需要配置CentOS 7的yum源,因为使用CentOS 7自带的yum源,在安装软件和下载依赖的时候会非常的慢,甚至有时候还会超时失败,所以这里不建议使用CentOS 7自带的yum源,我们可以执行如下命令,使用阿里云的源替换CentOS 7自带的yum源,如下图所示:

1604042211262831.png

  考虑到后续我们需要安装Kubernetes集群需要各种网络,所以需要将防火墙关闭,避免因为防火墙的问题导致连网失败,如下图所示:

1604042230230652.png

  在安装Kubernetes集群的时候,为了避免因为内存交互而影响性能以及稳定性,所以这里我们需要关闭Swap内存交互机制。使用“vi”指令打开“/etc/fstab”文件,将其中的swap配置注释掉,如下图所示:

1604042252686398.png

  #### 5.2.5 安装Docker

  Kubernetes是以Docker为基础的一个全新的分布式系统架构,安装Kubernetes必须要先安装Docker,可以参考Docker官方文档进行操作:https://docs.docker.com/install/linux/docker-ce/centos/#prerequisites

  因为使用yum安装Docker的时候经常会超时失败,所以可以添加阿里云的Docker仓库,如下图所示:

1604042274611019.png

  使用yum安装Docker最新版本,如下图所示:

1604042299459157.png

  执行如下命令启动Docker并激活开机自动启动,如下图所示:

1604042318784632.png

  ### 5.3 Kubernetes集群搭建

  虚拟机环境我们在上边已经搭建好了,接下来我们就该搭建Kubernetes集群,我们将现在的虚拟机作为主节点,先安装Kubernetes,之后再复制出两个虚拟机作为工作节点。

  #### 5.3.1 安装Kubernetes

  我们可以参考Kubernetes官方文档进行安装Kubernetes,下面是官方文档网址:https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/, 官方仓库因为被墙的原因我们无法使用,所以还是使用阿里云的仓库,执行以下命令添加kubernetes仓库:

1604042342969909.png

  Linux会对我们的访问进行控制,所以需要关闭,如下图所示:

1604042359354011.png

  #### 5.3.2 安装kubelet、kubeadm、kubectl

  执行以下的指令安装Kubernetes的kubelet、kubeadm、kubectl,如下图所示:

1604042376731018.png

  执行以下的指令配置kubelet的cgroup drive,要和docker的cgroup drive保持一致,如下图所示:

1604042392797775.png

  执行以下指令,启动kubelet

1604042411109785.png

  但是启动kubelet会失败,因为缺少证书,但是不用担心,之后我们在执行kubeadm init命令的时候会创建证书,这里不启动也不影响后续的配置。

  #### 5.3.3 下载Kubernetes的Docker镜像

  接下来我们需要使用Kubernetes官方提供的kubeadm工具来初始化Kubernetes集群,但是kubeadm init默认会访问谷歌服务器,使用的Docker镜像仓库是k8s.gcr.io,国内是无法访问的,我们可以使用docker.io/mirrorgooglecontainers中转一下,所以需要执行以下命令,如下图所示:

1604042438975385.png

1604042456177161.png

  但是coredns没包含在docker.io/mirrorgooglecontainers中,所以需要手工到coredns官方镜像转换下,执行以下命令进行操作,如下图所示:

1604042476384352.png

1604042485968495.png

1604042495461029.png

  最后通过“docker images”查看所有的镜像,会发现所有镜像都已经下载完成,如下图所示:

1604042527696102.png

  ### 5.4 复制虚拟机

  上面执行完成,Kubernetes就已经安装完毕了,接下来就需要复制虚拟机将其他节点创建出来。

  #### 5.4.1 复制虚拟机

  关闭之前的虚拟机,在VMware的界面中,右键点击第一个节点,我这里叫做K8S_Node1,选择“管理”选项中的“克隆”选项,开始复制虚拟机,如下图所示:

1604042545531552.png

  进入到选择克隆源的选择,选择“虚拟机中的当前状态”选项,然后点击“下一步”按钮,如下图所示:

1604042564979278.png

  在弹出的选择克隆类型的窗口中选择“创建完整克隆”选项,点击“下一步”按钮,如下图所示:

1604042584246171.png

  在弹出的设置新的虚拟机名称的窗口中设置新的虚拟机的名称为K8S_Node2,并设置保存位置,然后点击“完成”按钮,进行复制操作,如下图所示:

1604042603275750.png

  重复上面的步骤复制出名称为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配置会出问题,如下图所示:

1604042627399650.png

  - 使用“vi”指令编辑“/etc/hosts”文件,在其最后添加192.168.149.129 k8s-node1,如下图所示:

1604042643428623.png

  配置完毕之后,重启生效,剩下的两个节点也是如此的配置,这里不再演示。

  ### 5.5 创建Kubernetes集群

  前面的准备工作都已经准备好了,接下来我们就可以开始创建Kubernetes集群了,这里我们使用之前安装的kubeadm来快速、方便的创建一个Kubernetes集群。

  #### 5.5.1 初始化Kubernetes集群

  在主节点(K8S_Node1)上执行以下的命令,如下图所示:

1604042662972015.png

  当看到如下信息时,就表示Kubernetes集群初始化成功了,如下图所示:

1604042681193924.png

  我们需要将初始化成功的提示信息中的kubeadm join记录下来(之后会使用到),同时需要执行提示信息中关于以下的几个指令,如下图所示:

1604042697973283.png

  #### 5.5.2 创建网络

  当初始化好Kubernetes集群之后,我们还需要配置网络,以便实现各个节点之间的通讯,设置网络可以使用Calico或者是flannel,这里我们采用flannel来设置网络,如下图所示:

1604042724167299.png

  ### 5.6 配置Kubernetes集群

  当Kubernetes集群初始化成功并设置好网络之后,我们就需要将Pod调度到Master上,因为Kubernetes默认是不会将Pod调度到Master中,所以我们需要手动设置。

  #### 5.6.1 将Master作为工作节点

  可以执行以下命令,将Master节点作为工作节点,如下图所示:

1604042746292230.png

  #### 5.6.2 将其他节点添加到集群

  在K8S_Node2和K8S_Node3的节点上执行K8S_Node1节点进行kubeadm init初始化集群成功之后提示的kubeadm join指令,将K8S_Node2和K8S_Node3添加到集群中,如下图所示:

1604042766348677.png

1604042775205991.png

  如果kubeadm join指令失败了,可以执行kubeadm reset进行重置,然后再次执行kubeadm join。

  最后我们通过“kubectl get nodes”查看节点是否添加到集群中,如下图所示:

1604042802350611.png

  到此,Kubernetes集群就搭建完毕了。

  ## 6. 总结

  通过上述的案例,我们就可以把Kubernetes集群搭建完成,之后我们可以在此基础上继续搭建Kubernetes的Dashboard,也可以在Kubernetes部署nginx、redis等软件。总之,通过Kubernetes我们可以很方便的进行分布式、集群操作,很方便的实现在物理机、虚拟机或者是云上进行项目的部署和迁移。

图灵学院成立于2017年7月15日,现阶段提供 计算机基础原理、JavaSE核心、Java后端、 面试必备算法、python核心编程、数据分析、web 开发题、人工智能等专题课程,为想学习Python的学员提供优质的培训服务,帮助学员掌握更加全面的技能,是计算机人员职场中提职加薪的首选。
免费java架构师视频学习地址:免费视频

上一篇 Java培训课程哪家机构好?
下一篇 【图灵干货】Java高级教程第十四节:redis实现分布式阻塞队列