Kubernates 原理:
来源于https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/user-guide/README.md
(图片来源于网络)
1) 概述: 所有的containers都运行在pods中.一个pod可以主持一个或多个Containers(必须同一台机器且共享相同的资源).如果container运行失败,会有node的agent,即kubelet,来自动重启. 但如果pod运行失败,则只能通过replication controller(简称rc)来自动控制. 所以关系可以理解为: kubelet---->container , rc----->pod.
kubernetes为每一个pod分配一个ip. kubernetes后台利用Round-Robin算法策略来均衡pod负载,当一个pod被另一个pod替换时,kube proxy保持ip稳定.
每一个kubernetes的资源,如pod,都带有一个URI和UID来标示,URI记录资源类型,名称,命名空间等. 名称在命名空间中时唯一的. UID在任何时候,任何地点都是唯一的.
2)Cluster 组成
Master : Master组件用于提供cluster的控制.例如相应cluster的全局决定. Master理论上可以运行在任何节点,但通常将所有的Master(目前都只有一个)运行在相同的独立的VM上,与其他的user containers分开.
Node : 维持pods的运行并为pods提供运行环境.
3)Node
Node是Kubernetes的工作者,之前也叫Minion. Node可以是一个VM或者物理主机.每个节点有运行PODs所必须的服务,通过Master组件来管理. 这些服务包括docker, kubelet 和network proxy.
Node Phase:
Pending:新节点正在创建和配置 Running: 节点创建成功,kubernetes组件正在运行. Terminated: 节点从cluster中移除. 在此node中的所有pods都会被remove.
Node Condition: 节点条件的状态分为true,false,unknow. 通过json封装.
"conditions": [
{
"kind": "Ready", #条件类型
"status": "True", #条件状态
},
]
Node Management :
kubernetes会不断通过metadata.name属性检查节点的有效性,即看它是否具备运行条件.直到被删除或运行.
当前有三个与Node交互的组件: NodeController, kubelete 和 kubectl
NodeController时kubernetes master上管理Node的组件. 它有两个功能,cluster间的节点同步和单个节点的生命周期管理.
NodeController本身不提供节点,只给创建的节点建立一个representation.
Self-Registration of Nodes
For self-registration, the kubelet is started with the following options:
--api-servers=
tells the kubelet the location of the apiserver.--kubeconfig
tells kubelet where to find credentials to authenticate itself to the apiserver.--cloud-provider=
tells the kubelet how to talk to a cloud provider to read metadata about itself.--register-node
tells the kubelet to create its own node resource.
4)Pods 类似进程的东西,内部是一个container.是kubernates描述中的最小单位。
5)label/selector label顾名思义就是给pod一个标签,其实作用就是分组,利用selector把相同label的过滤出来.所以label是不唯一的。
6)replication controller 用于控制pod的副本个数,推荐使用这种方式创建pod,可以自动控制pod的数量保持恒定。
7) services 定义了一组pods,并且确定了访问他们的方式,如IP和DNS。services是抽象的,并不是实际存在的,5)中所讲的selector就是用来给pods分组,比如有一个buy的标签,分出了一组pods,那么这一组pods就属于一个service,他们提供统一的服务,又有一组sell分出了另外一组pods,他们属于另一个service,然而pods是动态的,他们可以被创建或者消亡,但服务员(sell pods)不关心客户(buy pods)是谁,客户也不关心服务员是谁,他们只需要得到服务就可以了,所以service的作用就是将一组相同标签的pods进行抽象,调用的时候不用关心具体是哪一个pod。Service收到Kube-proxy发来的消息,重定向到具体的pod端口,具体到哪一个是随机的,利用session affinity来决定。
7) Volume 一个挂载在外部的目录,通过在外部添加文件到这个目录,添加进去的文件会自动映射到docker内部的指定目录下。反过来也是一样。通过常用来做数据存储和交换。
8)Secret 用于存储密码等敏感信息。用户和系统都可以创建secret。
9)Name 就是pod的名字
10)Namespace 命名空间,通常一个集群可能有多个用户在跑,就可以用命名空间区分,不会互相干预,操作时需要加上--namespace=XXXX
11)Annotation 附注,添加label没有表达的额外信息。