1 Kubernetes介绍
用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理。
2 Kubernetes整体架构
2.1 Master
kubernetes里的Master指的是集群控制节点。每个kubernetes集群里都需要一个Master节点来负责整个集群的管理和控制,基本上kubernetes所有的控制命令都是发给它,它来负责具体的执行过程,我们后面所有的执行的命令基本上都是在Master节点上运行的。Master节点通常会占据一个独立的服务器或虚拟机,就是它的重要性体现,一个集群的大脑,如果它宕机,那么整个集群将无法响应控制命令。
Master节点上运行着以下几组关键进程:
- Kubernetes API Server(kube-apiserver):提供了HTTP Rest接口的关进服务进程,是Kubernetes里所有资源增删改查等操作的唯一入口,也是集群管理的入口进程。
- Kubernetes Controller Manage(kube-controller-manage):Kubernetes里所有资源对象的自动化控制中心,可以理解为资源对象的“大总管”。
- Kubernetes Scheduler(kube-scheduler):负责资源的调度(Pod调度)的进程。
Master还启动了一个etcd server进程,因为kubernetes里所有的资源对象的数据都是保存在etcd中的。
2.2 Node
除了Master,kubernetes集群的其它机器也被称为Node节点,同样的它也是一台物理机或是虚拟机。Node节点才是Kubernetes集群中工作负载节点,每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机之后,其上的工作负载会被Master自动转移到其它节点上面去。
每个Node节点运行着以下几个关键进程:
- kubelet:负责pod对应的同期创建、启动停止等任务,同时与Master节点密切协作,实现集群管理的基本功能。
- kube-proxy:实现Kubernetes Service的通信与负载均衡的重要组件。
- Docker-Engine(docker):docker引擎,负责本机容器的创建和管理工作。
Node节点可以在运行期间动态增加到Kubernetes集群中,前提是这个节点已经正确安装、配置和启动的上述关键进程。在默认情况下kubenet会向Master注册自己,这也是kubernetes推荐的管理方式。一旦Node被纳入集群管理范围,kubelet进程就会定时向Master节点汇报自身的情况,包括操作系统、Docker版本、机器cpu和内存情况及有哪些pod在运行。这样Master可以获知Node的资源使用情况并实现高效均衡的资源调度策略。而某个Node超过时间不进行上报信息时,master将会将其标记为失联(Not Ready),随后会触发资源转移的自动流程。
2.3 Pod
pod的组成与容器的关系,pause为根容器,其他为业务容器。
k8s为每个Pod都都分配了唯一的ip,称之为Pod IP,一个Pod里的多个容器共享Pod IP地址。k8s要求底层网络支持集群内任意两个Pod之间的TCP/IP直接通信,这通常采用虚拟二层网络技术来实现,如Flannel、Openswith等,牢记在k8s中,一个Pod容器与另外主机上的Pod容器能够直接通信。
Pod其实有两种类型:普通的Pod及静态的Pod(static Pod),后者比较特殊,并不存放在k8s的etcd里面存储,而是存放在某一个具体的Node上的一个文件中,并且只在此Node上启动运行。而普通的Pod一旦被创建,就会被放入到etcd中存储,随后会被k8s Master调度到某个具体的Node上面进行绑定(Binding),随后该Pod被对应的Node上的kubblet进程实例化成一组的Docker容器并启动起来。默认情况下,当Pod里的某个容器停止时,k8s会自动检测这个问题并重启启动这个Pod(Pod里面的所有容器),如果Pod所在的Node宕机,则会将这个Node上的所有Pod重新调度到其它节点上。Pod、容器与Node的关系如下:
3 kubernetes组件调用关系的应用示例
以部署一个Nginx服务来说明Kubernetes系统各个组件调用关系:
- 首先需要明确,一旦Kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中。
- 一个Nginx服务的安装请求首先会被发送到master节点上的API Server组件。
- API Server组件会调用Scheduler组件来决定到底应该把这个服务安装到那个node节点上。此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知API Server。
- API Server调用Controller-Manager去调用Node节点安装Nginx服务。
- Kubelet接收到指令后,会通知Docker,然后由Docker来启动一个Nginx的Pod。Pod是Kubernetes的最小操作单元,容器必须跑在Pod中。
- 一个Nginx服务就运行了,如果需要访问Nginx,就需要通过kube-proxy来对Pod产生访问的代理,这样,外界用户就可以访问集群中的Nginx服务了。
4 kubernetes概念
- Master:集群控制节点,每个集群要求至少有一个Master节点来负责集群的管控。-
- Node:工作负载节点,由Master分配容器到这些Node工作节点上,然后Node节点上的Docker负责容器的运行。
- Pod:Kubernetes的最小控制单元,容器都是运行在Pod中的,一个Pod中可以有一个或多个容器。
- Controller:控制器,通过它来实现对Pod的管理,比如启动Pod、停止Pod、伸缩Pod的数量等等。
- Service:Pod对外服务的统一入口,其下面可以维护同一类的多个Pod。
- Label:标签,用于对Pod进行分类,同一类Pod会拥有相同的标签。
- NameSpace:命名空间,用来隔离Pod的运行环境。