一、Kubernetes概述
1、背景
kubernetes(简称k8s)是google基于Blog进行改进后,开源出来的一款“容器管理应用”。由于近几年来容器技术的火爆,许许多多的服务都不会直接部署在linux主机或各大云厂商的虚拟机上;利用Docker,将每个服务做成一个image,把他们跑在各自的Container中。
这样做的好处有非常多,比如环境配置隔离、服务启动快、移植便捷等等。但是使用的Container多到一定程度,就会带来容器管理上的问题:使用docker ps命令之后有一大堆Container,如果标识的不清楚也很容易混淆;某些分布式服务,需要将Docker部署到许多不同的机器上,这也会增加我们运维的难度。因此,我们现在需要一款“专门管理容器”的平台,为我们提供可视化界面,方便我们对各个容器进行管理。
k8s就是这样一款辅助我们管理容器的平台,支持管理在分布式环境(即多台服务器上)启动的 Container。
2、基础概念
2.1、Master
Cluster的大脑,主要职责是调度,可以运行多个master来保证高可用。
2.2、Node
职责是运行容器应用,Node由Master管理,负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。 ·
2.3、Pod
1)Pod是K8s的最小工作单元,每个Pod包含一个或多个容器。
- ·有些容器天生就是需要紧密联系,一起工作。Pod提供了比容器更高层次的抽象,K8s以Pod为最小单位进行调度、扩展、共享资源、管理生命周期。
- ·Pod中的所有容器使用同一个网络的namespace,即相同的IP地址和Port空间。它们可以直接用localhost通信。同样的,这些容器可以共享存储,当K8s挂载Volume到Pod上,本质上是将volume挂载到Pod中的每一个容器。
2)Pod 控制器
K8s通常不直接创建Pod,而是通过Controller来管理Pod。Controller中定义了pod的部署属性,比如几个副本、在什么样的Node上运行等。
K8s提供了多种Controller,包括Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等。
- ·ReplicationController:副本控制器,确保Pod的数量始终保持设定的个数。也支持Pod的滚动更新。
- ·ReplicaSet:副本集,它不直接使用,有一个声明式更新的控制器叫Deployment来负责管理。但是Deployment只能负责管理那些无状态的应用。
- ·StatefulSet:有状态副本集,负责管理有状态的应用。
- ·DaemonSet,如果需要在每一个Node上只运行一个副本,而不是随意运行,就需要DaemonSet。
- ·Job:运行作业,对于时间不固定的操作,比如某个应用生成了一大堆数据集,现在需要临时启动一个Pod去清理这些数据集,清理完成后, 这个Pod就可以结束了。 这些不需要一直处于运行状态的应用,就用Job这个类型的控制器去控制。如果Pod运行过程中意外中止了,Job负责重启Pod。如果Pod任务执行完了,就不需要再启动了。
- ·Cronjob:周期性作业。
2.4、Service
Deployement可以部署多个副本,每个Pod都有自己的副IP,外界如何访问这些副本。Pod会被频繁的销毁和重启,IP实时变化,不能用IP, 答案是通过service。K8s service定义了外界访问一组特定Pod的方式。service有自己的IP和端口,service为Pod提供了负载均衡。
2.5、Namespace:
Namespace将物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个Namespace。不同的Namespace里的资源是完全隔离的。
- ·default:默认的namespace
- ·kube-system: K8s自己创建的的系统资源放到这个namespace
2.6、Cluster
Cluster 是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用。
2.7、Node
工作节点,职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,并根据Master的要求管理容器的生命周期。Node运行在Linux操作系统,可以是物理机或者是虚拟机。
3、K8S的架构
Kubernetes集群包含有节点代理Kubelet和Master组件(APIs、scheduler、etc),下面是K8S的架构图。
Master节点包含API Server、Scheduler调度器、ControllerManager控制器管理器这三个核心的组件。
Node节点包含的核心组件有Kubelet、Docker容器引擎、Kube-proxy
3.1、API Server(kube-apiserver)
提供了HTTP/HTTPS RESTful API,即Kubernetes API。 API server是Kubernetes Cluster的前端接口。其他客户端工具(CLI或UI)以及K8S其它组件可以通过它管理Cluster资源。
3.2、Scheduler(kube-scheduler)
调度器,它负责决定将Pod放在哪个Node上运行。调度时候考虑Cluster拓扑,各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
3.3、Controller-Manager
负责监控每一个Controller(控制器)的健