一、背景

云原生兴起,带动Kubernetes越发主流,如何将应用在K8s上进行简单、快捷的部署愈发受到关注。

相较于传统的部署方式,Kubernetes可以更快的更新新版本,打包应用,所有应用都是容器,可以轻松做到跨开发、测试和生产的环境一致性;基础设施出现问题时,服务Pod能够根据生命自动创建和迁移,无需人工干预;并且以容器为单位对应用资源进行精确控制,极大的提高了资源利用率。

二、云效解决方案

通过云效持续交付流水线和阿里云K8s很好的结合在一起,为应用的持续交付提供了很好的基础保障,如下图:

开发者提交代码变更到代码库,云效在监听着代码库的变动,一旦代码发生变化,将自动触发云效持续部署流水线一次构建任务的运行,包括代码检查、构建、测试部署、测试验证和生产部署等过程。其中,在构建完之后,生成Docker镜像,并自动上传至应用镜像仓库,在部署阶段(测试环境的部署和生产环境的部署)时,获取当前流水线实例构建出来的镜像版本,通过K8s进行容器编排部署。而这一切,都是通过自动化的手段进行完成。

在接下来的实操实践中,会着重透出以下几方面内容:

1、如何通过云效流水线进行镜像构建,并自定义镜像tag。

2、如何通过YAML进行发布,并进行动态进行模版化处理。

3、如何通过云效流水线进行镜像升级、分批发布和基于流量的灰度发布。

三、场景案例

本文通过一个Springboot项目来具体演示,如何通过云效快速实现K8s的部署发布。

示例代码库地址为:https://code.aliyun.com/flow-example/spring-boot/blob/master/,代码库主要目录结构如下所示:

spring-boot

|---app-configs

|---manifest-app

|---app.YAML

|---ingress.YAML

|---service.YAML

|---Dockerfile2

其中包含了一个deployment,一个service,以及一个ingress将这个服务暴露到公网上。Dockerfile2是我们在本例中构建镜像会用到的Dockerfile。

调用关系如下:

 

四、云效操作实践

接下来讲解如何将示例代码库进行构建并以kubectl apply的方式部署到阿里云 ACK。

准备工作

  • 注册阿里云账号或RAM账号。
  • 准备阿里云ACK集群。注意云效Ingress灰度发布目前支持的Kubernetes版本为1.18及之前版本。创建方式请参考创建Kubernetes托管版集群
  • 准备阿里云镜像仓库ACR。为了能够快速的拉取镜像,建议将ACK集群与ACR放在同一区域,如本例中的华东1:杭州,这样后续在进行Kubernetes部署的时候,我们可以选择镜像VPC地址。若不再同一区域,请选择VPC公网地址。创建方式请参考创建ACR个人版实例

创建流水线

  1. 进入云效点击页面左上角的dock,选择流水线进入Flow

说明 

快速使用:云效平台

点击页面中的【新建流水线】按钮,进入流水线创建向导页面。在弹出页面中选择如下模板,并点击【创建】按钮

 

 

配置代码库

创建流水线之后会自动弹出添加代码源的窗口,这里选择Flow提供的示例代码源,并进行添加

 

配置镜像构建任务

  1. 进入“镜像构建并推送至阿里云镜像仓库”的任务进行编辑。如下图所示,点击”新建服务授权”,进行阿里云授权。同意授权之后,Flow会将创建好的服务授权自动回填写到表单中。

接下来完成区域、仓库的选取。标签填入“${DATETIME}”,表示以流水线触发时的时间戳作为镜像的标签,很多企业习惯将分支名或者tag作为镜像的标签,云效也是支持的,如下图所示,详情参考链接环境变量

Dockerfile路径填入”Dockerfile2”,如下图所示。

配置好之后再“镜像构建并推送至阿里云镜像仓库”任务的下方可以看到该任务输出的变量,这些变量可以在后续的任务中引用。关注其中的第二个和第三个变量即可,其中第二个是该镜像地址的公网地址,第三个是该镜像地址的VPC地址。这里推荐将镜像仓库和ACK集群放在同一个region,然后在后续的部署任务中选择VPC地址,以加速部署过程。

 

 

 

