2. Kuberntes中的一些基本概念
Pod
Pod是Kubernetes集群调度的基本单元。每一个容器化的应用在Kubernetes中必须被封装为一个Pod后,才能被调度和执行。每一个Pod可以包含一个或多个Container。Pod不直接运行应用,而是通过启动容器来运行应用。
当一个Pod中包含多个容器时,这些容器共享一个Pod Environment,即共享Pod的网络、存储、IPC命名空间,内存等。例如,同一个Pod的所有Container共享该Pod的IP地址,如果Pod中的两个容器需要彼此通讯,他们是通过localhost进行通讯的。如下图:
Pod的特性
Pod是调度的基本单元,也是扩展的基本单元
也就是说,当你需要对一个应用进行横向扩展时,你不能通过想Pod中添加容器进行扩展,只能通过增加Pod进行扩展。
Pod的部署是一个原子操作
当Pod中的所有容器都启动成功后,Pod才算启动成功。如果Pod中的任何一个容器没有启动成功,那么整个Pod对外都是不可用的。也就是说,Pod中的所有容器承载的应用,要么都可用,要么都不可用。
Pod运行实例是不可变的
当Pod已经成功调度并运行后,它就是不可变的。你不能在Pod运行时改变它的任何属性。如果你改变了Pod的任何属性,Kubernetes会将该Pod的所有运行时副本删除,然后使用新配置启动相同数量的Pod副本。这个过程是替换,而不是在线更新这些Pod.
Pods are mortal(不知该如何翻译)
当Pod在运行时发生了某种错误,或者意外退出,Kubernetes不会尝试解决Pod的错误并重启该Pod,而是会立即在某个worker node上启动一个该类型的Pod,替换掉出现错误的Pod实例,Pod运行的节点是不固定的。也就是说,Pod的管理是牲口模式。
Pet vs Cattle
在云计算中,有两种服务管理模式。即 Pet (宠物)和 Cattle (牲口)模式。 这两种管理模式实际上决定与对待服务的态度。如果你把服务当做Pet来看待,当Pet生病了,你会帮它医治,当它去世了,你会难过。 对待服务也一样,当服务挂掉了,你会登陆到服务器,查看服务日志,找到服务挂掉的原因,然后解决,尝试重启该服务。平时,你也会小心翼翼的呵护你的服务。 而Cattle模式则完全不同,当某个牲口病了,你压根不是很关心,因为它无关紧要。当它死了,你也不会难过。 服务也一样,当服务挂掉后,你不会登陆服务器去找原因,不会小心翼翼的呵护它,当它挂掉后,你直接在另外一台服务器上启动一个同类型的服务来代替他即可。 在Kubernetes集群中,对待Pod就像对待牲口一样。
Deployment
deployment是最基本的一种Controller。它的作用是管理Pods,在Pod的基础上增加了横向扩展、滚动更新和Pod的动态替换等功能。
Service
上文中我们已经知道Pod的IP地址是不固定的。当一个Pod挂掉后,Kubernetes集群会在其他节点 上立即启动一个同样的Pod来代替它。如果Pod中运行着一个微服务,这个服务的IP不能固定,他们其他服务怎么访问它呢?Kubernetes引入了Service。Service向外暴露固定的DNS服务名,IP和端口号,同时监视Pod的变化,将流量负载均衡到Pod中。Service只能提供四层(TCP和UDP流量)负载均衡,不能提供七层流量负载均衡。如果你想使用七层负载均衡,需要Ingress。