k8s 架构
master**提供集群管理的控制中心
通常master通常会在一台VM/机器上启动所有的matser组件,并且不会在matser上运行用户容器
kubernetes主要核心组件:
etcd: k8s默认提供的存储系统,保存了整个集群的状态。
apiserver:提供了资源操作的唯一入口,提供认证,授权,访问控制,api注册和发现等机制。
-
controller manager: k8s运行管理控制器,负责维护集群的状态,故障检测,自动扩展,滚动更新等,
包括
- 节点(Node)控制器
- 副本(Replication)控制器 :负责维护系统中pod的副本
- 端点(Endpoints)控制器:连接service和pods
- Service Acount 和Token 控制器:为新的Namesapce创建默认账户访问和ApiToken
schedule: 负责资源调度,按照预定的策略将pod调度到对应的Node上
-
kubelet: 维护容器的生命周期,和Volume以及网络管理
功能
- 安装pod所需的volume
- 下载pod的Secrets
- 管理pod中docker容器
- 定期执行健康检查
- 返回pod的状态给系统及创建pod
- 返回node的信息给系统
Container runtime: 负责镜像管理及pod的运行
kube-proxy: 负责为Service的集群内部的负载均衡及服务发现
supervisord:supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行
-
fluentd:fluentd是一个守护进程,可提供cluster-level logging.。
其他组件:
其他组件: kube-dns: 为集群提供DNS服务
ingress Controller:为服务提供外网服务
Heapster:提供资源监控
Dashboard:提供显示
Feaderation:跨可用区的集群
Fluentd-elasticseacher:提供日志采集,存储和查询
架构设计及名词解释
pod
pod是k8s集群中运行和部署的最小单元,可以支持多容器,支持多容器共享网络地址和文件系统。可以通过进程间通信和文件共享高效的组合方式来完成服务。k8s的业务主要分为:长期伺候型(long-running),批处理型(batch),节点后台支撑型(node-daemon)和有状态应用型(stateful application)。分别对应的控制为Deployment,Job,DaemonSet和PetSet
比如:你运行一个操作系统发行版的软件仓库,一个Nginx容器用来发布软件,另一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务
复制控制器(Replication Controller,RC)
RC是k8s中保证高可用的API对象,可以通过监控pod来保证集群中运行的指定书目的pod副本。少于或者多于指定数目RC会对应的启动新的或者杀死多于的副本。
RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如:控制集群提供高可用的Web服务
副本集:(Replica Set, RS)
RS是新一代的RC,可以匹配更多种类的匹配模式。一般不单独使用,而是作为Deployment的理想参数使用。
kubectl edid deployment -n namespace name --replica == 0 //指定副本数目为0 相当于删除
部署(Deployment)
deployment白叟是对k8s集群的一次更新操作。deployment可以创建一个新的服务,更新一个新的服务,也可以滚动升级一个服务(使用RS改变其副本数)。k8s未来对所有长期伺候型服务的管理都会通过Deployment来管理。
服务(service)
pod的节点上的服务随时可能停止,在另一个node启动以一个新的ip启动一个新的pod,因此难以确认服务ip和端口,客户需要访问的服务对应的就是service,每个service对应一个集群内部的有效的虚拟IP, 所以需要service 来稳定的提供服务的服务发现,来供用户找到对应的服务。k8s集群中集群内部通过虚拟IP访问服务,k8s通过kube-proxy(分布式代理服务器)实现负载均衡,每个节点上都有一个kube-proxy。需要访问的节点越多提供负载均衡的kube-proxy也就越多,解决了负载均衡的服务均衡和高可用的问题。
任务(Job)
Job是k8s用来控制批处理任务的API对象。批处理业务和长期伺候业务
后台支撑服务(DaemonSet)
后台支撑服务就是长期伺候型服务批处理服务的核心业务。
点型的后台服务包括,存储,日志和监控在每个节点上支持k8s集群运行的服务。
有状态服务(PetSet)
无状态服务体系:无状态(stateless ),牲畜(cattle),无名(nameless),可丢弃(disposable)
有状态服务体系:有状态(stateful),宠物(pet),有名(having name),不可丢弃(non-disposable)
RC和RS主要提供无状态服务,其所控制的名字是随机设置的,一个pod出故障了就被丢弃,在另一个地方重启重新设置一个新的pod,主要注意的是pod的总数。一般不挂载存储或者共享存储,每个Pod挂载自己独立的存储。
PetSet中的pod名字是事先确认的,不能更改,PetSet的名字与pod进行绑定,一般用于管理mysql,etcd,zookeeper等有状态服务。使用petset,pod任然可以通过移动到不同节点提供高可用的服务,通过外挂存储来提高可靠性,
集群联邦(Federation)
联合集群服务就是为跨Region跨服务商k8s集群服务而设计的。每个k8s Federation都有自己的分布式存储,API server 和Controller Manager,用户可以通过Federation的API Server注册该Feaderation的成员k8s Cluster。当用户通过Federation的API Server创建,更改API对象时,k8s Federatio会先在自己所有注册的子k8s Cluster都创建一份对应的API对象。在提供服务时,k8s fedaration会先在自己的子Cluster之前做负载均衡然后发送到具体的k8s cluster集群上。
存储卷(Volume)
Docker的存储卷生命周期作用范围是一个容器,k8s的生命周期作用周期和范围是一个pod,被pod中的所有容器共享。
支持类型
公有云平台存储:AWS,Google和Azure云
分布式存储:GlusterFS 和Ceph
主机本地目录:hostPath和NFS
逻辑存储:PVC
持久存储卷(Persistent Volumen,PV)和持久存储卷声明(Persistent Volume Claim,PVC)
PV和PVC使得在配置pod的逻辑里面可以忽略后台存储技术的配置。pv相当于Node的资源提供者,由管理员配置,PVC和pod是资源的使用者,由k8s集群使用者服务管理员配置
节点(Node)
所有pod运行所在的工作主机,使用运行在node节点上的容器。
密钥对象(Secret)
secret 用来保存和传递密码,密钥,认证凭证等敏感信息对象。k8s的集群配置和使用服务都不可避免的使用到了这些敏感信息实现登录,认证等功能。
例如:访问AWS存储的用户名密码。为了避免将类似的敏感信息明文写在所有需要使用的配置文件中,可以将这些信息存入一个Secret对象,而在配置文件中通过Secret对象引用这些敏感信息。这种方式的好处包括:意图明确,避免重复,减少暴漏机会。
用户账户(User Account)和服务账户(Service Account)
用户账户:提供个人账户标识(是人的身份,与namespace无关)
服务账户:为计算机进程提供k8s集群中的pod提供 账户标识(与特定的namespace相关)
名称空间(Namespace)
namespace为k8s集群提供虚拟的隔离作用,初始的时候提供了俩个default和kube-system,初次除此之外还可以创建其他的名称空间满足需要
RBAC访问控制(Role-based Access Control)
基于角色的访问控制的授权模式.
参考链接