配置部署任务

 

点击“Kubernetes发布”任务,进入配置。点击”新建连接”,进行集群授权,完成阿里云授权及集群选取。点击确认之后,集群信息会自动填到任务配置中。

 

 

 

 

不同企业资源互通,云效支持不通企业资源在同一账号下进行使用,具体参考链接授权管理

配置YAML路径,本示例中YAML路径地址为:app-configs/manifest-app。

配置变量,本演示案例中,需配置两个变量,一个镜像地址IMAGE,一个是服务访问地址HOST。

  • 配置变量IMAGE。点击【添加参数】按钮,变量类型选择上游输出,变量名填入IMAGE,选择镜像的VPC地址作为变量值。如下图所示

这样在运行时,Flow会把YAML路径下的所有文件中的${IMAGE}都替换成镜像的地址,然后再进行kubectl发布。示例代码库中的文件https://code.aliyun.com/flow-example/spring-boot/blob/master/app-configs/manifest-app/app.YAML的内容如下,所以其中的${IMAGE}就会被替换成实际的镜像地址。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: spring-boot-sample
  name: spring-boot-sample
spec:
  replicas: 2
  selector:
    matchLabels:
      run: spring-boot-sample
  template:
    metadata:
      labels:
        run: spring-boot-sample
    spec:
      containers:
      - image: ${IMAGE}
        name: app
  • 配置变量HOST。点击【添加参数】按钮,变量类型选择自定义,变量名填入HOST,填入连接集群的测试域名作为变量值,连接集群测试域名的获取方式如下:进入阿里云容器服务控制台,点击相应集群,点击基本信息,复制测试域名。注意复制测试域名的时候,不需要复制前面的“.*”。

将复制的测试域名,填入新建的自定义变量HOST,如下图所示:

示例代码库中的文件https://code.aliyun.com/flow-example/spring-boot/blob/master/app-configs/manifest-app/ingress.YAML的内容如下,所以其中的${HOST}就会被替换成实际的测试地址。

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: spring-boot-route spec: rules: - host: www.${HOST} http: paths: - backend: serviceName: spring-boot-service servicePort: 8080 path: /

 

 

 

 

运行流水线

配置完毕,点击”保存并运行”触发流水线:

由于在manifest中包含了ingress配置,因此可以通过ack的ingress提供的域名访问服务(注意集群需要保证安装ingress组件):

 

可以直接在浏览器中输入地址http://www.${HOST}进行验证,也可以通过下面的方式进行验证。

$ curl http://www.${HOST} Greetings from Spring Boot!V4

 

镜像升级发布

1.准备工作

  • 新建云效仓库

将示例代码拉取到云效仓库中。

点击进入云效Codeup页面,点击【添加库】-【导入代码库】

在弹出页面中,选择【URL导入】,在源代码库地址框中输入本示例代码库地址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,点击确定。

  • 切换流水线源

点击进入流水线页面,点击刚刚创建的流水线,然后点击【编辑】按钮,如下图所示

将之前的流水线源,删除掉如下图所示

然后点击【添加代码源】,将新建的codeup代码仓库添加进来,选择默认分支,点击【添加】按钮。如下图所示

2.YAML发布

  • 修改代码

进入导入的代码库,修改src/main/java/com/example/demo/文件夹下的HelloController.java文件,做出如下图修改。

  • 运行流水线

点击进入流水线页面,选择之前创建的流水线,点击【运行】按钮,如下图所示

运行成功后,通过下面的方式进行访问验证。

http://www.${HOST}(直接浏览器访问即可,因为代码示例中提供了根路径的访问方法)

备注:我照着文档走了一边流程,出现了两个问题,一个是我忘了安装ingress组件,一个是测试域名无法解析,重新绑定一下域名即可

 

原文地址:如何通过云效进行K8s部署 - 云效2020 - 阿里云

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