在开始讨论 k8s 之前,我们先来聊一下容器 (Container)
Contaner
容器是一种以应用程式为中心 (application-centric) 的架构,能够在选定的基础环境中 (Infrastructure) 部署高效率 (high-performance)、可扩充 (scalable) 与个别独立 (isolate) 的应用程式。
选定的基础环境:可自行决定需要使用的环境、版本。
试试撰写 Dockerfile
高效率:不似庞大的系统,启动一个容器只需短短几秒
试试 docker run
可扩充:可动态新增或删除容器
个别独立:容器可互相沟通但容器间的运作并不会互相干扰
其中高效率、可扩充与个别独立为容器的主要特色。再来由于容器可以部署在多种不同环境 (Desktop, VMs, Cloud 等等),不但增加了便利与弹性,更能确保跨平台的一致性。
一致性
开发程式最常见的的问题是 "我的电脑可以跑!没问题" ,但事实可能是 "就只有我的电脑可以跑" 。透过容器一致性的特性能确保使用的环境都是一致的而不再因为环境的不同造成程式无法运作。
Container Orchestration
不同于开发 / 测试环境,在容器运行的正式环境 (production) 中,我们必须要确保应用程式能够
可容錯:当某些错误情况发生时,仍能确保系统能运作可扩展:在需要的时候能增加,在不需要的时候能减少能充分并有效使用资源:很重要!因为资源是要钱的!容器间能互相沟通:能察觉容器加入或删除可提供管道供外部存取:如果外部不能存取,可就真是孤芳自赏了不需要停机就能更新或回滚 (rollback):玩游戏的时候,大家应该最讨厌维修时间了吧 可扩展
可扩展应该分成两个部分来讨论:
- 硬体 (Vertical Scale)
- 应用程式 (Horizontal Scale)
Vertical Scale:透过云端平台,硬体 (host, cpu, memory, disk, ...) 的扩展可随着需求随时增加或减少。
Horizontal Scale:而应用程式的可扩展则需要透过类似 Container Orchestration 这类的工具来达成。另外,此类型的扩展有时候也需要增加更多硬体。手动扩展应用程式也是可行,但相对复杂度就会提高
总结Container Orchestrator 的好处
- 将多个主机 (Hosts or Node) 整合成一个丛集 (Cluster),每个主机都是丛集的一部分
- 调度容器运行在不同的主机上
- 提供运行在不同主机上的容器间沟通的管道
- 连结容器与储存 (Storage)
- 确保资源有效利用
- 确保容器运行状态 (Healthy check)
- 确保容器内存取的安全性
- 不需要直接存取容器,而是封装成更高阶的服务 (即虚拟化),例如 k8s 中的:Service, Ingress 等等