Kubernetes(一):简介
文章目录
一、容器
为了降低虚拟机造成的物理主机资源浪费,提高物理主机的资源利用率,并能够提供像虚拟机一样良好的应用程序隔离运行环境,人们把这种轻量级的虚拟机,称为“容器”。
1.1 容器管理工具
容器管理工具类似于虚拟机管理工具,主要用于容器的创建、启动、关闭、删除等。
容器管理工具有:
-
docker
公司的docker
- 国内阿里公司的
Pouch
-
LXC
、LXD
、RKT
等等
1.2 容器编排部署工具
容器管理工具可以完成容器的基础管理,但是容器的应用并不是只能进行简单应用部署的,可以使用容器完成企业中更加复杂的应用部署,当需要对多应用的系统进行部署时,就需要更加复杂的工具来完成对容器运行应用的编排,这就是我们所说的容器编排部署工具。
容器编排部署工具有:
-
docker
三剑客:docker machine
、docker compose
、docker swarm
-
mesos
+marathon
kubernetes
二、Kubernetes
2.1 Kubernetes简介
Kubernetes
(通常写成k8s
),Kubernetes
是Google
开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台。Kubernetes
通常结合docker
容器工具工作,并且整合多个运行着docker
容器的主机集群,Kubernetes
不仅仅支持Docker
,还支持Rocket
,这是另一种容器技术。
功能特性:
- 自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器
- 自我修复:当容器失败时,会对容器进行重启;当所部署的Node节点有问题时,会对容器进行重新部署和重新调度;当容器未通过监控检查时,会关闭此容器;直到容器正常运行时,才会对外提供服务
-
水平扩展:通过简单的命令、用户
UI
界面或基于CPU
等资源使用情况,对应用容器进行规模扩大或规模剪裁 -
服务发现:用户不需要使用额外的服务发现机制,就能够基于
Kubernetes
自身能力实现服务发现和负载均衡 - 滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新
- 版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
- **和配置管理:在不需要重新构建镜像的情况下,可以部署和更新**和应用配置,类似热部署
-
存储编排:自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要;存储系统可以来自于本地目录、网络存储(
NFS
、Gluster
、Ceph
、Cinder
等)、公共云存储服务等
2.2 Kubernetes架构图
2.3 Kubernetes组件
2.3.1 Master
Master节点上面主要由四个模块组成:APIServer、scheduler、controller manager、etcd
APIServer:APIServer
负责对外提供RESTful
的Kubernetes API
服务,它是系统管理指令的统一入口,任何对资源进行增删改查的操作都要交给APIServer
处理后再提交给etcd
。如架构图中所示,kubectl
(Kubernetes
提供的客户端工具,该工具内部就是对Kubernetes API
的调用)是直接和APIServer
交互的。
scheduler:scheduler
的职责很明确,就是负责调度pod
到合适的Node
上。如果把scheduler
看成一个黑匣子,那么它的输入是pod
和由多个Node
组成的列表,输出是pod
和一个Node
的绑定,即将这个pod
部署到这个Node
上。Kubernetes
目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。
controller manager:如果说APIServer
做的是“前台”的工作的话,那controller manager
就是负责“后台”的。每个资源一般都对应有一个控制器,而controller manager
就是负责管理这些控制器的。比如我们通过APIServer
创建一个pod
,当这个pod
创建成功后,APIServer
的任务就算完成了。而后面保证pod
的状态始终和我们预期的一样的重任就由controller manager
去保证了。
etcd:etcd
是一个高可用的键值存储系统,Kubernetes
使用它来存储各个资源的状态,从而实现了Restful
的API
。
2.3.2 Node
每个Node
节点主要由三个模块组成:kubelet
、kube-proxy
、runtime
。
runtime:指的是容器运行环境,目前Kubernetes
支持docker
和rkt
两种容器。
kube-proxy:该模块实现了Kubernetes
中的服务发现和反向代理功能。反向代理方面:kube-proxy
支持TCP
和UDP
连接转发,默认基于Round Robin
算法将客户端流量转发到与service
对应的一组后端pod
。服务发现方面,kube-proxy
使用etcd
的watch
机制,监控集群中service
和endpoint
对象数据的动态变化,并且维护一个service
到endpoint
的映射关系,从而保证了后端pod
的IP
变化不会对访问者造成影响。另外kube-proxy
还支持session affinity
。
kubelet:Kubelet
是Master
在每个Node
节点上面的agent
,是Node
节点上面最重要的模块,它负责维护和管理该Node
上面的所有容器,但是如果容器不是通过Kubernetes
创建的,它并不会管理。本质上,它负责使pod
得运行状态与期望的状态一致。
2.3.3 Pod
pod
是k8s
进行资源调度的最小单位,每个pod
中运行着一个或多个密切相关的业务容器,这些业务容器共享这个Pause
容器的IP
和Volume
,我们以这个不易死亡的Pause
容器作为pod
的根容器,以它的状态表示整个容器组的状态。一个pod
一旦被创建就会放到etcd
中存储,然后由Master
调度到一个Node
绑定,由这个Node
上的Kubelet
进行实例化。
每个pod
会被分配一个单独的pod IP
,pod IP
+ ContainerPort
组成了一个Endpoint
。
2.3.4 Service
Service
其功能使应用暴露,Pods
是有生命周期的,也有独立的IP
地址,随着Pods
的创建与销毁,一个必不可少的工作就是保证各个应用能够感知这种变化。这就要提到Service
了,Service
是YAML
或JSON
定义的由Pods
通过某种策略的逻辑组合。更重要的是,Pods
的独立IP
需要通过Service
暴露到网络中。