Kubernetes核心概念理解

来源:互联网 发布:嘉兴行知小学入学条件 编辑:程序博客网 时间:2024/06/05 22:58

Kubernetes核心概念理解

  • Kubernetes核心概念理解
  • Kubernetes概念
  • 集群的概念
  • 流程

1. Kubernetes概念

Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么能够将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。

Kubernetes的使用优点:

1、随时扩展或收缩容器规模

2、很容易地升级应用程序容器的新版本

3、将容器组织成组,并且提供容器间的负载均衡

4、自动化容器的部署和复制

5、提供容器弹性,如果容器失效就替换它,等等……

实际上,使用Kubernetes只需一个部署文件,使用一条命令就可以部署多层容器(前端,后台等)的完整集群。

kubectl是和Kubernetes API交互的命令行程序。下面介绍一些核心概念。

2. 集群的概念

集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台。下图展示这样的集群,注意该图为了强调核心概念有所简化,这里可以看到一个典型的Kubernetes架构图,如下图所示。
这里写图片描述
上图可以看到如下组件,使用特别的图标Service(服务)和Label:

还有Pod、Container(容器)、Label(标签)、Replication Controller(复制控制器)、Service(服务)、Node(节点)、Kubernetes Master(Kubernetes主节点)

  1. Pod安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。

    问:由于Pod是短暂的,怎样才能持久化容器数据使其能够跨重启而存在?

    答:Kubernetes支持卷的概念,因此可以使用持久化的卷类型。

    问:是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么?

    答:可以手动创建单个Pod,但是也可以使用Replication Controller使用Pod模版创建出多份拷贝。

    问:如果Pod是短暂的,那么重启时IP地址可能会改变,怎样才能从前端容器正确可靠地指向后台容器呢?

    答:可以使用Service。

    Pod是Kubernetes最基本的操作单元,包含一个或多个紧密相关的容器,一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”,一个Pod中的多个容器应该通常是紧密耦合的,Pod在Node上被创建、启动或者销毁;每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网格栈和Volume挂载卷,因此他们之间的通信和数据交互更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。

    一个Pod中的应用容器共享同一组资源:

    ​ PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;

    ​ 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;

    ​ IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信;

    ​ UTS命名空间:Pod中的多个容器共享一个主机名;

    ​ Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes;

    Pod的声明周期通过Replication Controller来管理;通过模板进行定义,然后分配到一个Node上运行,在Pod所包含容器运行结束后,Pod结束。

    Kubernetes为Pod设计了一套独特的网络配置,包括:为每个Pod分配一个IP地址,使用Pod名作为容器间通信的主机名等。

  2. Label。一些Pod有Label,一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如:你可能创建了一个“tier”和“app”标签,通过Label(tier=frontend,app=myapp)来标记前端Pod容器,使用Label(tier=backend,app=myapp)标记后台Pod。然后可以使用Selectors选择带有特定Label的Pod,并且将Service或者Replication Controller应用到上面。

  3. Replication Controller。

    问:是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来吗,能否将Pods划到逻辑组里?

    Replication Controller确保任意时间都有指定数量的Pod副本在运行。如果为某个Pod创建了Replication Controller并且指定3个副本,它就会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它,保持总数为3,具体情况可以详见下图:

这里写图片描述

如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3.如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保持总数为5.还可以按照这样的方式缩小Pod,这个特性会在执行滚动升级时很有用。

当创建Replication Controller时,需要指定两个东西:

Pod模板:用来创建Pod副本的模板

Label:Replication Controller需要监控的Pod的标签。

如果已经创建了Pod的一些副本,那么在这些副本上进行负载均衡,需要使用Service。

  1. Service

    问:如果Pods是短暂的,那么重启时IP地址可能会改变,怎么才能从前端容器正确可靠地指向后台容器呢?

    Service是定义一系列Pod以及访问这些Pod的策略的一层抽象。Service通过Label找到Pod组。因为Service是抽象的,所以在图表里通常看不到它们的存在,这也就让这一概念更难以理解。

    一个Service可以看作一组提供相同服务的Pod的对外访问接口,Service作用于哪些Pod是通过Label Selector来定义的:

    ​ 拥有一个指定的名字(比如my-mysql-server);

    ​ 拥有一个虚拟IP(Cluster IP、Service IP或VIP)和端口号,销毁之前不会改变,只能内网访问

    ​ 能够提供某种远程服务能力

    ​ 被映射到了提供这种服务能力的一组容器应用上。

    如果Service要提供外网服务,需指定公共IP和NodePort,或外部负载均衡器。

    NodePort:系统会在Kubernetes集群中的每个Node上打开一个主机的真实端口,这样,能够访问Node的客户端就能通过这个端口访问到内部的Service了。

    现在,假定有2个后台Pod,并且定义后台Service的名称为“backend-service”,label选择器为(tier=backend,app=myapp)。backend-service的Service会完成如下两件重要的事情:

    会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为“backend-service”,就能够解析出前端应用程序可用的IP地址。

    现在前端已经得到了后台服务的IP地址,但是它应该访问2个后台Pod的哪一个呢?Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个(如下所示)。通过每个Node上运行的代理(Kube-proxy)完成。

    Service的功能,注意该图进行了简化,如果不进入网络配置,那么达到透明的负载均衡目标所涉及的底层网络和路由相对先进。
    这里写图片描述

