Kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本,主要功能包括:node
Kubernetes 提供了不少的功能,它能够简化应用程序的工做流,加快开发速度。一般,一个成功的应用编排系统须要有较强的自动化能力,这也是为何 Kubernetes 被设计做为构建组件和工具的生态系统平台,以便更轻松地部署、扩展和管理应用程序。python
用户可使用Label以本身的方式组织管理资源,还可使用Annotation来自定义资源的描述信息,好比为管理工具提供状态检查等。nginx
此外,Kubernetes控制器也是构建在跟开发人员和用户使用的相同的API之上。用户还能够编写本身的控制器和调度器,也能够经过各类插件机制扩展系统的功能。docker
这种设计使得能够方便地在Kubernetes之上构建各类应用系统。json
Container(容器)是一种便捷式、轻量级的操做系统级虚拟化技术。它使用namespace隔离不一样的软件运行环境,并经过镜像自包含软件的运行环境,从而使得容器能够很方便的在任何地方运行。后端
因为容器体积小且启动快,所以能够在每一个容器镜像中打包一个应用程序。这种一对一的应用镜像关系拥有不少好处。使用容器,不须要与外部的基础架构环境绑定,由于每个应用程序都不须要外部依赖,更不须要与外部的基础架构环境依赖。完美解决了从开发到生产环境的一致性问题。api
容器同比虚拟机更加透明,这有助于监测和管理。尤为是容器进程的生命周期由基础设施管理,而不是由容器内的进程对外隐藏时更是如此。最后,每一个应用程序用容器封装,管理容器部署就等同于管理应用程序部署。网络
在Kubernets必须使用pod管理容器,每一个pod能够包含一个或多个容器。架构
Pod是一组紧密关联的容器集合,它们共享PID、IPC、Network和UTS namspace,是kubernets调度的基础单位。Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,能够经过进程间通讯和文件共享这种简单高效的方式组合完成服务。app
在Kubernets中,全部对象都是使用manifest(yaml或json)来定义,好比一个简单的nginx服务能够定义为nginx.yaml,它包含一个镜像为nginx的容器:
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
Node 是Pod真正运行的主机,能够物理机,也能够是虚拟机。为了管理Pod,每一个Node节点上至少要运行container runtime(好比docker或者rkt)、kubelet和kube-proxy服务。
Namespace是对一组资源和对象的抽象集合,好比能够用来将系统内部的对象划分为不一样的项目组或用户组。常见的pods,services,replication controllers和deployments等都是属于某一个namespace(默认是default),而node,persistentVolumes等则不属于任何namespace。
Service是应用服务的抽象,经过labels为应用提供负载均衡和服务发现。匹配labels的Pod IP和端口列表组成endpoints,由kube-proxy负载将服务IP负载均衡到这些endpoints上。
每一个Service都会自动分配一个cluster IP(仅在集群内部能够访问的虚拟地址)和DNS名,其余容器能够经过该地址或DNS来访问服务,而不须要了解后端容器的运行。
apiVersion: v1 kind: Service metadata: name: nginx spec: ports: - port: 8078 # the port that this service should serve on name: http # the container on each pod to connect to, can be a name # (e.g. 'www') or a number (e.g. 80) targetPort: 80 protocol: TCP selector: app: nginx
Label是识别Kubernetes对象的标签,以key/value的方式附加到对象上(key最长不能超过63字节,value能够为空,也能够是不超过253字节的字符串)。
Label不提供惟一性,而且实际上常常是不少对象(如Pods)都使用相同的label来标志具体的应用。
Label定义好后其余对象可使用Label Selector来选择一组相同的label的对象(好比ReplicaSet和Service用label来选择一组Pod)。Label Selector支持如下几种方式:
Annotations是key/value形式附加于对象的注解。不一样于labels用于标志和选择对象,Annotations则是用来记录一些附加信息,用来辅助应用部署、安装策略以及调度策略等。好比deployment使用annotations来记录rolling update的状态。