1.背景
搜索当前主要有两大功能;一是对外服务,另一个是定时任务。
对外服务,定时任务的资源利用情况如下:
对外服务 | 定时任务 | |
---|---|---|
资源利用集中时间 | 白天 | 晚上 |
对外服务的资源利用主要集中在白天,定时任务的资源利用情况主要集中在晚上。本文主要通过介绍docker, k8s让对外服务,定时任务的机器资源充分利用起来。节省成本。
2.k8s与docker
2.1 docker
2.1.1 docker是什么
Docker 是世界领先的软件容器平台。docker主要有以下三部分组成。
-
镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
-
容器(Container):容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间
-
仓库(Repository):集中存放镜像文件的地方
docker形象的解释如下图:
-
Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源。
-
Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样。
-
Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方
2.1.2 docker为什么这么流行
- Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性
- 可以做到秒级、甚至毫秒级的启动时间
- 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
- 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
- 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
- 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署
2.1.3 docker与虚拟机的区别
-
虚拟机是在一台物理机器上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。
-
Docker是开源的应用容器引擎,依然需要先在电脑上安装操作系统,然后安装Docker容器的管理器,才可以。虚拟机是在硬件级别进行虚拟化,而Docker是在操作系统的层面虚拟化;虚拟机是通过模拟硬件搭建操作系统。
2.2 K8S
2.2.1 K8S是什么
Kubernetes,简称 k8s(k,8 个字符,s ),是一个开源的 容器自动化运维平台,消除了容器化应用程序在部署、伸缩时涉及到的许多手动操作。google是k8s爹
2.2.2 k8s的业务方
2.2.3 k8s管理docker中的容器
k8s对docker中的容器进行了抽象,提出了新的概念pod。pod是k8s调度的基本单位
- Pod 是容器的封装及抽象
- Pod是k8s调度的基本单位
- Pod与Pod之间可以相互通信
- 一个Pod里可以包含多个docker容器
2.2.4 k8s与docker的关系
-
当 k8s 把 pod 调度到节点上,节点上的 kubelet 会指示 docker 启动特定的容器
-
kubelet 会通过 docker 持续地收集容器的信息,然后提交到主节点上
-
Docker 拉取容器镜像、启动或停止容器。不同点仅仅在于这是由自动化系统控制而非管理员在每个节点上手动操作的
2.2.5 k8s集群节点关系
k8s集群由master节点及node节点组成,master节点与node节点的关系如下图:
master节点
master进程由 kube-apiserver, kube-controller, kube-scheduler进程组成。apiserver提供了api来操作master,管理pod,调度pod;controller进程控制,管理pod。scheduler来调度pod到指定node上执行。
node 节点
node节点由kublet进程,kube-proxy进程组成。keblet进程定时上报操作系统;Docker版本;机器的cpu, 内存,磁盘使用情况;当前有那些Pod在运行;Pod副本数到master节点,供master决定调度。kube-proxy进程提供了多种智能调度算法调度pod。
3. 弹性扩容
3.1 k8s增删改查pod
k8s通过label来增删改查pod。label顾名思义是标签。K8S 通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象。 类比 SQL where 查询条件。
k8s中label的使用场景
- Controller进程监控RC上定义的Label Selector来监控Pod副本的数量
- Proxy进程通过Service 的Label Selector来选择对应的Pod, 实现智能负载均衡机制
- Scheduler进程通过Node的Label来实现Pod的定向调度
3.2 k8s半自动化扩容
k8s的半自动化扩容通过RC实现,即Replication Controller。
一:RC的定义
-
Pod期待的副本数量
-
用于刷选目标Pod 的Label Selector
-
当Pod的副本数量小于预期数量时,用于创建新Pod的模板
二:实现原理 -
当一个新定义的RC提交到K8S集群中时,Master Controller进程定期巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于次RC的期望值。
-
如果由过多的Pod副本在运行,则系统会停掉一些Pod;过少则创建
举例:
创建mysql 的rc,rc文件中定义了metadata name值,label,创建pod的image定义。通过replicas定义了系统中的pod数。
3.3 k8s自动化扩容
k8s自动化扩容通过PHA对象来实现,即Horizontal Pod AutoScaling。
实现原理
通过分析指定RC控制的所有目标Pod的负载变化情况,来确定是否需要有针对性的调整目标Pod的副本数量。
实现方式
- CPUUtilizationPercetage(是目标Pod所有副本自身的CPU利用率的平均值。)
- 容器内存
- 应用程序自定义的度量指标。如qps, tps
举例创建mysql HPA。HAP中定义了最小副本数/最大副本数。最大cpu利用率,最大内存使用。
当cpu利用率达到50%时,则新增副本数,但是最大副本不能超过10,当cpu利用率小于50%时,则回收创建的pod, pod的最小副本数不能小于2。
3.4 外部用户如何使用这些pod
k8s通过service对象提供pod服务能力。service 可以类比为微服务架构中的一个微服务。
Service 定义了一个服务的访问入口地址,前端的应用(Pod)通过这个入口地址访问器背后的一组由Pod副本组成的集群实例。
举例创建MySql 服务,对外通过node的ip:port进行访问
4 总结
本文讲解了docker是什么,使用docker的优势,docker跟k8s的关系。最后讲解了k8s的半自动化扩容跟自动化扩容。