K8s Pod:
自主式 Pod:死亡后没有控制器将其拉起
控制器管理的 Pod:死亡后控制器能够将其拉起
Pod 内容器:
当一个 Pod 创建后,会立即在 Pod 内创建一个 pause 容器,该 Pod 内其他容器公用该容器的网络协议栈;
因此,一个 Pod 中两个容器的端口不能相同,一个容器访问另一个容器的端口,直接用localhost:port
就可以访问;
此外,一个 Pod 内容器也可以共享 pause 的存储卷;
Pod 控制器类型
ReplicationController & ReplicaSet & Deplovment
- ReplicationController
ReplicationController 用于确保容器应用的副本数始终保持在用户定义的副本数,如果有容器异常退出,会自动创建新的 Pod 取代;异常多出来的容器也会被自动回收;
新版本中,Kubernetes 建议使用 ReplicaSet 替代 ReplicationControlle - ReplicaSet
ReplicaSet 与 ReplicationController 没有本质不同,但 ReplicaSet 支持集合式的 selector - Deployment
建议使用 Deployment 自动管理 ReplicaSet,ReplicaSet 不支持 rolling-update,但 Deployment 支持
Deployment 本身不支持创建 Pod,它可以创建 ReplicaSet,再通过 ReplicaSet 创建 Pod - HPA 平滑扩展
基于 RS 创建,监控 RS 中 Pod 的状态;如可以配置当 RS 中 Pod 的 CPU > %80 时就创建新的 Pod
StatefulSet
用于解决有状态服务问题:
- 稳定的持久化存储:Pod 重新调度后仍然能访问相同的持久化数据,基于 PVC 实现
- 稳定的网络标志,Pod 重新调度后其 PodName 和 HostName 不变
- 有序部署:即 Pod 的创建是有顺序的,按照定义的顺序,下一个 Pod 运行之前,所有之前的 Pod 都是 Running 或 Ready 状态,基于 init containers 实现
- 有序收缩:有序删除
DaemonSet
确保全部(或一些)Node 上运行一个 Pod 的副本;当有 Node 加入集群时,会为他们新增一个 Pod;当有 Node 从集群移除时,这些 Pod 会被回收;删除 DaemonSet 会删除它创建的所有 Pod
应用场景:
- 运行集群存储 daemon,例如再每个 Node 上运行 glusterd、ceph
- 在每个 Node 上运行日志收集 daemon,例如 fluentd、logstash
- 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter
Job,Cronjob
Job 负责批处理任务,即禁止性一次的任务,它保证批处理任务的一个或多个 Pod 成功结束;
Cron Job 管理基于时间的 Job,即:
- 在给定时间点只运行一次
- 周期性地在给定时间点运行
相比于直接运行的脚本任务,Job 能够确保任务执行一定是成功退出的,并且可以设置正常退出的次数
服务发现
Pod 上都有标签,如 version:1 等等;
Service 服务发现 通过标签来选择 Pod 对外暴漏;客户端可以通过 Service 的 ip:port 来访问这些具有相同标签的 Pod;并且 Service 可以实现负载均衡,如使用 RR 方式