k8s
Kubernetes(有时也称为 K8s)是一个广受欢迎的开源平台,可以跨越网络资源集群来编排容器运行时系统。不论有无 Docker,均可使用 Kubernetes。
Kubernetes 最初由 Google 开发,该公司需要一种全新方式来每周大规模运行数十亿个容器。2014 年,Kubernetes 由 Google 以开源形式发布,现被广泛认为是容器和分布式应用部署领域的市场领导者和行业标准编排工具。Google 表示,Kubernetes 的“主要设计目标是简化复杂分布式系统的部署与管理,同时仍然受益于容器带来的更高利用率。”
Kubernetes 将一系列容器捆绑成一组,并在同一台机器上进行管理,以减少网络开销并提高资源使用效率。例如,应用服务器、Redis 缓存和 SQL 数据库便是此此类容器集。Docker 容器的特点是每个容器一个进程。
有了容器为何需要k8s
Docker 提供容器的生命周期管理和,Docker 镜像构建运行时容器。它的主要优点是将将软件/应用程序运行所需的设置和依赖项打包到一个容器中,从而实现了可移植性等优点。
Kubernetes 用于关联和编排在多个主机上运行的容器。
尽管Docker为容器化的应用程序提供了开放标准,但随着容器越来越多出现了一系列新问题:
- 如何协调和调度这些容器?
- 如何在升级应用程序时不会中断服务?
- 如何监视应用程序的运行状况?
- 如何批量重新启动容器里的程序?
解决这些问题需要容器编排技术,可以将众多机器抽象,对外呈现出一台超大机器。现在业界比较流行的有:k8s、Mesos、Docker Swarm。
在业务发展初期只有几个微服务,这时用 Docker 就足够了,但随着业务规模逐渐扩大,容器越来越多,运维人员的工作越来越复杂,这个时候就需要编排系统解救opers。

k8s架构
K8s总体来说是主从架构模式Master - Slave架构,master节点负责调度、管理,slave节点负责具体程序的运行和节点服务,在K8s里面,主节点一般叫做master node,从节点叫做worker node。所有的主节点和从节点一起组成了K8s集群,在集群里面master和slave都可以是多个,是一个多主多从的集群架构。
2.1 K8s Master Node核心组件
- API Server:作用是K8s的请求入口提供能力,API Server组件负责接收K8s所有的命令请求,不管是UI控制台还是命令行都会经过API Server组件,API Server负责接收具体的命令请求,去通知其它组件工作。
- Scheduler:是K8s调度所有worker节点的调度组件,当K8s需要部署服务时,通过Scheduler调度组件来负责调度具体的Worker Node节点来进行服务的部署工作。
- Controller Manager:监控K8s所有的Worker Node,对工作节点的性能和工作状态监控,例如某个节点的服务挂了以后,Controller Manager组件就会立马感知到,然后通知Scheduler组件去调度选择Worker Node来重新部署服务。Controller Manager是由多个Controller组成:
Node Controller、Service Controller、Volume Controller等 - etcd:K8s默认的数据信息存储服务,是一个基于Raft算法的分布式KV服务器,类似于ZK功能。etcd存储了K8s的关心配置和用户配置数据。
2.2 K8s Worker Node核心组件
- Kubelet:工作节点的监视器,并且负责和Master Node进行通信,定时的向Master Node上报工作节点的服务状态,并且负责接收Master Node发来的各种命令。
- Kube Proxy:工作节点的网络代理组件,负责基础通信能力。
- Container Runtime:工作节点的运行时环境。
3.K8s核心概念
3.1 Deployment
Deployment负责创建和更新应用程序的实例,创建Deployment后,K8s的Master节点会将应用程序实例调度到集群中各个Worker节点上。Pod是K8s最小的编排单位,K8s要支持弹性扩容、负载均衡就得需要一个Controller来管理,Deployment就是来控制和编排应用程序。 在Deployment的配置文件里面可以指定需要部署的Pod标签、Pod个数等。
3.2 Pod
Pod是K8s编排容器的最小逻辑单元,Pod也相当于是一个逻辑主机的概念负责管理具体的应用实例,包括1个或多个Docker容器,一般是一对一关系。 Pod同样也有yaml配置文件,在配置文件里面可以配置暴露的端口、服务标签、镜像信息等。
3.3 Service
Service是K8s里面的一个抽象的概念,Service是一组Pod的逻辑集合,给这些Pod提供服务发现、负载的能力。 虽然每一个Pod都有自己的IP和端口,但是Pod的IP并不会暴露给外部;访问Pod必须通过Service,Service提供流量的接收。Service可以通过配置Type来对外暴露访问入口,默认是ClusterIP模式(在几群的内部IP上公开Servcie),除了这个默认模式外,还提供NodePort、LoadBalancer等。 Service同样提供了yaml文件配置,可以配置例如暴露端口、Pod的选择等。