有一个特别类型的Kubernetes Service,称为“LoadBalancer”,作为外部负载均衡器使用,在一定数量的Pod之间均衡流量,比如,对于负载均衡Web流量很有用。

  1. Volume

    Volume是Pod中能够被多个容器访问的共享目录。

  2. Kubernetes Master

集群拥有一个Kubernetes Master。Kubernetes Master提供集群的独特视角,并且拥有一系列组件,比如Kubernetes API Server。API Server提供可以用来和集群交互的REST端点。master节点包括用来创建和赋值Pod的Replication

  1. ControllerNode

节点(橘色方框)是物理或者虚拟机器,作为Kubernetes worker,通常称为Minion。每个节点都运行如下Kubernetes关键组件。

Kuberlet:是主节点代理。

Kube-proxy:Service使用其将链接路由到Pod。

Docker或Rocket:Kubernetes使用的容器技术来创建容器。

Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、Kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、销毁、以及实现软件模式的负载均衡。

Node包含的信息:

Node地址:主机的IP地址,或Node ID。

Node的运行状态:Pending、Running、Terminated三种状态。

Node Condition:……

Node系统容量:描述Node可用的系统资源,包括CPU、内存、最大可调度Pod数量等。

其他:内核版本号、Kubernetes版本等。

查看Node信息:

kubectl describe node

3. 流程

Kubernetes将集群中的机器划分为一个Master节点和一群工作节点(Node)。其中,Master节点上运行着集群管理相关的一组进程etcd、API server、Controller Manager、Scheduler,后三个组件构成了Kubernetes的总控中心,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理功能,并且全都是自动完成。在每个Node上运行Kubelet、Proxy、Docker daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。

整个过程如下:

通过Kubectl提交一个创建RC的请求,该请求通过API Server被写入etcd,此时Controller Manager通过API Server的监听资源变化的接口监听到这个RC事件,分析之后,发现当前集群中还没有它所对应的Pod实例,于是根据RC里的Pod模板定义生成一个Pod对象,通过API Server写入etcd,接下来,此事件被Scheduler发现,它立即执行一个复杂的调度流程,为这个新Pod选定一个落户的Node,然后通过API Server将这一结果写入到etcd中,随后,目标Node上运行的Kubelet进程通过API Server监测到这个“新生的”Pod,并按照它的定义,启动该Pod并负责Pod的生命周期,直到Pod的生命结束。

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

  1. etcd

    用于持久化存储集群中所有的资源对象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封装接口API,这些API基本上都是集群中资源对象的增删改查及监听资源变化的接口。

  2. API Server

    提供了资源对象的唯一操作入口,其他所有组件都必须通过它提供的API来操作资源数据,通过对相关的资源数据“全量查询”+“变化监听”,这些组件可以很“实时”地完成相关的业务功能。

  3. Controller Manager

    集群内部的管理控制中心,其主要目的是实现Kubernetes集群的故障监测和恢复的自动化工作,比如根据RC的定义完成Pod的复制或移除,以确保Pod实例数符合RC副本的定义;根据Service与Pod的管理关系,完成服务的Endpoints对象的创建和更新;其他诸如Node的发现、管理和状态监控、死亡容器所占磁盘空间及本地缓存的镜像文件的清理等工作也是由Controller Manager完成的。

  4. Scheduler

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

  5. Kubelet

    负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。

  6. Proxy

    实现了Service的代理与软件模式的负载均衡器。

客户端通过Kubectl命令行工具或Kubectl Proxy来访问Kubernetes系统,在Kubernetes集群内部的客户端可以直接使用Kuberctl命令管理集群。Kubectl Proxy是API Server的一个反向代理,在Kubernetes集群外部的客户端可以通过Kubernetes Proxy来访问API Server。

API Server内部有一套完备的安全机制,包括认证、授权和准入控制等相关模块。