kubernetes
一、背景
Docker足以管理单个容器,但现实生产环境中存在以下要求:
1、对于大量容器和容器化应用的需求
2、多个容器需要跨多个服务器主机部署
3、容器安全性需要多层部署
导致了仅利用Docker来进行管理编排的困难性,因此我们需要一个“管家”来处理这方面的需求。K8s因此产生。
定义:用于管理云平台中多个主机上的容器化的应用,提供了应用部署,规划,更新,维护的一种机制。
通过总结出的核心特质可以更清晰地理解:
k8s本质上期望实现对容器执行操作地自动化管理
部分优势:
1、跨主机容器编排
2、自动化操作、管控容器应用部署、运作、更新
3、对应用进行自我修复和运行状况记录、检查
4、更充分地利用硬件
5、快速扩展容器化应用和资源等
二、原理
首先我将Kubernetes集群笼统地分为两个部分:
1、Master
管理节点,提供访问、控制入口
2、Node
运行Pod的服务节点,即具体的操作、运行单元
从集群到Master节点的所有通信路径都在apiserver中终止
apiserver - kubelet:
从apiserver到kubelet的连接用于获取pod的日志,通过kubectl来运行pod,使用kubelet的端口转发功能
apiserver -> nodes、pods、services:
从apiserver到Node、Pod或Service的连接默认为HTTP连接
*Pod
一个或若干个容器的组合,不同容器使用相同的网络命名空间和IP地址,使用不同的端口。
共享资源包括:
1)存储
2)网络,唯一地集群ip地址
3)运行信息
在节点出现故障的情况下,群集中的其他可用节点上将会调度之前相同的Pod
Kubernetes架构:
相比于Docker,k8s非常复杂,我们来详细说明每个组件的功能
Master中:
1、scheduler
资源调度:实现分配机器的功能,即为建立的Pod进行node选择
2、replication controller
维护集群的状态:创建和复制Pod,进行检测、更新等
3、api server
整个系统的入口:提供用来和集群交互的REST端点
Node:
1、Docker
容器服务
2、Kube proxy
创建代理服务:实现层级内部,Service到Pod的请求路由(网络代理)和转发(负载均衡)
3、Kubelet
维护容器生命周期:即接受来自API Server的请求,启动、停止、监控、汇报容器
其他:
1、kubectl
即用户命令
2、etcd
存储功能:保存整个集群的状态
总结:
结合架构与功能描述,因此我们可以整理得到一个完整的运行流程:
1)用户通过Kubectl提交所希望运行的pod(即容器)
进入Master节点:
2)api server接受,并把请求存储与etcd
3)利用scheduler分配机器
进入Node节点
4)kubelet启动、运行相应的Pod
此外,
在Master中,replication controller维护集群的状态,保持容器数量
在Noder中,Kube proxy根据service,实现网络代理和负载均衡
至此,我们对学习的知识做了一个完整的串联
在学习过程中对于Kube proxy有一些疑惑,需要补充一些知识才更加清晰
*Service
定义Pod以及访问Pod的策略的抽象
*Label
标识、标签,实质是Key/Value键值对
就像真实的标签,通过它实现查询和筛选
串联二者,Service也正是通过Label才能找到Pod组,而之前疑惑的kube-proxy正是通过这二者的配合,来建立转发,实现所谓的负载均衡。
同样的Controller也正是通过Label来进行筛选Pod副本数量,最终实现自动控制。
补充说明,核心技术理念:
这一部分的总结,有利于本人加深了对上述部分的理解
1、API
声明而非命令:保证了稳定性
每个API对象都有3大类属性:元数据metadata、规范spec和状态status。
元数据是用来标识API对象的,每个对象都至少有3个元数据:namespace,name和uid;除此以外还有各种各样的标签labels用来标识和匹配不同的对象
2、Service
每个service 对应 集群内部虚拟IP
通过虚拟IP访问而不是简单的固定IP和端口号
四种type
1)ClusterIP:在集群中内部IP上暴露服务,service只能从集群内部访问
2)NodePort:通过每个Node地ip和静态端口暴露服务,会路由到上述地clusterIP,可以从外部访问
3)LoadBalancer:负载均衡(云提供商),向外暴露,可以路由到上述二者
4)ExternalName :通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容
3、Namespace
类似的虚拟隔离作用
4、job
Job是K8s用来控制批处理型任务的API对象,Job管理的Pod根据用户的设置把任务成功完成就自动退出
5、DaemonSet
关注在K8s集群中的节点,保证每个节点上都有一个此类Pod运行。
典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支持K8s集群运行的服务
6、PetSet
在前面概念中所提及的RC下的pod是典型的无状态pod,但在k8s的新版本中出现了有状态的设置,即Petset
每个Pod独立存储,pod出现故障在其他节点“自愈”时,挂载上原来的存储,即保持了原有的状态