Kubernetes是什么:针对容器编排的一种分布式架构,是自动化容器操做的开源平台。node
服务发现、内建负载均衡、强大的故障发现和自我修复机制、服务滚动升级和在线扩容缩容、资源自动调度机制、多粒度的资源配额管理能力,包括开发、测试、部署、运维监控,一站式的完备的分布式系统开发和支撑平台.python
(1) Master 控制节点 apache
1.Api Server:为集群的核心组件,主要负责集群各功能模块之间的通讯,集群内的功能模块经过Api server将信息存入到分布式文件系统etcd中与其余节点进行信息交互。 2.Scheduler:负责集群的资源调度,跟踪集群中全部Node的资源利用状况,对新建立的pod,采起合适的调度策略,进行均衡的调度到合适的节点上。 3.Controller Manager:主要负责集群的故障检测和恢复的自动化,它内部的组件以下: a.endpointController:按期关联service和pod,关联信息由endpoint负责建立和更新。 b.ReplicationController:完成pod的复制或移除,以确保ReplicationController定义的复本数量与实际运行pod的数量一致性
(2) Node 节点api
集群中的工做主机,Node能够是物理主机,也能够是虚拟机,包含如下组件: 1.kubelet:运行在每一个Node节点上,kubelet会经过api service 注册节点自身信息,用于master发现节点,它会按期从etcd获取分配到本机的pod,并根据pod信息启动或中止相应的容器,并按期向master节点汇报节点资源的使用状况,内部集成cadvise来监控容器和节点资源。 2.Kube Proxy:负责为pod提供代理。它会按期从etcd获取全部的service,并根据service信息建立代理。当某个客户pod要访问其余pod时,访问请求会通过本机proxy作转发。
(1) pod概念tomcat
Pod是一个逻辑概念,它是Kubernetes资源调度的单元,通常会把一组功能强相关的容器逻辑上称之为一个pod,Pod就是所说的实例。做为一个逻辑概念,pod自己没有资源,pod中的容器具备资源,建立pod,能够经过定义pod模块。
[pod状态]bash
Pending 容器还没有启动成功,它包括从pod被建立到调度、而后到拉镜像开始部署这个过程 Running 容器启动成功 Succeeded 容器退出,返回码是0,而且容器不会再被从新启动 Failed 容器异常退出 Unknown 状态未知,获取不到容器的状态,当出现异常时会有这种状态,例如pod所在的机器故障,或者pod所在的机器上
{ "kind": "Pod",(资源类型) "apiVersion": "v1", (资源版本) "metadata": { "name": "app-tomcat", (名字,惟一) "namespace": "default", (命名空间默认default) "labels": { "name": "app-tomcat" (label作为标识,能够跟RC,Service关联对应) } }, "spec": { "containers": [ { "name": "app-tomcat", (自定义镜像名称) "image": "tomcat", (要拉取的镜像) "command": [ (运行容器时,要运行的命令) "/bin/bash", "/opt/apache-tomcat-7.0.57/bin/catalina.sh", "run" ], "env": [ (环境变量K,V) { "name": "url_addr", "value": "http://192.168.54.66:8080/paas/jsp/index.jsp" } ], "resources": { (对容器资源限制) "limits": { "cpu": "1", "memory": "1073741824" }, "requests": { "cpu": "100m", "memory": "104857600" } }, "imagePullPolicy": "Always" (获取镜像策略Always,Never,IfNotPresent) } ], "restartPolicy": "Always", (pod重启策略,Always,OnFailure,Never) "dnsPolicy": "ClusterFirst", "nodeSelector": { (选择将该pod调度到包含这些label的Node上) "group": "node1" } } }
(2) ReplicationControllersession
ReplicationController(简称rc)是pod的复制抽象,用于解决pod的扩容缩容问题。一般,分布式应用为了性能或高可用性的考虑,须要复制多份资源,而且根据负载状况动态伸缩。
经过replicationController,咱们能够指定一个应用须要几份复制,Kubernetes将为每份复制建立一个pod,而且保证明际运行pod数量老是与该复制数量相等(例如,当前某个pod宕机时,自动建立新的pod来替换)。
RC中selector设置一个label,去关联pod的label,selector的label与pod的label相同,那么该pod就是该rc的一个实例;RC中Replicas设置副本数大小,系统根据该值维护pod的副本数
{ "kind": "ReplicationController", "apiVersion": "v1", "metadata": { "name": "app-tomcat", "namespace": "default", "labels": { "name": "app-tomcat" } }, "spec": { "replicas": 2(副本数), "selector": { "name": "app-tomcat(选择的pod的label)" }, "template": { "metadata": { "labels": { "name": "app-tomcat(pod的label)" } }, "spec": { "containers": [ { "name": "kaifa2-group-tomcat", "image": "192.168.54.64:5000/tomcat-248:V1.0", "command": [ "/bin/bash", "/opt/apache-tomcat-7.0.57/bin/catalina.sh", "run" ], "env": [ { "name": "url_addr", "value": "http://192.168.54.64:8080/paas/jsp/index.jsp" } ], "resources": { "limits": { "cpu": "1", "memory": "1073741824" }, "requests": { "cpu": "100m", "memory": "104857600" } }, "imagePullPolicy": "Always" } ], "restartPolicy": "Always", "nodeSelector": { "group": "node1" } } } } }
(3) Service架构
service是pod的路由代理抽象,用于解决pod之间的服务发现问题,即上下游pod之间使用的问题。传统部署方式中,实例所在的主机ip(或者dns名字)通常是不会改变的,可是pod的运行状态可动态变化(好比容器重启、切换机器了、缩容过程当中被终止了等),
因此访问端不能以写死IP的方式去访问该pod提供的服务。service的引入旨在保证pod的动态变化对访问端透明,访问端只须要知道service的地址,由service来提供代理。
{ "kind": "Service", "apiVersion": "v1", "metadata": { "name": "tomcat-yefp", "namespace": "default", "labels": { "name": "tomcat-yefp" } }, "spec": { "ports": [ { "protocol": "TCP", "port": 8080(访问端口), "targetPort": 8080 } ], "selector": { "name": "app-tomcat(选择的pod的label)" }, "type": "ClusterIP", "sessionAffinity": "None" } }
(4) EndPoint
app
Endpoint是可被访问的服务端点,即一个状态为running的pod,它是service访问的落点,只有service关联的pod才可能成为endpoint。 Endpoint、service和pod的关系: