! 初级程序员都能理解的 Kubernetes

缘起

许久不见,甚是想念,小刘,好久没写博客啦,今天就来带大家理解一下 什么叫 Kubernetes 简称 K8S ,不用我说吧,仔细看就知道了,K 到 S ,中间隔了8个字母,所以才有了这个简称,任何时候我们想学一个东西必须要了解它到底是什么,这篇文章你要是看不懂,欢迎举报 ! 什么! 还看不懂

在这里插入图片描述

容器的概念

在讲 Kubernetes之前,我们先来看下容器的概念 ,听小刘细细道来,在很早之前,也就是没有容器的时代,那个时代,大家都知道,我们跑项目通常使用 java -jar Jar包名 对吧 ,后面我们可能会加个参数叫做 nohup 也就是后台的意思,通常跑Linux服务器上,或者虚机上
完整写法

nohup java -jar     test.jar &

先从容器开始吧
先来看看容器较为官方的解释

一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。

  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件适用于基于Linux和Windows的应用,在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

再来看看容器较为通俗的解释:

如果需要通俗的描述容器的话,我觉得容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用比如网站、程序甚至是系统环境。

在这里插入图片描述
图解物理机、虚拟机与容器
关于虚拟机与容器的对比在后面会详细介绍到,这里只是通过网上的图片加深大家对于物理机、虚拟机与容器这三者的理解。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
通过上面这三张抽象图,我们大概可以通过类比概括出: 容器虚拟化的是操作系统而不是硬件,容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。

在这里插入图片描述
可能是还是没理解 ,就是说,我们 说我们 我们在 Linux 或者 虚拟机上 打 jar 包运 行的 话,那么 他们是相互不隔离的,假设,我们启动一个 jar ,如何后台运行,在服务器上,我们在运行一个 ,这次我们在停止第二个jar,有的时候会出现的情况就是,停止第二个 jar的时候,同时会影响到 第一个jar的运行,假设项目在运行,用户去访问,这时候,停止一个 ,还会影响另一个,就算 jar 包,没挂,那也影响了用户的体验

以上讲的 只是其中一个点 再来看张对比图,在这里插入图片描述

容器与虚拟机 (VM) 总结在这里插入图片描述
我们现在知道了,直接在 虚拟机里, 运行jar包是多么蠢的事情了吧,虚拟机不是隔离的,一个进程的停止可能会影响到其他进程,而Docker是隔离的,并且两者在效率上也有很大的差别

  • 容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
  • 虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个VM在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且VM启动也十分缓慢 。

所以现在的人一般喜欢讲 jar 打包成 镜像推送到 Docker 上去 、诸如此类 :

不懂的,去看下我们之前的博客

什么DockerFile 啦
在这里插入图片描述

DockeFile

  • 把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是 Dockerfile。 (运行一个项目脚本文件)

Docker-Compose

  • docker-compose 是官方开源项目,负责实现对 Docker 容器集群的快速编排,部署分布式应用。通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project) (运行多个项目的脚本文件)

这是只是做个了解 ,还不了解的同志,自己去学习下,下面小刘,带大家继续讲,之前我们在虚拟机上部署项目 使用 Java -jar 的方式
而如果使用Docker后就变成了
一般形式

基本docker run命令采用这种形式:

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

该docker run命令必须指定一个 IMAGE 以从中派生容器。图像开发人员可以定义与以下相关的图像默认值:

在这里插入图片描述
可能你还是不理解,当我们从 jar包转换成 镜像后,我们可以使用 运行容器(docker) 的命令,也就是docker run
这里 举几个 常见的 参数

  • -p : 进行端口映射
  • -v : 进行容器挂载,
  • -d : 后面运行
    具体大家自己去官网看,这里不在强调
    效果
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
容器和实际的软件没有任何区别,好,现在jar包已经变成容器了,现在 咱们看看容器的好处和坏处,

好处

    1. 部署方便
    1. 部署安全
    1. 隔离性好
    1. 快速回滚
    1. 成本低
    1. 管理成本更低

坏处大家自己查, emmmm … 反正就是好 ,大家现在看看 对吧,当我们的容器运行多个 后就是这个样子

在这里插入图片描述
是不是非常难管理,一般单体架构,只需要运行一个容器,和 分布式架构则需要运行多个容器,所以当容器越来越多管理也变得麻烦了起来,我们来看看市面上常见的 Docker 图形化管理界面

docker 图形页面管理工具常用的有三种,DockerUI ,Portainer ,Shipyard 。DockerUI 是 Portainer 的前身,这三个工具通过docker api来获取管理的资源信息。平时我们常常对着shell对着这些命令行客户端,审美会很疲劳,如果有漂亮的图形化界面可以直观查看docker资源信息,也是非常方便的。

DockerUI

在这里插入图片描述

Shipyard

在这里插入图片描述

portainer

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

其他的我就不再列举了,就是让docker看起来,很好看,运行起来更方面,比如我们只需要点击一个 按钮,就可以运行啦,是不是很好

这里在补充一个我自己常用的 Rancher ,这款图像话,相对来说更加的友好, Rancher官网
在这里插入图片描述

这里大家了解就好,主要是Rancher让 更加的方便,现在界面也有了 ,大家发现没有,还存在什么问题 在这里插入图片描述

哎 ,对了,同学们也能想到,容器有了,但是随着业务的增加,容器就会越来越多,到时候,容器就冗余了呀,所以 ,这时,容器的编排,就至关重要了

啥是编排呢 ?

