Kubernetes核心模块

Posted 刘小豆豆豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes核心模块相关的知识,希望对你有一定的参考价值。

上文中讲了K8s的全生命周期,本篇介绍K8S的核心模块
K8s的核心模块主要有Cluster 、Master 、Node 、Pod 、Service等等

一、k8s的核心技术概念:


1、Cluster

Cluster 是计算、存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用。

2、Master

Kubernetes里的Master指的是集群控制节点,负责整个集群的管理和控制,用于接收Kubernetes的绝大多数控制命令,master负责具体的执行过程。高可用部署建议用3台服务器,推荐选举。一旦master宕机或者不可用,那么对集群内容器应用的管理都将失效。

Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 所组成。

  1. Kubernetes API Server(kube-apiserver)
    Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,Kubernetes里所有资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
  2. Kubernetes Controller Manager(kube-controller-manager)
    Kubernetes里所有资源对象的自动化控制中心,可以理解为资源对象的大总管
  3. kube-scheduler
    负责资源调度(Pod调度)的进程

3、Node


Node是集群工作节点 由 Master 管理,运行用户业务应用容器,每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他Node节点上。Node 还负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期。

Worker Node 包含 kubelet、kube proxy 和 ContainerRuntime:

  1. kubelet
    kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,负责Pod对应容器的创建、启停等任务。同时与Master密切协作,实现集群管理的基本功能,获取Node节点上Pod的运行状态等。

    kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能: 安装Pod所需的volume。 下载Pod的Secrets。
    Pod中运行的 docker(或experimentally,rkt)容器。 定期执行容器健康检查。 通过创建一个
    Pod(如果需要的话),向系统的其余部分报告 Pod 的状态。 向系统的其他部分报告节点的状态。

  2. kube-proxy
    在Node节点上实现Pod网络代理,实现Kubernetes Service的通信和负载均衡机制的重要组件。kube-proxy通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。

  3. docker
    Docker引擎,负责本机的容器的创建和管理工作

二、其他概念

1、volume(存储卷)

Volume是Pod中能够被多个容器访问的共享目录。Kubernetes的Volume概念与Docker的Volume比较类似,但不完全相同。Kubernetes中的Volume与Pod生命周期相同,但与容器的生命周期不相关。当容器终止或者重启时,Volume中的数据也不会丢失。另外,Kubernetes支持多种类型的Volume,并且一个Pod可以同时使用任意多个Volume。

2、Pod

Pod 是 Kubernetes 的最小工作单元。每个 Pod 包含一个或多个容器还有卷。Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行,一个Pod里的所有容器共用一个namespaces,共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。
因此会有这些问题:

  1. 如果Pod是短暂的,那么怎么才能持久化容器数据使其能够跨重启而存在呢?
    Kubernetes支持卷的概念,因此可以使用持久化的卷类型。
  2. 是否手动创建Pod,如果想要创建同一个容器的多份拷贝,需要一个个分别创建出来么?
    可以手动创建单个Pod,但是也可以使用Replication Controller使用Pod模板创建出多份拷贝,下文会详细介绍。
  3. 如果Pod是短暂的,那么重启时IP地址可能会改变,那么怎么才能从前端容器正确可靠地指向后台容器呢?
    这时可以使用Service,上一篇文章中提到过。

3、Service

Service是一组逻辑pod的抽象,为一组pod提供统一入口,用户只需与service打交道。 Service提供DNS解析名称,负责追踪pod动态变化并更新转发表,通过负载均衡算法最终将流量转发到后端的pod。Kubernetes里的每个Service其实也可以理解为我们的微服务架构中的一个微服务。
Service对外提供多种入口:

  1. ClusterIP:
    Service在集群内的唯一ip地址,虚拟的IP,只能在 Kubernetes集群里访问。通过ClusterIP,负载均衡的访问后端的Pod
  2. NodeIP + NodePort:
    Service会在集群的每个Node上都启动一个端口,通过NodeIP:NodePort访问后端的Pod。

4、Replication Controller

Replication Controller是管理Pod的工具,kubernetes通过它来管理集群中的Pod。RC是Kubernetes系统中的核心概念之一,它能够保证Pod持续运行,并且在任何时候都有指定数量的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的标签。

4、Label

Label是Kubernetes系统中的一个核心概念。 Label以 key / value 键值对的形式附加到各种对象上,如Pod、Service、RC、Node等。Label定义了这些对象的可识别属性,用来对它们进行管理和选择。 Label可以在创建时附加到对象上,也可以在对象创建后通过API进行管理。
在为对象定义好Label后,其他对象就可以使用Label Selector(选择器)来定义其作用的对象了。
Label Selector的定义由多个逗号分隔的条件组成。

“labels”: “key1”: “value1”, “key2”: “value2”

当前有两种Label Selector:基于等式的(Equality-based)和基于集合的(Set-based),在使用时可以将多个Label进行组合来选择。

  • 基于等式的Label Selector使用等式类的表达式来进行选择:
    name = redis-slave: 选择所有包含Label中key="name"且value="redis-slave"的对象;
    env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象。

  • 基于集合的Label Selector使用集合操作的表达式来进行选择:
    name in (redis-master, redis-slave): 选择所有包含Label中的key="name"且value="redis-master"或"redis-slave"的对象;
    name not in (php-frontend): 选择所有包含Label中的key="name"且value不等于"php-frontend"的对象。

在某些对象需要对另一些对象进行选择时,可以将多个Label Selector进行组合,使用逗号","进行分隔即可。基于等式的LabelSelector和基于集合的Label Selector可以任意组合。例如:

name=redis-slave,env!=production name not in

(php-frontend),env!=production

5、ReplicaSet

ReplicaSet 实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,所以我们通常不需要直接使用 ReplicaSet。

6、Deployment

应用管理者,是用于部署应用的对象,Deployment内部使用了Replica Set来实现的,我们可以把Deployment看做RC的一次升级。

7、Namespace

命名空间,Namespace在很多情况下用于实现多租户的资源隔离。Namespace通过集群内部的资源对象"分配"到不同的Namespace中,形成逻辑上纷纷组的不同项目,便于不同的分组共享使用整个集群的资源的同时还能被分别管理。

8、Job

Job 用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。

以上是关于Kubernetes核心模块的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes —— 核心模块

Kubernetes — 核心资源对象 — Controller

云原生训练营模块四 Kubernetes 架构原则和对象设计

Kubernetes核心概念总结

kubernetes 核心组件之 APIServer

Kubernetes核心概念总结(摘选)