Kubernetes的魔法
Kubernetes是容器化应用程序模式的平台。这些模式使应用程序更易于部署,管理,扩展和从故障中恢复 - 这是”魔法”。
大纲
• 无状态模式
• 有状态模式
• 守护进程模式
• 批处理模式
无状态模式
不必为你的应用保持状态/持久化数据
• 典型应用代表: Nginx, Tomcat
• Replication Controller
• ReplicaSet
• Deployment
Replication Controller
ReplicaSet
Deployment
Deployment的常见用法
• 升级/回滚
kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
kubectl rollout history deployment/nginx-deployment --revision=2
kubectl rollout undo deployment/nginx-deployment --to-revision=2
• 暂停/恢复
kubectl rollout pause deployment/nginx-deployment
kubectl rollout resume deploy/nginx-deployment
• 弹性、按比例扩/缩容
kubectl scale deployment nginx-deployment --replicas=10
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80 # 需要和HPA联动
maxSurge=3; 25%(默认)
maxUnavailable=2; 25%(默认)
有状态模式
• 典型应用: Zookeeper, MongoDB, MySQL, etcd
• StatefulSet(曾用名: PetSet)
• StatefulSet的Pod和普通Pod区别: 有身份的!
• StatefulSet身份三要素:
- - 域名(网络) < - 容器IP易变
- - PVC(存储)
- - Pod Name(主机名)
• 配合headless service, PVC一起使用
• 严格的启动/删除顺序: 0, 1, 2…
守护进程模式
典型应用: fluentd, linkderd, ceph, kube-proxy
DaemonSet:保证每个节点总是运行一个Pod实例
- - NodeSelector或NodeAffinity指定Node
- - 经过( 1.11 Alpha特性) / 不经过调度器(不管Node状态)
- - 支持滚动升级
- - 支持级联/非级联删除
批处理模式
典型应用:并发执行的作业 – batch job
- - 相关但独立的工作项:发邮件、数据扫描、文件转码
Job
- - 保证指定数量Pod成功运行结束 - completions
- - 支持并行 - parallelism
- - 支持错误自动重试( 10s, 20s, 40s,… 6min)
- - 删除Job会触发对应Pod删除
CronJob
- - 基于时间调度的Job( Cron格式)
- - 用户可以暂停/恢复Job的周期性调度 .spec.suspend={true,false}
- - 管理Job -> Pod
Job
Job常见使用方法
做不同的事情
- - 扩展Job Expansion,传入参数、环境变量
做同样的事情
- - 工作队列形式, 与Work Queue( RabbitMQ)结合
CronJob
K8S工作负载总结
- 无状态模式: 使用Deployment提供高可用、弹性扩/缩容、升级 /回滚
- 有状态模式:使用StatefulSet提供一致性, Pod的唯一/粘性的身份标识、存储,按序部署、扩缩容
- 守护进程模式:一个节点部署一个(可自定义节点范围)
- 批处理模式:并行跑多个Pod,并且保证都成功返回