Docker+k8s微服务架构研究与实践
微服务架构是一项在云中部署应用和服务的新技术,Docker+k8s的微服务架构是其中最受欢迎的架构之一。本文是作者通过相关文档的学习写出的关于Docker与Kubernetes的理解,并使用该架构部署了一个非常简单的Web应用。关键词:Docker;Kubernetes;微服务。
注:本文作为结课作业,仅仅为 Docker+k8s微服务架构 的一个简单了解
摘要:微服务架构是一项在云中部署应用和服务的新技术,Docker+k8s的微服务架构是其中最受欢迎的架构之一。本文是作者通过相关文档的学习写出的关于Docker与Kubernetes的理解,并使用该架构部署了一个非常简单的Web应用。
关键词:Docker;Kubernetes;微服务
文章目录
引言
微服务作为一项在云中部署应用和服务的新技术已成为当下最新的热门话题。微服务的基本思想在于考虑围绕着业务领域组件来创建应用,这些应用可独立地进行开发、管理和加速。在分散的组件中使用微服务云架构和平台,使部署、管理和服务功能交付变得更加简单。微服务也有缺点,但通过采用合适的微服务框架可以解决很多问题,Docker+Kubernetes微服务架构就是一个流行好用的微服务部署方式。
1 Docker
Docker的基本思想概括来讲就是:集装箱、标准化、隔离。
Docker用一句话介绍,就是一个创建装应用容器的工具,是应用容器引擎。就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何程序与该程序的依赖打包在一个文件里放在docker中。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
1.1 Docker的基本概念
Docker技术的三大核心概念,分别是:镜像、容器、仓库。
镜像就是上面说的程序与其的依赖的打包文件,可以看作是一个特殊的文件系统。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板,是一堆只读层的统一视角,通过它可以创建 Docker 容器。
容器就是我们运行程序的地方。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。由于容器的定义并没有提及是否要运行容器,所以实际上,容器=镜像+读写层。
仓库就是集中存放镜像文件的场所,也可以说是传输镜像的中介。Docker Registry是一个集中的存储、管理镜像的服务,最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。
1.2 Docker的架构
Docker使用 C/S 结构。Docker客户端与Docker服务器进行交互,Docker服务端负责构建、运行和分发Docker镜像。Docker客户端和服务端可以运行在一台机器上,也可以通过RESTful、stock或网络接口与远程Docker服务端进行通信。
Docker组件协作运行容器可以分为以下几个过程:Docker 客户端执行docker run命令;Docker daemon服务器组件发现本地没有我们需要的镜像;daemon从Docker Hub下载镜像;下载完成后,镜像被保存到本地;Docker daemon 启动容器。
1.3 Dockerfile
Dockerfile是自动构建Docker镜像的配置文件, 用户可以使用Dockerfile快速创建自定义的镜像。Dockerfile中的命令非常类似于linux下的shell命令。
2 Kubernetes (k8s)
Kubernetes是自动化容器操作的开源平台,这些操作包括部署、调度和节点集群间扩展。可以将Docker容器技术部署的容器看作Kubernetes内部使用的低级别组件。Kubernetes 不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
2.1 Kubernetes的主要概念
(1)Node
Kubernetes是一个用于大规模部署分布式应用的平台,它管理着一系列的主机或者服务器,这些主机或者服务器被称作Node节点,拥有名称和IP、系统资源信息。运行docker eninge服务,守护进程kunelet及负载均衡器kube-proxy。
(2)Pod
每个节点运行了若干个相互独立的Pods,Pod是Kubernetes中可以部署的最小执行单元,说白了他就是一个或者多个容器的集合,其中运行了我们应用的某一部分,核心组件有数据库、web服务器等等。Pod包含的容器看作一个统一管理单元,共享网络地址和文件系统
(3)Control plane
当然这么多的pod他们需要相互协调,才能做到负载均衡或者故障的转移,这就需要一台中心计算机来集中管理,这个中心计算机被称作control plane控制平面,拥有控制平面的节点也是旧称Master的管理节点。
控制平面通过专有的API与各个节点进行通信,它会实时监测节点的网络状态来平衡服务器的负载,或者临时下发指令来应对突发的状况,比如Kubernetes发现某个容器或者pod挂掉了,他会立刻启用在后台预先准备好的、随时待命的备用容器来替换它,这些容器被称作Replica Set副本集合,正是由于它们的存在才让我们的应用能够长时间、不间断地可靠运行。
拥有控制平面的节点负责提供集群的资源数据访问入口,拥有Etcd存储服务,运行Api Server进程,Controller Manager服务进程及Scheduler服务进程,关联工作节点Node等来管理集群。
(4)Cluster
以上讲到的所有节点连同控制平面一起被称作一个Cluster集群。集群代表了Kubernetes所管理的全部主机节点。
(5)Service
在默认情况下,我们的Pod只能与同一个集群内的其它Pod进行通信,虽然每一个Pod都拥有一个独立的IP,但这个IP地址对于外网是不可见的,如果要从外网访问我们的应用,我们还需要用到Kubernetes中另一个重要的组件服务Services。
Services也是Kubernetes 的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持,通过Proxy的port和selector服务决定服务请求传递给后端提供服务的容器,对外表现为一个单一访问接口,外部不需要了解后端如何运行,这给扩展或维护后端带来很大的好处。
最最基本的服务NodePort是一种最原始的将应用端口暴露给外网的方式,建立在它之上,Kubernetes还提供LoadBalancer或者更加复杂的Ingress来实现负载的均衡。
2.2 Kubernetes的架构
图1是Kubernetes的架构图。从大的模块看,图中包含控制平面组件(APIs, scheduler, etc),Node节点和Cloud端。
Master中,包含负责提供API服务的组件kube-apiserver;作为后台数据库的etcd,监听组件kube-scheduler;运行控制器的组件kube-controller-manager。
Node节点中包括运行在各个节点的客户端的kubelet,运行在各个节点的网络代理组件kube-proxy,支持运行容器底层环境的软件Container Runtime。
Cloud端以一组多副本的进程集合的形式运行在控制面中,通常表现为 Pod 中的容器,通过与cloud-controller-manager组件对接,扩展k8s集群云上动态扩展的特性。
图1 Kubernetes的架构图
3 实操
在传统的概念当中,Docker 是简单易用的,Kubernetes 是复杂强大的,如果部署起来需要花费很长的时间。要配置一个Kubernetes集群,当然可以亲自租用服务器去搭建环境,不过步骤会稍微繁琐一点,另一种做法是使用现成的、预先配置好的云服务提供商。如果是学习和测试,可以用一种完全免费的方法,是使用minikube在本地模拟一个Kubernetes集群,只不过它不是一个真实的生产环境。
3.1 配置
按照文档安装步骤下载并安装对应的版本minikube,随后再命令行里只需要使用一行指令minikube start启动本地模拟的集群即可。有了集群之后,就可以在上面部署一个应用。首先需要创建一个yaml文件,里面定义了我们应用的基本信息,比如它由哪些pod组成、里面运行了哪些容器以及网络配置等等,它和Docker中的Dockerfile很类似,可以把它当作是一个自动化脚本,里面描述了应用部署的整个过程。
3.2 应用部署
这里会用到一个命令行工具kubectl来与Kubernetes集群进行交互,可以使用kubectl apply来部署我们的应用,并且传入之前创建的这个yaml文件,此时Kubernetes会在后台开始应用的部署。可以通过kubectl get pods查看所有pod的运行状态,使用kubectl get services可以查看所有创建的服务。
应用部署完成后可以在minikube上显示该应用服务,如图2所示。
图2 应用部署完成图
更新应用只需要去修改之前的yaml文件,然后再次调用kubectl apply即可,Kubernetes会在后台无缝地更新我们的应用,确保新版本运行起来以后再去销毁旧的版本,因此用户不会遇到服务停机的问题。
如果不再需要某个应用,那么可以通过kubectl delete命令从集群上完全移除它。
上述部署应用的操作也可以通过VSCode中的插件完成,里面也可以查看各个节点、Pod、 服务的运行状态,停止或者删除它们。
3.3 访问被部署的应用
因为我部署了一个web应用,所以应当去浏览器中访问它。由于我么使用的是minikube模拟的集群,所以需要用到一个专门的指令minikube service后面跟上我们服务的名字,这样minikube会自动在浏览器中打并我们的应用,如图3所示。
图3 应用打开截图
4 结束语
单体式架构变成微服务架构,相当于一个全能型变成N个专能型。每个专能型,分配给一个隔离的容器,赋予了最大程度的灵活。本次实操只不过是Kubernetes中一个非常简单的应用部署,通常生产环境下的应用远比这个要复杂的多,还需要深入学习一下Kubernetes,阅读官方的文档。
参考文献:
[1] Kubernetes SIG Docs,Kubernetesg概述,Kubernetes文档,2022年3月9日,https://kubernetes.io/zh/docs/home/.
[2] docker,docker Guides,docker docs,https://docs.docker.com/.
更多推荐
所有评论(0)