文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

这一篇 K8S(Kubernetes)我觉得你可以了解一下

2024-12-02 18:36

关注

Kubernetes 简称 K8S,为什么会有这个称号?因为K和S是 Kubernetes 首字母和尾字母,而K和S中间有八个字母,所以简称 K8S,加上 Kubernetes比较绕口,所以一般使用简称 K8S。

Kubernetes 即是一款容器编排工具,也是一个全新的基于容器技术的分布式架构方案,在基于Docker的基础上,可以提供从 创建应用>应用部署>提供服务>动态伸缩>应用更新一系列服务,提高了容器集群管理的便捷性。

K8S产生的原因

大家可以先看一下,下面一张图,里面有我们的 mysql,redis,tomcat,nginx等配置信息,如果我们想要安装里面的数据,我们需要一个一个手动安装,好像也可以,反正也就一个,虽然麻烦了一点,但也不耽误。

但是随着技术的发展和业务的需要,单台服务器已经不能满足我们日常的需要了,越来越多的公司,更多需要的是集群环境和多容器部署,那么如果还是一个一个去部署,运维恐怕要疯掉了,一天啥也不干就去部署机器了,有时候,可能因为某一个环节出错,要重新,那真的是吐血。。。。。,如下图所示:

如果我想要部署,以下几台机器:

  1. 3台 - Nginx 
  2. 5台 - Redis 
  3. 7台 - ZooKeeper 
  4. 4台 - Tomcat 
  5. 6台 - MySql 
  6. 5台 - JDK 
  7. 10台 - 服务器 

如果要一个一个去部署,人都要傻掉了,这什么时候是个头,如果是某里巴的两万台机器,是不是要当场提交辞职信,所以 K8S 就是帮助我们来做这些事情的,方便我们对容器的管理和应用的自动化部署,减少重复劳动,并且能够自动化部署应用和故障自愈。

并且如果 K8S 对于微服务有很好的支持,并且一个微服务的副本可以跟着系统的负荷变化进行调整,K8S 内在的服务弹性扩容机制也能够很好的应对突发流量。

容器编排工具对比

Docker-Compose

Docker-Compose 是用来管理容器的,类似用户容器管家,我们有N多台容器或者应用需要启动的时候,如果手动去操作,是非常耗费时间的,如果有了 Docker-Compose 只需要一个配置文件就可以帮我们搞定,但是 Docker-Compose 只能管理当前主机上的 Docker,不能去管理其他服务器上的服务。意思就是单机环境。

Docker Swarm

Docker Swarm 是由Docker 公司研发的一款用来管理集群上的Docker容器工具,弥补了 Docker-Compose 单节点的缺陷,Docker Swarm 可以帮助我们启动容器,监控容器的状态,如果容器服务挂掉会重新启动一个新的容器,保证正常的对外提供服务,也支持服务之间的负载均衡。而且这些东西 Docker-Compose是不支持的,

Kubernetes

Kubernetes 它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,当然也要一些不一样的特点,Kubernetes 是谷歌自己的产品,经过大量的实践和宿主机的实验,非常的成熟,所以 Kubernetes 正在成为容器编排领域的领导者,其 可配置性、可靠性和社区的广大支持,从而超越了 Docker Swarm,作为谷歌的开源项目,它和整个谷歌的云平台协调工作。

K8S的职责

  1. 自动化容器的部署和复制
  2. 随时扩展或收缩容器规模
  3. 容器分组Group,并且提供容器间的负载均衡
  4. 实时监控:及时故障发现,自动替换

K8S的基本概念

在下图中,是K8S的一个集群,在这个集群中包含三台宿主机,这里的每一个方块都是我们的物理虚拟机,通过这三个物理机,我们形成了一个完整的集群,从角色划分,可以分为两种

Pod

打一个比较形象的比喻,我们可以把Pod理解成一个豆荚,容器就是里面的豆子,是一个共生体。

[[431766]]

Pod里面到底装的是什么?

具体怎么部署Pod里面的容器,是按照我们项目的特性和资源的分配进行合理选择的。

pause容器:

Pause容器 全称infrastucture container(又叫infra)基础容器,作为init pod存在,其他pod都会从pause 容器中fork出来,这个容器对于Pod来说是必备的一个Pod中的应用容器共享同一个资源:

  1. PID命名空间:Pod中的不同应用程序可以看到其他的应用程序的进程ID
  2. 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围
  3. IPC命名空间:Pod的多个容器能够使用,SystemV IPC或POSIX消息队列进行通信
  4. UTS命名空间:Pod中的多个容器共享一个主机名;Volumes(共享存储卷)
  5. Pod中的各个容器可以访问在Pod级别定义的Volumes

在上图中如果没有pause容器,我们的Nginx和Ghost,Pod内的容器想要彼此通信的话,都需要使用自己的IP地址和端口,才可以彼此进行访问,如果有pause容器,对于整个Pod来说,我们可以看做一个整体,也就是我们的Nginx和Ghost直接使用localhost就可以进行访问了,他们唯一不同的就只是端口,这里面可能看着觉得比较简单,但其实是使用了很多网络底层的东西才实现的,感兴趣的小伙伴可以自行了解一下。

