K8S相关的概念 ---- Kubernetes

1. Pod

       每个容器都是独立存在的,都有自己的IP地址、挂在卷等等。但是在进行K8S移植的时候就不太容易了,比如把没有在容器中运行的环境迁移到K8S上就比较难以迁移。K8S中引入pod概念,定义一个pod,会先启动第一个容器pause,只要运行pod,就会运行这个容器。如果这个pod有两个容器,这两个容器会公用pause容器的网络栈、存储卷。这两个容器没有自己独立的ip地址,容器进程是不隔离。相互访问的时候,不需要写IP地址,加映射什么的,直接使用localhost就可以相互访问。这是因为这两个容器都共享pause容器的网络栈。在同一个pod中容器之间的不能冲突,如果端口重复,可能会出现无限重启或者起不来。

       如果pod挂在了一个存储卷,pod中的两个容器都想访问存储。这个pod会共享pause,容器也会共享存储。所以,在同一个pod中即共享网络,又共享存储卷。

2. Pod控制器类型

① ReplicationController:简称rc,用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod 来替代。而如果异常多出来的容器也会自动回收。在新版本的Kubernetes 中建议使用ReplicaSet 来取代ReplicationControlle

② ReplicaSet:ReplicaSet 跟ReplicationController 没有本质的不同,只是名字不一样。但是ReplicaSet 支持集合式的selector,创建pod的时候会打标签,删除容器的时候可以使用当是某个容器的时候要做什么操作。在大型项目中rs比rc更简单有效有意义。

③ Deployment:虽然ReplicaSet 可以独立使用,但一般还是建议 使用Deployment 来自动管理ReplicaSet ,这样就无需担心跟其他机制的不兼容问题(比如ReplicaSet 不支持 rolling-update 而 Deployment 支持,rolling-update就是滚动更新),Deployment要和ReplicaSet放在一起是因为,Deployment不负责pod的创建。Deployment需要创建ReplicaSet来达到创建pod的能力。

3. HPA

       HPA即HorizontalPodAutoScale,HPA是基于RS定义。HPA设定的CPU的平均利用率大于某个值的时候就扩展,即新建pod。直到达到最大值,也就是当CPU的平均利用率已经达不到某个值,就不会进行pod的创建。如果CPU的平均利用率慢慢降低时,就开始回收pod,但是不能小于HPA定义的最小pod数。这也就实现了水平自动扩展的目的。HPA 仅适用于Deployment 和ReplicaSet ,在V1 版本中仅支持根据 Pod 的CPU 利用率扩所容,在v1alpha 版本中,支持根据内存和用户自定义的metric 扩缩容

4. StatefulSet

StatefulSet是为了 解决有状态服务 的问题(对应Deployments 和ReplicaSets是为无状态服务而设计),其应用场景包括:

① 稳定的持久化存储,即Pod 重新调度后还是能访问到相同的持久化数据,基于PVC 来实现

② 稳定的网络标志,即Pod 重新调度后其PodName和HostName不变,基于Headless Service,即没有Cluster IP 的Service来实现

③ 有序部署,有序扩展,即Pod 是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0 到N-1,在下一个Pod 运行之前所有之前的Pod 必须都是Running 和Ready 状态),基于init containers 来实现

④ 有序收缩,有序删除(即从N-1 到0)

Docker主要面对的时无状态服务,没有对应的存储需要时时保留,如果拿出来再放进去依然正常工作。如apache服务、LVS负载均衡调度期。有状态服务有mysql、mongodb等,都需要时时进行数据的更新以及存储,抽离出集群之后,再放回来就没有办法工作。

5. DaemonSet

DaemonSet 确保全部(或者一些)Node 上运行一个Pod 的副本。当有 Node 加入集群时,也会为他们新增一个Pod。当有 Node 从集群移除时,这些Pod 也会被回收。删除DaemonSet 将会删除它创建的所有Pod。使用DaemonSet 的一些典型用法:

① 运行集群存储daemon,例如在每个Node 上运行glusterd、ceph

② 在每个Node 上运行日志收集daemon,例如fluentd、logstash

③ 在每个Node 上运行监控daemon,例如Prometheus Node Exporter

6. Job 与 Cron Job

       Job 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。如果想要备份数据库,备份的代码就可以放到 pob 中运行,再放到 job 中执行。直接在linux中运行备份代码也是一样的,但是 我们封装这个 pob 是可以重复利用的。如果脚本意外退出是没有办法执行的,但是 Job如果判断脚本不是正常退出就会重新执行,直到正常退出,并且可以设置正常退出的次数,多少次执行一次。

       Cron Job可以在特定时间重复执行, Cron Job管理基于时间的Job:在 给定时间点只运行一次周期性地在给定时间点运行

7. 服务发现

       客户端想要访问一组 pod 时,如果这些 Pod 是不相关的情况,就不可以使用service透明代理的。所以,Pod必须要有相关性。
在这里插入图片描述
       比如是这些 pob 是由同一个RS、RC、Deployment创建的,或者拥有同一组标签都是可以的被service收集到。service收集 pod 是通过标签的方式。service会有自己的ip和端口,客户端就可以访问service,间接访问 pod。service访问pod的时候采用Round Ribben算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章