kubernetes是基于容器技术的分布式架构领先方案,是一个完备的分布式系统支撑平台。php
kubernetes带来的好处:1)全面拥抱微服务;2)统能够随时随地总体“搬迁”到公有云上;3)Kubernetes系统架构具有了超强的横向扩容能力。node
在Kubernetes中,Node、Pod、Replication Controller、Service等概念均可以看做一种资源对象,经过Kubernetes提供的Kubectl工具或者API调用进行操做,并保存在etcd中。git
master上运行etcd server,API server,controller Manager,scheduler等进程,每一个kubernetes集群须要有一个master节点来负责整个集群的管理和控制。redis
node做为工做负载节点,运行如下一组关键进程。算法
kubelet:负责pod对应的容器建立,启停等任务,同时与master节点密切协做,实现集群管理的基本功能。docker
kube-proxy:实现kubernetes Service的通讯与负载均衡机制的重要组件。apache
Docker Engine:Docker引擎,负责本机的容器建立和管理工做。api
查看集群中多少个node:kubectl get nodestomcat
查看某个Node的详细信息:kubectl describe node <node_name>网络
Pod是Kubernetes的最基本操做单元,包含一个活多个紧密相关的容器,相似于豌豆荚的概念。一个Pod能够被一个容器化的环境看做应用层的“逻辑宿主机”(Logical Host)。一个Pod中的多个容器应用一般是紧耦合的。Pod在Node上被建立、启动或者销毁。
apiVersion: v1 kind: Pod metadata: name: redis-slave labels: name: redis-slave spec: containers: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379 resources: requests: 该资源的最小申请量,系统必须知足要求 memory:"64Mi" cpu:"250m" limits: 资源最大容许使用量,超过将重启 memory:"128Mi" cpu:"500m"
Label以key/value键值对的形式附加到各类对象上,如Pod、Service、RC、Node等。Label定义了这些对象的可识别属性,用来对它们进行管理和选择。Label能够在建立时附加到对象上,也能够在对象建立后经过API进行管理。
基于等式的Label Selector使用等式类的表达式来进行选择:
基于集合的Label Selector使用集合操做的表达式来进行选择:
将多个Label Selector进行组合
name=redis-slave,env!=production
name not in (php-frontend),env!=production
总结:使用label能够给对象建立多组标签,Lable和label Selector共同构成了Kubernetes系统中最核心的应用模型,使得被管理对象可以被精细的分组管理,同时实现了整个集群的高可用性。
RC定义了一个指望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,因此RC的定义包括以下几个部分:
1)pod期待的副本数
2)用于刷选目标Pod的label Selector
3)当pod的副本数量小于预期数量的时候,用于建立新pod的pod模板。
apiVersion: v1 kind: ReplicationController metadata: name: redis-slave labels: redis-slave name: redis-slave spec: replicas: 2 selector: name: redis-slave 标签name=redis-slave的pod存在2个副本 template: metadata: labels: name: redis-slave spec: container: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379
deployment在内部使用Replica Set来实现目的,不管从Deployment的做用与目的,它的YAM定义,仍是从它的具体命令行操做来看,咱们均可以把它看作RC的一次升级。
HPA(pod横向自动扩容)
经过追踪分析RC控制的全部目标pod的负载变化状况,来肯定是否须要针对性的调整目标pod的副本数,这是HPA的实现原理。
下面是HPA定义的案例:
apiVersion:autoscaling/v1 kind:HorizontalPodAutoscaler metadata: name:php-apache namespace:default spec: maxReplicas:10 minReplicas:1 scaleTargetRef: kind:Deployment name:php-apache targetCPUUtilizationPercentage:90 #根据上面的定义,咱们知道这个HPA控制的目标对象为Deployment里一个名叫php-apache的Pod副本,这个副本的CPUUtilizationPercentage值超过90%就会触发自动扩容行为,伸缩的副本数介于1-10之间。 #经过kubectl create建立HPA资源对象 或者 kubectl autoscale deployment php-apache --cpu-percent=90 --min=1 --max=10
一个Service能够看做一组提供相同服务的Pod的对外访问接口。Service做用于哪些Pod是经过Label Selector来定义的。
Pod的IP地址是Docker Daemon根据docker0网桥的IP地址段进行分配的,但Service的Cluster IP地址是Kubernetes系统中的虚拟IP地址,由系统动态分配。Service的Cluster IP地址相对于Pod的IP地址来讲相对稳定,Service被建立时即被分配一个IP地址,在销毁该Service以前,这个IP地址都不会再变化了。而Pod在Kubernetes集群中生命周期较短,可能被ReplicationContrller销毁、再次建立,新建立的Pod将会分配一个新的IP地址。
部署一个负载均衡器,为这组pod开启一个对外服务端口如8000端口,而且将pod的endpoint列表加入8000端口的转发列表中,客户端就能够经过负载均衡器的对外IP地址+服务端口来访问此服务,而客户端的请求最后会被转发到哪一个pod,则由负载均衡器算法决定。
外部访问service
Node IP:Node节点的IP地址 Pod IP:Pod的IP地址 Cluster IP:Service的IP地址
Kubernetes支持两种对外提供服务的Service的type定义:NodePort和LoadBalancer。
apiVersion: v1 kind: Service metadata: name: frontend labels: name: frontend spec: type: NodePort * ports: - port: 80 nodePort: 30001 * selector: name: frontend
若是云服务商支持外接负载均衡器,则能够经过spec.type=LoadBalaner定义Service,同时须要制定负载均衡器的IP地址。使用这种类型须要指定Service的nodePort和clusterIP。例如:
apiVersion: v1 kind: Service metadata: { "kind" "Service", "apiVersion": "v1", "metadata": { "name": "my-service" }, "spec": { "type": "LoadBalaner", "clusterIP": "10.0.171.239", "selector": { "app": "MyApp" }, "ports": [ { "protocol": "TCP", "port": 80, "targetPort": 9376, "nodePort": 30061 } ], }, "status": { "loadBalancer": { "ingress": [ { "ip": "146.148.47.155" } ] } } }
Volume是Pod中可以被多个容器访问的共享目录。当容器终止或者重启时,Volume中的数据也不会丢失。另外,Kubernetes支持多种类型的Volume,而且一个Pod能够同时使用任意多个Volume。Kubernetes提供了很是丰富的Volume类型,下面逐一进行说明。
#举例来讲,咱们要给以前的tomcat pod增长一个名字为dataVol的volume,而且Mount到容器的/mydata-data目录,则只要对pod的定义文件作以下修改: template: metadata: labels: app:app-demo tier:frontend spec: volumes: -name:datavol emptyDir:{} containers: -name:tomcat-demo image:tomcat volumeMount: - mountPath:/mydata-data name:datavol
使用宿主主机的/data目录定义hostPath类型的volume: volumes: -name:"persistent-storage" hostPah: path:"/data"
Namespace(命名空间)是Kubernetes系统中的另外一个很是重要的概念,经过将系统内部的对象“分配”到不一样的Namespace中,造成逻辑上分组的不一样项目、小组或用户组,便于不一样的分组在共享使用整个集群的资源的同时还能被分别管理。
Kubernetes集群在启动后,会建立一个名为“default”的Namespace,经过Kubectl能够查看到。
使用Namespace来组织Kubernetes的各类对象,能够实现对用户的分组,即“多租户”管理。对不一样的租户还能够进行单独的资源配额设置和管理,使得整个集群的资源配置很是灵活、方便。
kubectl get namespaces --查看命名空间 在yaml中定义名为development的namespace: apiVersion:v1 kind:Namespace metadata: name:development 将一个名为busybox的pod放入到development命名空间中: apiVersion:v1 kind:Pod metadata: name:busybox namespace:development spec: containers: .............. ............ 在对应的命名空间中查找pod: kubectl get pods --namespace=development
Annotation与Label相似,也使用key/value键值对的形式进行定义。Label具备严格的命名规则,它定义的是Kubernetes对象的元数据(Metadata),而且用于Label Selector。Annotation则是用户任意定义的“附加”信息,以便于外部工具进行查找。
用Annotation来记录的信息包括:
Kubernetes集群由两类节点组成:Master和Node。在Master上运行etcd、API Server、Controller Manager和Scheduler四个组件,其中后三个组件构成了Kubernetes的总控中心,负责对集群中全部资源进行管理和调度。在每一个Node上运行Kubelet、Proxy和Docker Daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能。另外在全部节点上均可以运行Kubectl命令行工具,它提供了Kubernetes的集群管理工具集。