如果我想要部署,以下几台机器:
3台 - Nginx
5台 - Redis
7台 - ZooKeeper
4台 - Tomcat
6台 - MySql
5台 - JDK
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,作为谷歌的开源项目,它和整个谷歌的云平台协调工作。
-
自动化容器的部署和复制
-
随时扩展或收缩容器规模
-
容器分组Group,并且提供容器间的负载均衡
-
实时监控:及时故障发现,自动替换
在下图中,是K8S的一个集群,在这个集群中包含三台宿主机,这里的每一个方块都是我们的物理虚拟机,通过这三个物理机,我们形成了一个完整的集群,从角色划分,可以分为两种
-
一种是
Kubernetes Master
主服务器,它是整个集群的管理者,它可以对整个集群的节点进行管理,通过主服务器向这些节点,发送创建容器、自动部署、自动发布等功能,并且所有来自外部的数据都会由Kubernetes Master
进行接收并进行分配。 -
还有一种就是 node节点 节点可以是一台独立的物理机也可以是一个虚拟机,在每个节点中都有一个非常重要的 K8S 独有的概念,就是我们的Pod,Pod是K8S最重要也是最基础的概念
Pod
-
Pod是 Kubernetes 控制的最小单元,一个Pod就是一个进程。
-
一个Pod可以被一个容器化的环境看做应用层的“逻辑宿主机”,可以理解为容器的容器,可以包含多个“Container”;
-
一个Pod的多个容器应用通常是紧密耦合的,Pod在Node上创建、启动或销毁;
-
每个Pod里面运行着一个特殊的被称为
Pause
的容器,其他的容器被称为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷; -
Pod的内部容器网络是互通的,每个Pod都有独立的虚拟IP。
-
Pod都是部署完整的应用或模块,同一个Pod容器之间只需要通过localhsot就能互相通信。
-
Pod的生命周期是通过 Replication Controller 来管理的,通过模板进行定义,然后分配到一个Node上运行,在Pod锁包含容器运行结束后,Pod结束。
打一个比较形象的比喻,我们可以把Pod理解成一个豆荚,容器就是里面的豆子,是一个共生体。
Pod里面到底装的是什么?
-
在一些小公司里面,一个Pod就是一个完整的应用,里面安装着各种容器,一个Pod里面可能包含(Redis、Mysql、Tomcat等等),当把这一个Pod部署以后就相当于部署了一个完整的应用,多个Pod部署完以后就形成了一个集群,这是Pod的第一种应用方式
-
还有一种使用方式就是在Pod里面只服务一种容器,比如在一个Pod里面我只部署Tomcat
具体怎么部署Pod里面的容器,是按照我们项目的特性和资源的分配进行合理选择的。
pause容器:
Pause容器 全称infrastucture container(又叫infra)基础容器,作为init pod存在,其他pod都会从pause 容器中fork出来,这个容器对于Pod来说是必备的
一个Pod中的应用容器共享同一个资源:
- PID命名空间:Pod中的不同应用程序可以看到其他的应用程序的进程ID
- 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围
- IPC命名空间:Pod的多个容器能够使用,SystemV IPC或POSIX消息队列进行通信
- UTS命名空间:Pod中的多个容器共享一个主机名;Volumes(共享存储卷)
- 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 来进行定义的。
- Service 拥有一个指定的名字,类似于域名这种,并且它还拥有一个虚拟的IP地址和端口号,只能内网进行访问,如果Service想要进行外网访问或提供外网服务,需要指定公共的IP和NodePort或者外部的负载均衡器。
使用NodePort提供外部访问,只需要在每个Node上打开一个主机的真实端口,这样就可以通过Node的客户端访问到内部的Service。
Label(标签)
Label 一般以 kv的方式附件在各种对象上,Label 是一个说明性的标签,它有着很重要的作用,我们在部署容器的时候,在哪些Pod进行操作,都需要根据Label进行查找和筛选,我们可以理解Label是每一个Pod的别名,只有取了名称,作为K8S的Master主节点才能找到对应的Pod进行操作。
Replication Controller(复制控制器)
-
存在Master主节点上,这个兄弟的作用主要是对Pod的数量进行监控,比如我们在下面的节点中我们需要三个相同属性的Pod,但是目前只有两个,当
Replication Controller
看到只有两个的时候,就会自动帮助我们按照我们制定的规则创建一个额外的副本,放到我们的节点中。 -
Replication Controller
还可以对Pod进行实时监控,当我们某一个Pod它失去了响应,这个Pod就会被剔除,如果我们需要,Replication Controller
会自动创建一个新的 -
Kubernetes通过RC中定义的Lable筛选出对应的Pod实例,并实时监控其状态和数量,如果实例数量少于定义的副本数量(Replicas),则会根据RC中定义的Pod模板来创建一个新的Pod,然后将此Pod调度到合适的Node上启动运行,直到Pod实例数量达到预定目标。
K8S的总体架构
-
Kubernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)
-
Master节点上运行着集群管理相关的一组进程
etcd、API Server、Controller Manager、Scheduler
,后三个组件构成了Kubernetes的总控中心,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。 -
Node上运行kubelet、kube-proxy、docker三个组件,是真正支持K8S的技术方案。负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。
写在最后
还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
[外链图片转存中…(img-9zGLZDLa-1721200501955)]