K8S网上资料多而杂,K8S.io有很多官方文档,但是很多人看了这些文档会犯晕,因为内容很多,而且密度很大,很难一下子抓住核心概念。但是只有理解了这些核心概念,并且在大脑里建立起核心概念模型,才能运用好K8S。
K8S重要和基础的核心概念:
- 集群Cluster
- 容器Docker
- 豌豆荚POD
- 副本集ReplicaSet
- 服务Service
- 发布Deployment
- 配置ConfigMap/Secret
- DeamontSet
集群Cluster
- 这个集群由很多节点组成,而且可以按需添加更多节点,这些节点可以是物理机也可以是虚拟机。
- 每个节点都有一定的CPU和内存容量。
- 整个K8S集群可以抽象看成超大计算机,它的CPU和容量是所有节点的CPU和容量总和,而且可以按需给这台计算机添加更多的CPU和内存。
容器Docker
- K8S是容器调度平台,所以容器是K8S的一个基本概念。
- 理解容器关键是两点:
- 打包机制。背后是由容器的Image机制来实现。
- 隔离机制。背后是由Name Space和CGroup来实现。Name Space负责隔离,CGroup负责授权。
- 容器通常被比做集装箱,这个比喻很形象,集装箱是用来打包和运输货物的,而且可以相互隔离。
- 从宿主机操作系统视角来看,容器其实是一个个的进程。
- 从容器内部视角来看,容器就是一个个完整的操作系统,有自己的文件系统,网络,CPU,内存资源。
容器是镜像的运行时实例,镜像是OS文件系统+应用文件+依赖的完整打包。
镜像可以说是容器的模板。
豌豆荚POD
- Pod是容器调度的基本单位,一个Pod可以跑一个或多个容器。他们共享Pod的文件系统和网络,每个Pod有自己独立的IP,他们共享IP和空间,并且容器之间可以通过localhost进行相互访问。
- 大部分场景下,一个Pod只跑一个容器。
- K8S没直接调度容器,而是增加了Pod封装,主要是考虑一些需要辅助容器的场景(sidecar),另外一个是考虑可以替换不同的容器技术。
- 副本集ReplicaSet
- 一个应用发布的时候,一般不会只发一个Pod实例,一般会发布多个,这样才能实现高可用。
- ReplicaSet是和一组Pod相对应的概念。
- 它通过YMAL或者JSON文件来配置容器镜像,端口,副本数量,点火和健康检查机制,环境变量,Valume挂载等等信息。
- 运行时,会监控和维护Pod的数量。如果Pod多了会下线一些,少了会增加一些。
服务Service
- Pod在K8S中是一个不固定概念(ephemeral),因为Pod随时会挂或者重启(预期或非预期),相应的IP就会发生变化。
- 如果IP经常变,服务的消费方如何寻址呢?K8S通过引入Service这个抽象来解决,它屏蔽了应用的IP寻址和负载均衡这些细节。
- 消费方通过服务名称访问目标服务,Service底层机制会做IP寻址和负载均衡,即使这个应用的PodIP发生了变更,Service也会屏蔽这种变更,让消费方无感知(透明机制)。
发布Deployment
- 副本集可以实现基本的发布,包括实现金丝雀,蓝绿和滚动发布这些高级发布机制,但是实现起来比较繁琐。为了简化这些操作,K8S在副本集基础上又引入了Deployment这个概念。
- 简单讲Deployment是通过管理副本集实现蓝绿和滚动等高级发布机制。假设应用v1.0发布了,对应的副本集v1.0,我们可以通过Deployment进行升级发布应用的v1.1版本。它会先创建副本集v1.1,之后会不断的拉出绿色版本,拉入蓝色版本,直到所有的蓝色Pod全部上线,绿色Pod全部下线。这个过程Service会屏蔽IP变更,让消费方无感知。如果蓝色Pod点火健康检测不通过,Deployment会自动终止并回退发布。即使发布成功完成,后续根据需要,发布人员仍然可以通过Deployment回退到之前的某个版本,所以Deployment是一种更灵活的发布机制。
特别强调:Deployment和Service是和应用发布相关的两个概念,也是发布时候经常使用的两个概念,我们发布所要描述的文件里头,主要就是Deployment和Service的规范。
Service是服务间相互路由寻址概念。
- 首先,集群内部Client通过Service间接访问目标应用Pod其次,集群外部Client如果要访问集群内部应用Pod,也是通过Service间接访问。
配置ConfigMap/Secret
ConfigMap
K8S内置支持配置中心,对应的概念叫ConfigMap,针对不同环境的不同配置值,根据启动前后分:
- 启动前一次性配置好的:如SQL链接字符串等
- 启动后的动态调整配置:如缓存过期时间,TTL值,商品促销限购数量等。
如上图,配置可以注入也可以挂载成文件。
Secret
有些配置是涉及用户敏感数据的,比如用户名密码,安全证书等,K8S通过Secret支持敏感数据的配置,可以认为是一种特殊的Config,提供更安全的配置和访问机制。
DeamonSet
有时候需要在每个微服务当中常驻一个守护进程,deamon进程,比如监控场景,需要在每个机器上部署一个fluentd(日志采集进程),或者是prometheus的exporter进程。针对这种场景,K8S支持一个叫DeamonSet的发布概念,可以在每个worker的节点上部署一个守护进程Pod,并且保证每个节点上有且仅有一个这样的Pod。
其他概念
- volume会随着pod一起存亡
- persistentVolume支持云存储,可以插拔,是一种高级持久存储方案。
- pvc是申请pv时候需要的规范。
- pv,pvc的引入使得volume和具体的物理存储进一步解耦。
- statefulset顾名思义是支持一种有状态应用的发布机制,是和replicaset相对的一种概念。比如mysql或者redis的发布。
- job跑一次就结束任务
- cronjob周期性任务