pod的概念
- 基础概念
- 自主试pod
- 控制器管理的pod
- RS
- HPA
- StatefulSet
基础概念
自主试pod
如上图,使用标准的容器方案进行部署,在主机上运行容器时。每一个容器都是独立的,每个容器都有自己的IP地址,每个容器都有自己的尾根,都有自己的挂载卷。
但是当我们想要将一个没有在容器里运行的环境迁移到 k8s 上来时就比较困难。有些组件之间是有联系的,应该是在一起的且通过localhost可以直接访问到的,而容器部署就不能很好的达到这个目的,不同的容器之间的交互就必须配置他们的反向代理等,这样很不方便我们的操作。
为了达到这个目的。K8S提供了pod这个概念。
如上图:
1)只要存在pod pause这个容器就会启动。
2)其他容器共用pause这个容器的网络栈,就是其他容器没有自己固定的IP地址。他们之间通过localhost互相访问,所以一个pod里面容器的端口是不能冲突的,端口冲突pod是无法正常启动的。
3)共享存储卷,一个pod里面即共享网络又共享存储卷。如pause挂载一个存储卷,其他容器都使用这个存储卷。
控制器管理的pod
RS
集合试的selector:
创建pod的时候会对他打标签,比如 app=appache
version=v1 这样的标签。
当我们要删除pod的时候就可以用逻辑: 当app等于appache 且 version等于v1时删除对应的pod。
大型项目中RS更有限。
滚动更新:
比如运行了两个pod 版本都是v1,这两个pod都需要更新成v2版本,滚动更新会先增加一个v2版本的pod然后删除对应的v1版本的pod,然后再增加另一个v2版本的pod再删除对应的v1版本的pod。这样就实现了滚动更新。
develop 不创建pod,只创建RS,RS来创建pod
HPA
Horizontal Pod Autoscaling 仅适用于 Deployment 和 ReplicaSet ,在V1 版本中仅支持根据 Pod的 CPU 利用率扩所容,在v1alpha 版本中,支持根据内存和用户自定义的 metric 扩缩容
StatefulSet
StatefulSet 是为了解决有状态服务的问题(对应 Deployments 和 ReplicaSets 是为无状态服务而设计),其应用场景包括:
1)稳定的持久化存储,即 Pod 重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现
2)稳定的网络标志,即 Pod 重新调度后其 PodName 和 HostName 不变,基于 Headless Service(即没有 Cluster IP 的 Service )来实现
3)有序部署,有序扩展,即 Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从 0 到 N-1 ,在下一个 Pod 运行之前所有之前的 Pod 必须都是 Running 和 Ready 状态),基于 init containers 来实现
4)有序收缩,有序删除(即从 N-1 到 0 0 )