Bootstrap

Kubernetes与Docker自动化部署 - DevOps CI/CD详细指南

什么是Kubernetes部署?

在此文章中,我们将探索Kubernetes(K8s),结合DigitalOcean Kubernetes集群与Buddy自动化运维系统部署以达到以下列出的目标:

  • 使用一个K8s示例应用通过Buddy流水线操作构建Docker镜像并推送至Docker Hub注册中心
  • 通过K8s示例应用设置两个Hello World演示部署于K8s集群之中以便测试负载均衡器
  • 为K8s示例应用安装Ingress NGINX控制器于K8s集群之中
  • 使用Cert-Manager添加域名SSL证书

Buddy中的Kubernetes交付流水线

K8s优势

K8s可以将其描述为一个容器编排平台,它可以在云端或远程机器上扩展和运行您的应用程序。为了更容易理解,您可以把它想象成一个容器管理器,它会自动处理您必须手动执行的操作。

以下是使用K8s的一些优势:

  • 自愈能力 – 通过自动调度程序,K8s能够在出现错误或超时的情况下用新容器替换容器。
  • 滚动(Rollouts)与回滚(Rollbacks) – 除了自我修复能力外,K8s还实现了新部署滚动,类似于蓝绿色部署,大大减少了停机机会。
  • 负载分配和自动发现 – 在K8s上运行的解耦应用程序能够在本地集群网络上进行通信,从而减少公开应用程序地址所需的工作量。除此之外,K8s还有多个负载分配点。这意味着,您可以将负载从入口层和服务层分配到Pod。
  • 横向与纵向扩展 – K8s允许我们根据场景进行横纵扩展。您可以运行同一应用程序的500多个容器,并且仍然几乎毫不费力地管理分配给每个容器的资源。说明K8s为您的应用程序提供弹性伸缩!
  • 交付速率 – 发布应用程序的速度对当今每个团队都至关重要。过去,发布必须由许多团队成员在预定维护期间完成,期间会出现很多中断和停机时间。

即使没有持续部署,K8s也能够在几乎没有停机时间的情况下促进和管理各种规模的发布。

K8s构架

K8s本身由几个组件组成。但我们不会在本文中介绍所有内容,主要关注于容器,我们还将使用Docker

K8s上的容器以称为Pod的组合运行。Pod中的容器共享相同的网络、存储和地址。这说明访问pod的地址实际上意味着访问pod中的容器之一:

Kubernetes服务布局

虽然您确实不需要流水线来让应用程序在云服务上运行,但由于SDK,在更大范围内,团队会发现依赖本地机子部署效率非常低。

K8s部署工作原理

流水线可以被认为是将服务或应用程序从A点移动到B点的一种方式。在CI/CD方面,我们可以将其分为三种类型:

  1. 持续集成 – 通过GitHub等版本控制平台对代码进行测试和版本控制。这就是Buddy的用武之地,它提供了更简单、更高效的流水线配置方式。
  2. 持续交付 – 有助于将应用程序从版本控制平台部署到云服务或其他供应商特定的服务。交付流水线需要批准才能部署到特定环境,例如生产环境或面向客户的环境。
  3. 持续部署 – 无需人为干预、批准或输入,即可轻松自动部署到云端。

微服务模式引入了一种新的软件实现方式。将此视为一种移动模式,涉及多个移动部件,所有部件都统一起来以呈现单个应用程序。

无论有没有DevOps工作人员,您的团队都不必担心与运维相关的问题,比如弄清楚三个应用程序组件的交付。最重要的是保持对产品的聚焦。

K8s自动化陷阱

技术栈

过去,部署堆栈主要基于Shell脚本构建。对于以前没有堆栈经验的团队成员来说,这通常很复杂。现在,几乎每个平台都提供 YAML。作为一种声明式和更透明的语言,YAML的学习曲线相当容易。然而,不幸的是,有些平台仍然需要YAML上对shell的解决方案。

Buddy凭借着其直观的GUI和流水线声明式YAML配置解决了这些问题。

安全性

安全性是任何流水线的关键组成部分。关键的安全问题之一是处理密钥和敏感信息。在大多数情况下,密钥或敏感信息在进行加密后作为环境变量添加到平台上,然后在构建过程中进行转译和解密。在定义这些作业的过程中,很容易通过打印密钥或对公共Docker镜像进行版本控制来泄露这些细节信息。同时还建议避免在第三方服务上使用不受限制的API密钥。

Buddy如何处理安全问题

  • 只需按一下按钮即可自动加密和手动加密。
  • 存储仓通用的操作变量建议和默认环境变量

模糊的平台与工具关联

平台关联肯定是最大的挑战之一。不同的团队以不同的方式处理此问题:从开箱即用的特定于平台YAML模块到脚本连接。建议采用模块化方法代替脚本化流水线,通常涉及几个步骤:从获取SDK到授权,再到实际部署。这通常会导致相当复杂、容易出错且体积庞大的流水线。

Buddy提供与各大商家的各种集成,以及具有声明性流水线操作模式丰富的buddy.yml脚本。

K8s部署如何工作? 示例流水线

本文的K8s示例应用可以在这个GitHub
Repo
中下载源码!

构建与推送Docker镜像

首先创建一个名为hello的Buddy项目,并选择Buddy自带的Git托管作为代码存储仓:

下载GitHub存储仓中的源码并推送至刚刚创建的项目存储仓:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w70YiQX4-1673171974035)(https://docs.buddy.red/img/guides/hello-repo.png)]

然后在Buddy中添加DigitalOcean集成,以方便持续集成所要使用的DigitalOcean Kubernetes集群:

流水线中添加操作

在hello项目中创建一条流水线:

接下来,我们将在流水线上添加第一个操作,即Docker构建镜像,为将所构建的镜像推送至Docker Hub而做准备:

选择存储仓上的Dockerfile文件并提交完成添加Docker构建镜像操作:

添加第二个操作:推送Docker镜像

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q2MnrR3x-1673171974037)(https://docs.buddy.red/img/guides/add-docker-push-action.png)]

推送Docker镜像的作用是可将上一个操作构建好的镜像推送至目标Docker注册中心,也就是Docker镜像存储仓,例如:Docker Hub、Amazon ECR、Google GCR以及私有的镜像注册中心等等不一。

如果您是第一次接触Docker镜像构建,推荐使用Docker Hub,目前只需要在Docker官方网站上免费注册一个帐户即可使用。

填写好相关要推送的镜像信息完成添加推送Docker镜像

此时,您应该看到如下图有两个操作添加于流水线之中:

运行流水线

点击以上蓝色“运行”按钮开始运行流水线:

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;