Service(服务)

在 Kubernetes 中,每个Pod都会被分配一个单独的IP地址,但是Pod和Pod之间,是无法直接进行交互的,如果想要进行网络通信,必须要通过另外一个组件才能交流,也就是我们的 Service

Service 是服务的意思,在K8S中Service主要工作就是将多个不同主机上的Pod,通过Service进行连通,让Pod和Pod之间可以正常的通信

我们可以把Service看做一个域名,而相同服务的Pod集群就是不同的ip地址,Service 是通过 Label Selector 来进行定义的。

使用NodePort提供外部访问,只需要在每个Node上打开一个主机的真实端口,这样就可以通过Node的客户端访问到内部的Service。

Label(标签)

Label 一般以 kv的方式附件在各种对象上,Label 是一个说明性的标签,它有着很重要的作用,我们在部署容器的时候,在哪些Pod进行操作,都需要根据Label进行查找和筛选,我们可以理解Label是每一个Pod的别名,只有取了名称,作为K8S的Master主节点才能找到对应的Pod进行操作。

Replication Controller(复制控制器)

  1. 存在Master主节点上,这个兄弟的作用主要是对Pod的数量进行监控,比如我们在下面的节点中我们需要三个相同属性的Pod,但是目前只有两个,当 ReplicationController看到只有两个的时候,就会自动帮助我们按照我们制定的规则创建一个额外的副本,放到我们的节点中。
  2. ReplicationController还可以对Pod进行实时监控,当我们某一个Pod它失去了响应,这个Pod就会被剔除,如果我们需要, ReplicationController会自动创建一个新的
  3. Kubernetes通过RC中定义的Lable筛选出对应的Pod实例,并实时监控其状态和数量,如果实例数量少于定义的副本数量(Replicas),则会根据RC中定义的Pod模板来创建一个新的Pod,然后将此Pod调度到合适的Node上启动运行,直到Pod实例数量达到预定目标。

K8S的总体架构

用户通过 Kubectl提交一个创建 ReplicationController请求,这个请求通过 API Server 写入 etcd 中,这个时候 ControllerManager通过 API Server的监听到了创建的命名,经过它认真仔细的分析以后,发现当前集群里面居然还没有对应的Pod实例,赶紧根据 ReplicationController模板定义造一个Pod对象,再通 过Api Server 写到我们 etcd 里面

到下面,如果被 Scheduler发现了,好家伙不告诉我???,无业游民,这家伙一看就不是一个好人啊,它就会立即运行一个复杂的调度流程,为这个新的Pod选一个可以落户的Node,总算有个身份了,真是让人操心,然后通过 API Server 将这个结果也写到etcd中,随后,我们的 Node上运行的小管家 Kubelet进程通过 API Server 检测到这个 新生的小宝宝——“Pod”,就会按照它,就会按照这个小宝宝的特性,启动这个Pod并任劳任怨的负责它的下半生,直到Pod的生命结束。

然后我们通过 Kubectl提交一个新的映射到这个Pod的Service的创建请求, ControllerManager会通过Label标签查询到相关联的Pod实例,生成Service的Endpoints的信息,并通过 API Server 写入到etcd中,接下来,所有 Node上运行的Proxy进程通过 Api Server 查询并监听 Service对象与其对应的 Endpoints信息,建立一个软件方式的负载均衡器来实现 Service访问到后端Pod的流量转发功能。

kube-proxy: 是一个代理,充当这多主机通信的代理人,前面我们讲过Service实现了跨主机、跨容器之间的网络通信,在技术上就是通过kube-proxy来实现的,service是在逻辑上对Pod进行了分组,底层是通过kube-proxy进行通信的

kubelet: 用于执行K8S的命令,也是K8S的核心命令,用于执行K8S的相关指令,负责当前Node节点上的Pod的创建、修改、监控、删除等生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里

etcd: 用于持久化存储集群中所有的资源对象,API Server提供了操作 etcd的封装接口API,这些API基本上都是对资源对象的操作和监听资源变化的接口

API Server : 提供资源对象的操作入口,其他组件都需要通过它提供操作的API来操作资源数据,通过对相关的资源数据“全量查询”+ “变化监听”,可以实时的完成相关的业务功能。

Scheduler : 调度器,负责Pod在集群节点中的调度分配。

Controller Manager: 集群内部管理控制中心,主要是实现 Kubernetes集群的故障检测和恢复的自动化工作。比如Pod的复制和移除,Endpoints对象的创建和更新,Node的发现、管理和状态监控等等都是由 ControllerManager完成。

总结

到这里K8S的基本情况我们就讲解完毕了,有喜欢的小伙伴记得 点赞关注,相比如Docker来说K8S有着更成熟的功能,经过谷歌大量实践的产物,是一个比较成熟和完善的系统。

本文转载自微信公众号「牧小农」

 

来源:牧小农内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