Kubernetes简介
应用部署演变
传统方式部署
早期互联网时代部署应用直接部署在服务器上
- 优点:部署简单,直接部署即可无第三方技术
- 缺点:所有应用都部署在同一服务器上应用解藕度低,同时容易产生资源竞争
虚拟化部署
在物理机器上开辟新的虚拟机,在新虚拟机上安装操作系统在部署应用
- 优点:每个程序运行在自己的虚拟机里降低程序的耦合度,同时每个虚拟机含有自己的运行资源,不会产生资源竞争
- 缺点:在物理机器上开辟虚拟机浪费物理机资源,同时由于应用部署在虚拟机里造成启动速度较慢
容器部署
将应用部署在容器之中,容器共享物理操作系统,用来对外提供服务
- 优点:
- 每个容器在操作系统层面进行隔离耦合度低
- 容器之间可以包含自己独立的运行资源
- 容器可以打包跨平台运行
- 容器部署方便,一次打包使用,多个平台终身运行
- 缺点:
- 容器单个部署方便,但是部署集群对外提供服务困难
- 容器很难做到横向扩展
容器编排
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
- 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
- 当并发访问量变大的时候,怎么样做到横向扩展容器数量
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:
- Swarm:Docker自己的容器编排工具
- Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
- Kubernetes:Google开源的的容器编排工具
Kubernetes简介
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:某个容器出现故障,在一秒内开辟新的容器进行替换
- 弹性伸缩:可以根据需要自动对所需容器的数量进行调整
- 服务发现:服务可以自动查找自己所需要的依赖服务
- 负载均衡:如果一个服务启动多个容器可以自动在多个容器进行负载均衡
- 版本回退:如果新发布的版本有问题可以自动切换原始版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
Kubernetes组件
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
master
Kubernetes集群的控制节点,主要对集群进行管理控制
- APIServer:资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
- Scheduler:负责对集群进行资源管理调度,按照预定的算法策略将
container
节点分配到相对应的pod
节点上 - ControllerManager:负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
- Etcd:负责存储集群中各种资源信息
node
Kubernetes工作节点负责数据转发为容器提供运行环境
- kubelet:负责维护容器的生命周期,通过控制
docker
来对容器进行创建,删除等 - kube-proxy:负责集群内部对外提供服务以及负载均衡等
- docker:负责对内部容器进行操作
图解
案例讲解
下面以运行 MySQL
服务进行讲解各个组件之间的调用关系
- 当我们启动
kubernetes
之后,master
与node
节点信息都会存储在Etcd
中 - 上述
kubernets
通过APIServer
接收管理员发布MySQL
指令的消息 - 当
APIServer
收到管理员发布的指令其会调度Scheduler
组件来决定将MySQL
服务安装到那个节点之上, Scheduler
组件会通过Etcd
查询节点信息然后通过一定的算法确定将MySQL
服务安装到具体节点,例如安装到node1
并将节点信息告诉APIServer
APIServer
通知Controller manager
节点MySQL
服务安装到node1
节点中kubelet
接收Controller manager
发送安装MySQL
指令之后通知docker
创建MySQL
服务docker
创建MySQL
的pod
之后MySQL
容器运行在该pod
中MySQL
服务创建完毕,如果我们需要访问MySQL
服务只需要通过kuber-proxy
代理MySQL
所在的pod
即可访问成功
kubernetes概念
-
Master:集群控制节点,一个集群中至少含有一个master节点用来对node节点进行管理控制
-
node:工作节点,由master分配服务所处节点位置,由节点对容器分配运行资源
-
pod:kubernetes最小控制单元,node节点中的容器都是运行在pod之中,一个节点可以有一个或者多个容器
-
controller:用来对pod进行管理控制,例如对pod进行停止,启动,伸缩数量等
-
service:pod节点对外提供服务的统一入口,一个service可以为一类pod进行提供服务
-
label:可以用于对pod进行分类,同一类的pod拥有相同标签,只有与service绑定标签相同才可以被service进行对外提供服务
-
namespace:对pod进行环境隔离,处于同一名称空间的pod可以互相访问,不同名称空间的pod不可以访问