docker集群——K8s简介

Kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本,主要功能包括:node

  • 基本容器的应用部署、维护和滚动升级;
  • 负载均衡和服务发现;
  • 跨机器和跨地区的集群调度;
  • 自动伸缩;
  • 无状态服务和有状态服务;
  • 普遍的Volume支持;
  • 插件机制保证扩展性。

Kubernetes 提供了不少的功能,它能够简化应用程序的工做流,加快开发速度。一般,一个成功的应用编排系统须要有较强的自动化能力,这也是为何 Kubernetes 被设计做为构建组件和工具的生态系统平台,以便更轻松地部署、扩展和管理应用程序。python

用户可使用Label以本身的方式组织管理资源,还可使用Annotation来自定义资源的描述信息,好比为管理工具提供状态检查等。nginx

此外,Kubernetes控制器也是构建在跟开发人员和用户使用的相同的API之上。用户还能够编写本身的控制器和调度器,也能够经过各类插件机制扩展系统的功能。docker

这种设计使得能够方便地在Kubernetes之上构建各类应用系统。json

主要的组件包括:

  • etcd保存整个集群的状态;
  • apiserver提供了资源操做的惟一入口,并提供认证受权、访问控制、API注册和发现等机制;
  • controller manager负责维护集群的状态,好比故障检测、自动扩展、滚动更新等;
  • scheduler负责资源的调度,按照预约的调度策略将pod调度到相应的机器上;
  • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  • Container runtime负责镜像管理以及pod和容器的真正运行(CRI);
  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡。

 

Container

Container(容器)是一种便捷式、轻量级的操做系统级虚拟化技术。它使用namespace隔离不一样的软件运行环境,并经过镜像自包含软件的运行环境,从而使得容器能够很方便的在任何地方运行。后端

因为容器体积小且启动快,所以能够在每一个容器镜像中打包一个应用程序。这种一对一的应用镜像关系拥有不少好处。使用容器,不须要与外部的基础架构环境绑定,由于每个应用程序都不须要外部依赖,更不须要与外部的基础架构环境依赖。完美解决了从开发到生产环境的一致性问题。api

容器同比虚拟机更加透明,这有助于监测和管理。尤为是容器进程的生命周期由基础设施管理,而不是由容器内的进程对外隐藏时更是如此。最后,每一个应用程序用容器封装,管理容器部署就等同于管理应用程序部署。网络

在Kubernets必须使用pod管理容器,每一个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

Node 是Pod真正运行的主机,能够物理机,也能够是虚拟机。为了管理Pod,每一个Node节点上至少要运行container runtime(好比docker或者rkt)、kubelet和kube-proxy服务。

Namespace

Namespace是对一组资源和对象的抽象集合,好比能够用来将系统内部的对象划分为不一样的项目组或用户组。常见的pods,services,replication controllers和deployments等都是属于某一个namespace(默认是default),而node,persistentVolumes等则不属于任何namespace。

Service

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

Label是识别Kubernetes对象的标签,以key/value的方式附加到对象上(key最长不能超过63字节,value能够为空,也能够是不超过253字节的字符串)。

Label不提供惟一性,而且实际上常常是不少对象(如Pods)都使用相同的label来标志具体的应用。

Label定义好后其余对象可使用Label Selector来选择一组相同的label的对象(好比ReplicaSet和Service用label来选择一组Pod)。Label Selector支持如下几种方式:

  • 等式,如app=ngingx 和 env!=production
  • 集合,如env in(production, qa)
  • 多个label(它们之间AND关系),如app=nginx, env=test

Annotations

Annotations是key/value形式附加于对象的注解。不一样于labels用于标志和选择对象,Annotations则是用来记录一些附加信息,用来辅助应用部署、安装策略以及调度策略等。好比deployment使用annotations来记录rolling update的状态。

相关文章
相关标签/搜索