Kubernetes
- 是什么: 容器集群管理系统,是个开源的平台,可以实现容器集群的自动化部署、资源调度、服务发现、自动化扩缩容、维护。
通过Kubernetes:快速部署应用、快速扩展应用、无缝对接新的应用给你、节省资源,优化硬件资源的使用,是个分布式架构解决方案,是一个一站式的完备的分布式系统开发和支撑平台。
是Google开源的容器集群管理系统,它构建在Docker技术之上,为容器化的应用提供资源调度,部署运行,服务发现,扩容缩容等一整套功能,本质上基于容器技术的Micro-PaaS平台。将Docker容器宿主机组成集群,统一进行资源调度,自动管理容器生命周期,提供跨节点服务发现和负载均衡;更好的支持微服务理论,划分、细分服务之间的边界,比如label、pod等概念。
Kubernetes特点:
1. 可移植:支持公有云、私有云、混合云、多重云
2. 可扩展:模块化、插件化、可挂载、可组合
3. 自动化:自动部署、自动重启、自动复制、自动伸缩/扩展、
- 能做什么:在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能提供一个以“容器为中心的基础架构”,满足在生产环境中运行应用的一些常见需求:
多个进程(作为容器运行)协同工作。(Pod)
存储系统挂载
Distributing secrets
应用健康检测
Pod自动伸缩/扩展
Naming and discovering
负载均衡
滚动更新
资源监控
日志访问
调试应用程序
容器
- 传统应用部署的缺点:应用的运行、配置、管理、所有的生存周期将于当前操作系统绑定,不利于应用升级、更新、回滚等
- 部署容器:每个容器之间相互隔离,都有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
- 相对于虚拟机,容器可以快速部署,由于容器与底层设施、机器文件系统解耦,所以它能在不同云、不同操作系统之间迁移。
- 容器比虚拟机更轻量、更“透明”,更利于监控和管理。
容器的特点:占用资源少、部署快,每个应用都可以打包成一个容器镜像。为应用创建容器镜像,因此每个应用不需要与其余的应用对站组合,也不依赖于生产环境基础结构,从而保证从研发、测试、生产提供一致性。
容器优点:
(1)快速创建/部署应用:与VM虚拟机相比,容器镜像的创建更加容易。
(2) 持续开发、集成和部署:提供可靠且频繁容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)
(3)开发和运行相分离:在build或者release阶段创建容器镜像,使得应用和基础设施解耦。
(4)云平台或其他操作系统:可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行。
(5)Loosely coupled,分布式,弹性,微服务化:应用程序分为更小的、独立的部件,可以动态部署和管理。
(6)资源隔离
(7)资源利用:更高效
K8s的四组概念:
1.Pod/Pod控制器:
能被运行的最小单元,1个Pod可以运行多个容器,又叫边车模式(SideCar)模式
Pod控制器有:Deployment、DaemonSet、ReplicaSet、StatefulSt
Name/Namespace:定义在“资源”的元数据信息里,名称空间可以理解k8s内部的虚拟集群组;k8s默认的名称空间:default、kube-system、kube-public
2. Lable/Lable选择器:
标签是K8S特色的管理方式,便于分类管理资源对象。 标签与资源是多对多的关系,可以使用标签选择器过滤指定的资源。
3. Service/Ingress:
Service:虽然每个Pod都会被分配一个单独的iP地址,但这个Ip地址会随着Pod的销毁而消失
一个Service可以看作一组提供相同服务的Pod的对外访问接口
Service作用于哪些Pod是通过标签选择器来定义
4.Ingress:是k8s集群里工作在OSI网络参考模型下,第7层的应用,对外暴露的接口
Service只能进行L4流量调度,表现形式是ip+port
Ingress则可以调度不同业务域、不同URL访问路径的业务流量
Mesher是L7层协议代理,Mesher以Sidecar模式
可见官网:https://www.kubernetes.org.cn/img/2016/10/20161028141542.jpg
- 核心组件:
配置存储中心-etcd服务,保存整个集群的状态
- 主控节点(master):
kube-apiserver:提供资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
kube-controller-manager服务:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
kube-scheduler服务:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
2. 运算节点(node)节点:
Kube-kubelet服务:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
Kube-proxy服务:负责为Service提供cluster内部的服务发现和负载均衡。
Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
CLI客户端:kubectl(Command Line Interface,命令行接口)
- 核心附件:
CNI网络插件->flanner/calico
服务发现用插件-> coredns :负责为整个集群提供DNS服务
服务暴露用插件->traefik
GUI管理插件->Dashboard
Fluentd-elasticsearch提供集群日志采集、存储与查询
K8s管理面组件包含4个关键组件:kube-apiserver、kube-controller-manager、kube-scheduler;
1. Kube-apiserver作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTful接口的方式提供给外部客户和内部组件调用
2. 它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)
3. K8s被分解为多个组件,他们通过彼此的API进行通信
Kubelet:负责管控docker容器,如启动、停止、监控运行状态等,它会定期从etcd获取分配到本机的pod,并根据pod信息启动或者停止相应的容器。同时,它也会接收apiserver的Http请求,汇报pod的运行状态。
cAdvisor:负责资源监控
Kube-Proxy:负责为pod提供负载均衡,它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
Pods:能够创建、调度、和管理的最小部署单元,可包括多个容器,相互协作完成一个应用功能。
OMAgent:负责从kubelet的cAdvisor采集容器数据,并上报到运维系统的代理组件
Ican-agent:负责管理容器网络的代理组件,如:给pod分配容器IP,配置pod网络互通及策略等
API对象是K8s集群中的管理操作单元,每个API对象都有3大类属性:元数据metedata、规范spec和状态status。每个对象都至少有3个元数据:namespace,name和uid;
status描述了系统实际当前达到的状态(Status)
Pod
K8s有很多技术概念,同时对应很多API对象,最重要的也是最基础的是微服务Pod。Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。Pod对多容器的支持是K8s最基础的设计理念。比如你运行一个操作系统发行版的软件仓库,一个Nginx容器用来发布软件,另一个容器专门用来从源仓库做同步,这两个容器的镜像不太可能是一个团队开发的,但是他们一块儿工作才能提供一个微服务;这种情况下,不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。
Pod是K8s集群中所有业务类型的基础,可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8s中的业务主要可以分为长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);分别对应的小机器人控制器为Deployment、Job、DaemonSet和PetSet,本文后面会一一介绍。
复制控制器(Replication Controller,RC)
RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的Web服务。
副本集(Replica Set,RS)
RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
部署(Deployment)
部署表示用户对K8s集群的一次更新操作。部署是一个比RS应用模式更广的API对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;这样一个复合操作用一个RS是不太好描述的,所以用一个更通用的Deployment来描述。以K8s的发展方向,未来对所有长期伺服型的的业务的管理,都会通过Deployment来管理。
服务(Service)
RC、RS和Deployment只是保证了支撑服务的微服务Pod的数量,但是没有解决如何访问这些服务的问题。一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。要稳定地提供服务需要服务发现和负载均衡能力。服务发现完成的工作,是针对客户端访问的服务,找到对应的的后端服务实例。在K8s集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个;这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。与之相比,我们平时在服务器端做个反向代理做负载均衡,还要进一步解决反向代理的负载均衡和高可用问题。
任务(Job)
Job是K8s用来控制批处理型任务的API对象。批处理业务与长期伺服业务的主要区别是批处理业务的运行有头有尾,而长期伺服业务在用户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自动退出了。成功完成的标志根据不同的spec.completions策略而不同:单Pod型任务有一个Pod成功就标志完成;定数成功型任务保证有N个任务全部成功;工作队列型任务根据应用确认的全局成功而标志成功。
后台支撑服务集(DaemonSet)
长期伺服型和批处理型服务的核心在业务应用,可能有些节点运行多个同类业务的Pod,有些节点上又没有这类Pod运行;而后台支撑型服务的核心关注点在K8s集群中的节点(物理机或虚拟机),要保证每个节点上都有一个此类Pod运行。节点可能是所有集群节点也可能是通过nodeSelector选定的一些特定节点。典型的后台支撑型服务包括,存储,日志和监控等在每个节点上支持K8s集群运行的服务。
有状态服务集(PetSet)
K8s在1.3版本里发布了Alpha版的PetSet功能。在云原生应用的体系里,有下面两组近义词;第一组是无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable);第二组是有状态(stateful)、宠物(pet)、有名(having name)、不可丢弃(non-disposable)。RC和RS主要是控制提供无状态服务的,其所控制的Pod的名字是随机设置的,一个Pod出故障了就被丢弃掉,在另一个地方重启一个新的Pod,名字变了、名字和启动在哪儿都不重要,重要的只是Pod总数;而PetSet是用来控制有状态服务,PetSet中的每个Pod的名字都是事先确定的,不能更改。PetSet中Pod的名字的作用,并不是《千与千寻》的人性原因,而是关联与该Pod对应的状态。
对于RC和RS中的Pod,一般不挂载存储或者挂载共享存储,保存的是所有Pod共享的状态,Pod像牲畜一样没有分别(这似乎也确实意味着失去了人性特征);对于PetSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续以它的状态提供服务。
适合于PetSet的业务包括数据库服务MySQL和PostgreSQL,集群化管理服务Zookeeper、etcd等有状态服务。PetSet的另一种典型应用场景是作为一种比普通容器更稳定可靠的模拟虚拟机的机制。传统的虚拟机正是一种有状态的宠物,运维人员需要不断地维护它,容器刚开始流行时,我们用容器来模拟虚拟机使用,所有状态都保存在容器里,而这已被证明是非常不安全、不可靠的。使用PetSet,Pod仍然可以通过漂移到不同节点提供高可用,而存储也可以通过外挂的存储来提供高可靠性,PetSet做的只是将确定的Pod与确定的存储关联起来保证状态的连续性。PetSet还只在Alpha阶段,后面的设计如何演变,我们还要继续观察。
集群联邦(Federation)
K8s在1.3版本里发布了beta版的Federation功能。在云计算环境中,服务的作用距离范围从近到远一般可以有:同主机(Host,Node)、跨主机同可用区(Available Zone)、跨可用区同地区(Region)、跨地区同服务商(Cloud Service Provider)、跨云平台。K8s的设计定位是单一集群在同一个地域内,因为同一个地区的网络性能才能满足K8s的调度和计算存储连接要求。而联合集群服务就是为提供跨Region跨服务商K8s集群服务而设计的。
每个K8s Federation有自己的分布式存储、API Server和Controller Manager。用户可以通过Federation的API Server注册该Federation的成员K8s Cluster。当用户通过Federation的API Server创建、更改API对象时,Federation API Server会在自己所有注册的子K8s Cluster都创建一份对应的API对象。在提供业务请求服务时,K8s Federation会先在自己的各个子Cluster之间做负载均衡,而对于发送到某个具体K8s Cluster的业务请求,会依照这个K8s Cluster独立提供服务时一样的调度模式去做K8s Cluster内部的负载均衡。而Cluster之间的负载均衡是通过域名服务的负载均衡来实现的。
所有的设计都尽量不影响K8s Cluster现有的工作机制,这样对于每个子K8s集群来说,并不需要更外层的有一个K8s Federation,也就是意味着所有现有的K8s代码和机制不需要因为Federation功能有任何变化。
存储卷(Volume)
K8s集群中的存储卷跟Docker的存储卷有些类似,只不过Docker的存储卷作用范围为一个容器,而K8s的存储卷的生命周期和作用范围是一个Pod。每个Pod中声明的存储卷由Pod中的所有容器共享。K8s支持非常多的存储卷类型,特别的,支持多种公有云平台的存储,包括AWS,Google和Azure云;支持多种分布式存储包括GlusterFS和Ceph;也支持较容易使用的主机本地目录hostPath和NFS。K8s还支持使用Persistent Volume Claim即PVC这种逻辑存储,使用这种存储,使得存储的使用者可以忽略后台的实际存储技术(例如AWS,Google或GlusterFS和Ceph),而将有关存储实际技术的配置交给存储管理员通过Persistent Volume来配置。
持久存储卷(Persistent Volume,PV)和持久存储卷声明(Persistent Volume Claim,PVC)
PV和PVC使得K8s集群具备了存储的逻辑抽象能力,使得在配置Pod的逻辑里可以忽略对实际后台存储技术的配置,而把这项配置的工作交给PV的配置者,即集群的管理者。存储的PV和PVC的这种关系,跟计算的Node和Pod的关系是非常类似的;PV和Node是资源的提供者,根据集群的基础设施变化而变化,由K8s集群管理员配置;而PVC和Pod是资源的使用者,根据业务服务的需求变化而变化,有K8s集群的使用者即服务的管理员来配置。
节点(Node)
K8s集群中的计算能力由Node提供,最初Node称为服务节点Minion,后来改名为Node。K8s集群中的Node也就等同于Mesos集群中的Slave节点,是所有Pod运行所在的工作主机,可以是物理机也可以是虚拟机。不论是物理机还是虚拟机,工作主机的统一特征是上面要运行kubelet管理节点上运行的容器。
密钥对象(Secret)
Secret是用来保存和传递密码、密钥、认证凭证这些敏感信息的对象。使用Secret的好处是可以避免把敏感信息明文写在配置文件里。在K8s集群中配置和使用服务不可避免的要用到各种敏感信息实现登录、认证等功能,例如访问AWS存储的用户名密码。为了避免将类似的敏感信息明文写在所有需要使用的配置文件中,可以将这些信息存入一个Secret对象,而在配置文件中通过Secret对象引用这些敏感信息。这种方式的好处包括:意图明确,避免重复,减少暴漏机会。
用户帐户(User Account)和服务帐户(Service Account)
顾名思义,用户帐户为人提供账户标识,而服务账户为计算机进程和K8s集群中运行的Pod提供账户标识。用户帐户和服务帐户的一个区别是作用范围;用户帐户对应的是人的身份,人的身份与服务的namespace无关,所以用户账户是跨namespace的;而服务帐户对应的是一个运行中程序的身份,与特定namespace是相关的。
名字空间(Namespace)
名字空间为K8s集群提供虚拟的隔离作用,K8s集群初始有两个名字空间,分别是默认名字空间default和系统名字空间kube-system,除此以外,管理员可以可以创建新的名字空间满足需要。
RBAC访问授权
K8s在1.3版本中发布了alpha版的基于角色的访问控制(Role-based Access Control,RBAC)的授权模式。相对于基于属性的访问控制(Attribute-based Access Control,ABAC),RBAC主要是引入了角色(Role)和角色绑定(RoleBinding)的抽象概念。在ABAC中,K8s集群中的访问策略只能跟用户直接关联;而在RBAC中,访问策略可以跟某个角色关联,具体的用户在跟一个或多个角色相关联。显然,RBAC像其他新功能一样,每次引入新功能,都会引入新的API对象,从而引入新的概念抽象,而这一新的概念抽象一定会使集群服务管理和使用更容易扩展和重用。
K8s常用基础命令:
1. Kubectl create
通过配置文件名或stdin创建一个集群资源对象,支持JSON和YAML格式的文件
Kubectl create –f service-ms.yaml
Cat service-ms.yaml|kubectl create –f –
2. Kubectl get
获取列出一个或者多个资源的信息
Kubectl get pod web-pod-13je7 –o json 以json展示pod信息
Kubectl get pods –o wide 列出pod以及运行Pod节点信息
Kubectl get –f pod.yaml –o json 将pod.yaml以json显示
使用默认编辑器编辑服务器上定义的资源。文件输出为yaml,要以JSON格式编辑,请指“-o json”
3. Kubectl edit
Kubectl –nmanage edit svc/message-service 编辑svc为message-service服务。
4. Kubectl delete
通过配置文件名、stdin、资源名称或label选择器来删除资源
Kubectl delete –f ./pod.json 使用pod.json
5. kubectl describe
kubectl describe pods/nginx
kubectl describe –f pod.json 描述pod.json中的资源类型和名称指定的pod
6. kubectl logs
7. kubectl exec
8. kubectl cp 向容器中copy文件或者文件夹
9. kubectl patch 使用(patch)补丁修改、更新资源的手段。支持Json和YAML格式。