持续集成引擎篇:K8S 与服务自动发布
前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S 相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作;本篇文章主要描述 Kubernetes 引擎用法和自动化发布。
一、K8S 简介
Kubernetes 简称 K8S,是一个开源的分布式的容器编排引擎,用来对容器化应用进行自动化部署和管理。
Control-Plane-Components:控制平面组件,对集群做出全局决策,例如:调度、检测和事件响应,可以在集群中的任何节点上运行;
api:作为 K8S 控制面的组件,开放 K8S 的 API,相当于控制面的前端;
etcd:兼具一致性和高可用性的键值数据库,作为保存 K8S 数据的后台库;
scheduler:监听新建未指定运行节点的 Pods,并为 Pod 选择运行节点;
controllermanager:运行控制器进程,逻辑上是一个单独的进程;
Node:节点组件:每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境;
kubelet:在每个节点上运行的代理,保证容器都运行在 Pod 中;
kube-proxy:每个节点上运行的网络代理, 维护节点上的网络规则;
Container-Runtime:容器运行时,负责运行容器的软件,支持 Docker、containerd、CRI-O 等多个容器运行环境,以及任何实现 Kubernetes-CRI 容器运行环境接口。
二、环境配置
1、服务搭建
使用 Git 拉取k8s-docker-desktop-for-mac
仓库,执行load_images.sh
脚本,会拉取本地 docker 对应的 k8s 版本,注意这里要等到脚本流程执行完毕,可能因为 Git 连接的问题,耗时较长,下面是脚本拉取的镜像:
上述镜像下载完成后,通过 docker 桌面软件启动 k8s 即可,这里启动时间相对偏长,启动成功之后界面左下角 K8S 显示绿色状态:
2、环境查看
三、部署 Docker 镜像
1、核心组件
在执行 Docker 镜像部署之前,首先要理解该流程中几个核心的概念:
Pod:是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元;就 Docker 概念的术语而言,Pod 类似于共享命名空间和文件系统卷的一组 Docker 容器;
ReplicaSet:目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合;通常用来保证一定数量的、完全相同的 Pod 的可用性;
Deployment:为 Pods 和 ReplicaSets 提供声明式的更新能力,可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment;
Service:抽象的方式将运行在一组 Pods 上的应用程序公开为网络服务,在 K8S 中逻辑上 Pods 集合与访问策略,这种模式被称为微服务;
2、脚本文件
这里将 Deployment 与 Service 放在一个.yaml
文件中;镜像加载设置imagePullPolicy:Never
即本地读取;其中服务发现采用的是NodePort
类型,并没有设置具体端口,控制平面会在默认范围内分配一个端口号;
3、资源管理
创建资源
查看资源
也可以在 K8S 的 Web 控制台上,查看资源的可视化界面,下面截图几个脚本中明确声明的资源信息:
删除资源
4、访问资源
这里NodePort
端口默认分配30930
,当外部访问流量到达 Service 时,会路由到指定Endpoints
(端点),通过上面的资源查看可知,这里 Endpoints 即 Pod 的 IP 与端口;
通过:本机IP:分配端口/API
方式,即localhost:30930/client
访问到 docker 容器中应用,也可以在 Web 界面的 Pod 模块查看具体的日志输出:
四、控制台组件
Dashboard 是基于 Web 的 Kubernetes 用户界面,可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源,查看日志等。
1、创建命名空间
查看命名空间
2、查看 Pod
3、查看 Deployment
4、查看 Service
五、自动化发布
分布式服务的部署是一个复杂的流程,当容器应用存在几十甚至上百的时候,用手动的方式部署显然难度过高,借助 Kubernetes 容器编排引擎,可以快速的实现自动部署,扩展,升级等一系列复杂步骤。
六、流程设计
在之前的篇幅中,已经描述了流水线的方式进行源码编译 Jar 包,并构建成 Docker 镜像的过程,接下来在 K8S 平台上部署 Docker 容器,这样整个自动化的流程就基本完善了:
核心步骤:
创建 yaml 文件类型资源管理脚本;
执行已部署资源的删除;
根据脚本创建新的资源服务;
该流程衔接在 Docker 镜像构建成功之后,可以先在本地 pull 镜像,也可以直接从远程仓库实时获取镜像。
七、实现过程
1、插件安装
Jenkins 集成 K8S 的插件:Kubernetes plugin
。
2、部署脚本
关于 K8S 部署 docker 镜像的脚本语法,在 K8S 基础模块中有详细描述,创建脚本文件的语法在 docker 流水线模块中同样适用:
脚本说明:
进入 k8s 的工作目录;
创建
k8s-app.yaml
部署的脚本文件;声明 Pod 的副本数为:2;
根据脚本尝试一次资源删除;
根据脚本创建资源;
set +e-e
为 shell 语法,控制脚本是否中断;
资源创建成功后,查看 k8s 的控制台界面,各个组件是否都部署成功,之后通过访问服务中 API 接口判断环境是否通顺:
3、流程总结
在整个流程中,涉及下面几个核心阶段:
源码管理,代码仓库获取,hook 模式配置;
本地编译打包,生成应用的 Jar 包;
Docker 将 Jar 包构建成镜像文件,上传仓库;
K8S 将 Docker 镜像部署在集群服务上;
这里简化很多不必要的流程,在实际的应用中,远比案例中的演示更复杂,可以根据各个业务的需要,参考流水线组件的功能文档,不断引入更好的方式去优化流程,最终会形成一个持续交付的自动流程,并且不会对代码层面带来改造成本。
八、源代码地址
版权声明: 本文为 InfoQ 作者【知了一笑】的原创文章。
原文链接:【http://xie.infoq.cn/article/68c9716ad147282bb243371c6】。文章转载请联系作者。
评论