在这里插入图片描述
这里小刘,说几句,简单的话,概括一下,就是说呀,我们随着业务的发展,容器越来越多,有前端容器后端容器中间件容器
但是这些 容器 ,我们到底要运行几个,这就很难说,代码进行迭代,我们需要升级,容器,扩缩容,都成了问题 ,所以 这时候
市面上,一大堆的 容器编排工具,就如春笋一般的冒出来了,下面举例 :

docker集群管理工具包括:KubernetesMesosRancherSwarm,其中图形管理工具包含KubernetesMesosRancher。swarm暂时不提供web界面。

我们先看 Docker 自家的 也就是 Docker swarm ,这个大家暂时理解为 Docker 的集群,说多大家理解不了 ,啥! 集群你不懂在这里插入图片描述

怎么说吧,就是 多台机器 互相通信
在这里插入图片描述
在这里插入图片描述

还是理解不了的话,这里我们 以 大家学过 的 Eureka 举例,就是说呀,一台机器向另一台机器注册 以保证 ,高可用 HA ,类似 还要 Nacos ,主要就是 一台 挂了之后,另外的一台能够稳定运行,保证程序的 稳定性 ,好,讲到这里,咱们继续 回到 Kubernetes

我们还是主要来看 Kubernetes

在这里插入图片描述

Kubernetes是google开源的多主机容器管理工具, 简称:k8s,它带有人性化图形管理界面, 它在开源社区很受欢迎github上已经有了20000+的收藏,和7000+的fork。吹牛的话,我们看看就好,任何东西都没有完美的 ,下面来详细讲讲 K8S
不做实操哦!

这里我们拿一副图来举例,从上往下看

在这里插入图片描述
上面这个是容器

“容器”是一个用来存放您放入的所有物品的容器。

像应用程序代码,依赖库以及它的依赖关系一直到内核。这里的关键概念是隔离。将所有内容与其余内容隔离开,以便您更好地控制它们。容器提供三种隔离类型

· Workspace工作区隔离(进程,网络)

· 资源隔离(CPU,内存)

· 文件系统隔离(文件系统)

考虑一下像VM一样的容器。它们精简,快速(启动)且体积小。而且,所有这些都没有分离。取而代之的是,他们使用linux系统中存在的构造(例如cgroups,namespace名称空间)在其上构建了一个不错的抽象。

现在我们知道什么是容器了,很容易理解为什么它们很受欢迎。不仅可以发布应用程序二进制/代码,还可以以实用的方式交付运行应用程序所需的整个环境,因为可以将容器构建为非常小的单元。解决”在我的机器上工作”问题的完美解决方案,简单点说,就是 可以很小,并且能够实现虚机的所有功能,并且比虚机更加的强大

容器一切都很好,那么,为什么我们需要另一项技术,如Kubernetes这样的容器协调器呢?

在这里插入图片描述

之前讲过,大家回忆一下,对了 容器太多,不好管理
问:我的前端容器在哪里,我要在其中运行多少个容器?使用容器协调器

问:如何使前端容器与新创建的后端容器对话?答:对IP进行硬编码。或者,使用容器协调器

问:如何进行滚动升级?答:在每个步骤中手动控制。或者,使用容器协调器

在这里插入图片描述
就像我们的乐高积木一样,它不仅具有大规模运行容器协调器所需的组件,而且还具有使用自定义组件交换不同组件的灵活性。你可以plugin一个自定义的调度程序。当需要一个新的资源类型,你可以编写一个CRD(Custom Resource Definition客户资源定义)。此外,社区非常活跃,并且工具发展迅速。上面这句话抄的 没看懂还是让小刘,来告诉你,首先
玩 K8s 必须要有三个 节点

在这里插入图片描述
每个Kubernetes集群都有两种类型的节点(机器)。主节点(Master)和工作节点(Worker)。顾名思义,Master是在运行有效负载(应用程序)的地方控制和监视群集。

群集可以与单个主节点一起使用。但是最好拥有三个以实现高可用性(称为HA群集)

让我们仔细看一下主节点及其组成

在这里插入图片描述
etcd:数据库,用于存储有关kubernetes对象,其当前状态,访问信息和其他集群配置信息的所有数据

API服务器:RESTful API服务器,公开端点以操作集群。主节点和工作节点中的几乎所有组件都与该服务器通信以执行其职责

调度程序Scheduler :负责决定哪个有效负载需要在哪台机器上运行

控制管理器Control Manager:这是一个控制循环,它监视群集的状态(通过调用API服务器来获取此数据)并采取措施将其置于预期状态在这里插入图片描述
以卡通的方式了解Kubernetes
kubelet:是工作程序节点的心脏。它与主节点API服务器通信并运行为其节点安排的容器

kube代理 kubeproxy:使用IP表/ IPVS处理Pod的网络需求

Pod:运行您所有容器的kubernetes的实体。如果没有Pod的抽象,就无法在kubernetes中运行容器。Pod定义了对容器之间的联网方式等至关重要的功能

在这里插入图片描述
其他的 概念,俺就不抄了,简单点说,你通过 那些图里的关键字 ,去更好的管理与协调容器,以解决我们多个容器的 造成的问题,而 Kubernetes ,就能很好的解决这些问题,就行
SpringCloud 这个 标准能 解决 ,微服务 、分布式架构 诞生的一系列,问题,而 Kubernetes 就成了协调 微服务的容器,的关键, 所有也就是Kubernetes 的重点所在

学习的话,大家 自己 去 B站 ,看视频 ,或者 看书籍,小刘只是一个小小的测试,这里,就讲到这里,下面贴出参考文章链接
在这里插入图片描述

参考

猜你喜欢

转载自blog.csdn.net/qq_42897427/article/details/107973975