写点什么

持续集成引擎篇:K8S 与服务自动发布

作者:知了一笑
  • 2022 年 3 月 16 日
  • 本文字数:3993 字

    阅读完需:约 13 分钟

持续集成引擎篇: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 imagesREPOSITORY                           TAG                                                  docker/desktop-kubernetes            kubernetes-v1.21.5-cni-v0.8.5-critools-v1.17.0-debiank8s.gcr.io/kube-apiserver            v1.21.5                                              k8s.gcr.io/kube-proxy                v1.21.5                                              k8s.gcr.io/kube-controller-manager   v1.21.5                                              k8s.gcr.io/kube-scheduler            v1.21.5                                              docker/desktop-vpnkit-controller     v2.0                                                 docker/desktop-storage-provisioner   v2.0                                                 k8s.gcr.io/pause                     3.4.1                                                k8s.gcr.io/coredns/coredns           v1.8.0                                               k8s.gcr.io/etcd                      3.4.13-0                                             
复制代码


上述镜像下载完成后,通过 docker 桌面软件启动 k8s 即可,这里启动时间相对偏长,启动成功之后界面左下角 K8S 显示绿色状态:


2、环境查看

# 查看版本:kubectl versionClient Version GitVersion:v1.21.5Server Version GitVersion:v1.21.5
# 查看集群:kubectl cluster-infoKubernetes control plane is running at local-host:6443
# 查看节点:kubectl get nodesNAME STATUS ROLES AGE VERSIONdocker-desktop Ready control-plane,master 23h v1.21.5
复制代码

三、部署 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类型,并没有设置具体端口,控制平面会在默认范围内分配一个端口号;



---apiVersion: apps/v1kind: Deploymentmetadata:  name: cloud-app-deployment  labels:    app: cloud-appspec:  selector:    matchLabels:      app: cloud-app  template:    metadata:      labels:        app: cloud-app    spec:      containers:      - name: cloud-app        image: Cloud_Url/cicada-image/cloud-app        imagePullPolicy: Never        ports:         - containerPort: 8079---apiVersion: v1kind: Servicemetadata:  name: cloud-app-service  labels:    app: cloud-appspec:  type: NodePort  ports:     - port: 8080      targetPort: 8079  selector:    app: cloud-app
复制代码

3、资源管理

创建资源


kubectl create -f pod.yaml
复制代码


查看资源


# 1、查看Pod信息kubectl get pods -o wide
# 2、查看Service信息kubectl get svc -o wide
# 3、查看Node信息kubectl get nodes -o wide
复制代码


也可以在 K8S 的 Web 控制台上,查看资源的可视化界面,下面截图几个脚本中明确声明的资源信息:



删除资源


# 1、通过文件删除kubectl delete -f pod.yaml
# 2、通过具体资源名删除kubectl delete pod cloud-app
复制代码

4、访问资源

# 查看服务的详细描述kubectl describe svc cloud-app-serviceName:                     cloud-app-serviceNodePort:                 <unset>  30930/TCPEndpoints:                Pod_IP:Pod_端口
复制代码


这里NodePort端口默认分配30930,当外部访问流量到达 Service 时,会路由到指定Endpoints(端点),通过上面的资源查看可知,这里 Endpoints 即 Pod 的 IP 与端口;


通过:本机IP:分配端口/API方式,即localhost:30930/client访问到 docker 容器中应用,也可以在 Web 界面的 Pod 模块查看具体的日志输出:


四、控制台组件

Dashboard 是基于 Web 的 Kubernetes 用户界面,可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源,查看日志等。


1、创建命名空间


kubectl create namespace cm-dev
复制代码


查看命名空间



2、查看 Pod



3、查看 Deployment



4、查看 Service


五、自动化发布

分布式服务的部署是一个复杂的流程,当容器应用存在几十甚至上百的时候,用手动的方式部署显然难度过高,借助 Kubernetes 容器编排引擎,可以快速的实现自动部署,扩展,升级等一系列复杂步骤。

六、流程设计

在之前的篇幅中,已经描述了流水线的方式进行源码编译 Jar 包,并构建成 Docker 镜像的过程,接下来在 K8S 平台上部署 Docker 容器,这样整个自动化的流程就基本完善了:



核心步骤:


  • 创建 yaml 文件类型资源管理脚本;

  • 执行已部署资源的删除;

  • 根据脚本创建新的资源服务;


该流程衔接在 Docker 镜像构建成功之后,可以先在本地 pull 镜像,也可以直接从远程仓库实时获取镜像。

七、实现过程

1、插件安装

Jenkins 集成 K8S 的插件:Kubernetes plugin

2、部署脚本

关于 K8S 部署 docker 镜像的脚本语法,在 K8S 基础模块中有详细描述,创建脚本文件的语法在 docker 流水线模块中同样适用:


    environment {        k8s_directory = 'k8s-deploy'    }
// K8S部署Docker镜像 stage('K8Sdeploy') { steps { sh ''' rm -rf ${k8s_directory} mkdir -p ${k8s_directory} cd ${k8s_directory}cat>k8s-app.yaml<<EOF---apiVersion: apps/v1kind: Deploymentmetadata: name: k8s-app-deployment labels: app: k8s-appspec: replicas: 2 selector: matchLabels: app: k8s-app template: metadata: labels: app: k8s-app spec: containers: - name: k8s-app image: cicada-image/doc-line-app:latest imagePullPolicy: Never ports: - containerPort: 8079---apiVersion: v1kind: Servicemetadata: name: k8s-app-service labels: app: k8s-appspec: type: NodePort ports: - port: 8080 targetPort: 8079 selector: app: k8s-appEOF cat k8s-app.yaml echo "create k8s-app.yaml success"
echo "base Yaml file deploy k8s resource" ls sleep 10 set +e kubectl delete -f k8s-app.yaml sleep 10 set -e kubectl create -f k8s-app.yaml ''' } } }
复制代码


脚本说明:


  • 进入 k8s 的工作目录;

  • 创建k8s-app.yaml部署的脚本文件;

  • 声明 Pod 的副本数为:2;

  • 根据脚本尝试一次资源删除;

  • 根据脚本创建资源;

  • set +e-e为 shell 语法,控制脚本是否中断;


资源创建成功后,查看 k8s 的控制台界面,各个组件是否都部署成功,之后通过访问服务中 API 接口判断环境是否通顺:


3、流程总结


在整个流程中,涉及下面几个核心阶段:


  • 源码管理,代码仓库获取,hook 模式配置;

  • 本地编译打包,生成应用的 Jar 包;

  • Docker 将 Jar 包构建成镜像文件,上传仓库;

  • K8S 将 Docker 镜像部署在集群服务上;


这里简化很多不必要的流程,在实际的应用中,远比案例中的演示更复杂,可以根据各个业务的需要,参考流水线组件的功能文档,不断引入更好的方式去优化流程,最终会形成一个持续交付的自动流程,并且不会对代码层面带来改造成本。

八、源代码地址

GitEE·地址https://gitee.com/cicadasmile/butte-auto-parentWiki·地址https://gitee.com/cicadasmile/butte-java-note
复制代码



发布于: 2022 年 03 月 16 日阅读数: 44
用户头像

知了一笑

关注

公众号:知了一笑 2020.04.08 加入

源码仓库:https://gitee.com/cicadasmile

评论

发布
暂无评论
持续集成引擎篇:K8S与服务自动发布_Docker_知了一笑_InfoQ写作平台