1.kubernetes介绍
k8s是一个完备的分布式系统支持平台,k8s具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级能力和在线扩容能力、可扩展的资源自我调度机制,以及粒度度的资源配额管理能力。同时k8s提供了完善的管理工具。这些工具包含开发,部署测试,运维监控在内的各个环节,因此,k8s是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式完备的分布式系统开发和支撑平台。
2.简单了解k8s的基础知识
1)service服务是分布式集群架构的核心,一个service对象拥有如下关键特征:
a.拥有一个唯一的制定的名字(比如mysql-server)
b.拥有一个虚拟的IP(Cluster IP,Service IP或者是VIP)和端口号
c.能够提供某种远程服务能力
d.被映射到了提供这总服务能力的一组容器应用上
一个service通常是由多个相关服务进程来提供服务的,每个进程都有独立的(IP+port)访问点,但k8s能够通过service(虚拟Cluster+Service Port)连接指定的service上,更重要的是k8s中的service本身一旦被创建就不再变化了。我们不必为了服务IP地址的变化而头疼。
2)pod对象,为service提供的这组进程放到容器中进行隔离。是k8s最重要也是最基本的概念。




k8s pytorch分布式训练 k8s 分布式事务_Pod


备注:


1)每一个pod里运行着一个特殊的容器---Pause容器,其他容器都是业务容器,这些业务容器共享pause容器的网络栈和Volume(逻辑卷)挂载卷。因此他们之间的通信和数据交换更为高效。

2)k8s设计了pod对象,将每个服务进程包装到相应的pod中,使其成为pod中运行的一个容器(container),k8s为每一个pod提供一个唯一的Ip地址。一个Pod中的多个容器共享此ip地址。

3)pod运行在一个节点(node)的环境中,通常一个节点上可以运行几百个pod

4)并不是每一个pod和它里面运行的容器都能够映射到一个service上,只有那些提供服务的一组pod才会被映射到一个service上。

5)Pod有两中类型:

普通的Pod:一经创建,存放在etcd中,随后被k8s master调度到某个Node并进行绑定,随后pod被对应的node上的kubelet进程实例化一组相关的Docker容器并启动。

静态的Pod:不存放在etcd存储中,存放在某个具体的Node上的具体文件中,并且只在此node中启动运行

默认情况下,当pod里的某个容器停止了,k8s会自动检测到这个问题并且重新启动这个Pod(重启Pod里的所有容器),如果Pod所在的Node宕机了,则会将这个Node上的所有Pod重新调度少其他节点上。

6)Pod可以对器能使用的服务器上的计算资源进行配额,在1.5.2版本中只能对cpu和内存进行限额,其中cpu和内存的配额都是一个绝对值。

cpu配额的单位是m,通常一个容器的cpu配额定义为100~300m,即占用0.1~0.3个cpu。

内存的单位是内存字节数。

在k8s中,一个计算资源进行配额限定需要设定一下两个参数

Requests:该资源最小申请量,系统必须满足要求

Limits:该资源最大允许使用的量,不能被突破,当试图超过这个量时,会被k8s干掉并重启。


yaml文件中配额的实例:


k8s pytorch分布式训练 k8s 分布式事务_集群管理_02


3.label标签:建立service和pod之间的关联关系


1)k8s为mysql的pod贴上了name=mysql标签,然后给相应的service定义标签选择器(label selector)

2)mysql service 的标签选择器的选择条件是name=mysql 意为该service要作用于所有包含name=mysql标签的pod上。这样就解决了service与pod的关联关系,或者是基于集合的判断(in 和 notin)

3)label Selector在k8s中重要的使用场景:

a.kube-controller进程通过资源对象RC上定义的label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定的全自动控制流程

b.kube-proxy进程通过Service的label Selector来选择对应的Pod,自动建立起每个Service到对应的Pod的请求转发路由表,从而实现Servcice的智能负载均衡机制。

c.通过对某些Node定义特定的label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod定向调度的特性


4.集群管理方面

a.组成:master节点和一群node节点


master节点:

1.master指的是集群控制节点,每一个k8s集群都有一个master节点来负责集群中管理和控制,所有执行命令都是master节点上运行的。通常master会占用一台服务器或者虚拟机。

2.运行着集群管理相关的一组进程:

kube-apiserver:提供HTTP Reset借口的关键服务进程,是k8s里所有资源增删改查操作的唯一入口,也是集群控制的入口进程

kube-controller-manager:所有资源对象的自动化控制中心,-------资源的大管家

kube-scheduler: 负责资源调度(pod调度)的进程,----------公司调度室

作用:

实现整个集群的资源调度,pod调度,弹性伸展,安全控制,系统监控,和纠错等管理功能,并且都是全自动完成

补充:master节点上还启动一个etcd Server进程,因为k8s里的所有的资源对象的数据全部是保存在etcd(非关系数据库)中的。


node节点:
 1.node节点可以是物理机也可以是虚拟机,node节点是k8s集群中的工作负载节点,每一个node都会被master分配一些工作负载(docker 容器),当某个node宕机时,其上的工作负载会被master自动转移到其他节点上去。在node上k8s管理的最小运行单元是pod
 node上运行关键进程:
 kubelet:负责pod对应的容器的创建,启停等任务,同时与master节点密切协作,实现集群管理的基本功能
 kube-proxy:实现kubernetes Service(kube-apiserver)的通信与负载均衡机制的重要组件
 docker: docker 引擎,负责本机的容器创建和管理工作
 作用:
 负责pod的建立,启动,监控,重启,销毁,以及实现软件模式的负载均衡器
 补充:
 node节点可以在运行期间动态添加到k8s的集群中。默认情况下,kubelet会向master注册自己,一旦node被纳入集群管理范畴,kubelet会定时向master汇报自己的相关操作系统信息和有哪些pod在运行,这样master才能知道每个node的资源使用情况和实现高效均衡的资源调度策略。一旦master没有收到node上报信息,会判定该node已经不在了,会自动创建node。


5.扩容的处理
k8s集群中只需要为扩容service关联的pod创建一个Replication Controller(RC)文件
在一个RC文件中包含3个关键的信息:

  1. 目标pod的定义
  2. 目标pod需要运行的副本数量(Replicas)
  3. 要监控的目标pod的标签(label)
可以动态缩放实现RC的副本数量:
kubectl  scale   rc   pod_name  --replicas=num


RC set 的一些特征和作用:


k8s pytorch分布式训练 k8s 分布式事务_集群管理_03