开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:实验四:流水线部署】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/913/detail/14610
实验四:流水线部署
一、 实验概述
1. 实验简介
本实验通过在 ack 集群上部署 jenkins ,来实现一键式自动拉取 github 仓库上的代码,编译、构建镜像、部署 deployment ,来完成流水线部署的目的。
实验地址:
https://developer.aliyun.com/adc/scenario/exp/cd67aefa9f2d466bb9b6b21716054284
2. 实验资源
本实验涉及的实验资源有三个:ack 托管版集群、ecs 客户端( Linux 系统)和RAM 账号。
3. 实验目的
a. 主要演示如何在阿里云 Kubernetes 服务上快速搭建 Jenkins 持续集成环境;
b. 基于提供的示例快速完成应用源码编译、应用镜像构建、推送以及应用部署的流水线。
4. 实验架构
注:在多人的情况下,需要创建多个集群或者多个命名空间,jenkins 部署在每个人自己的命名空间下。
二、实验准备
1. 已创建 Kubernetes 集群
2. 一台本地机器(如 centos7.6 的服务器),完成下面的准备步骤:
a. 安装 docker-ce ,用于生成配置文件;本实验提供的 ECS 节点,已经预安装了 docker ,直接使用即可;
b. 安装 kubectl 客户端,
安装步骤:
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod 755 kubectl
$ mv kubectl /usr/bin/
$ mkdir /root/.kube
最后,配置 config 文件,参考文档验证 kubectl 功能;
3. 在个人账户上创建容器镜像服务的个人实例(该产品为免费产品):
创建 gitee 账户, 详见后续实验步骤:“fork https://gitee.com/ahwhya/jenkins-demo.git 这个 demo 项目到自己的 gitee 账号”。
三、实验步骤
1. 创建镜像仓库并设置密码
a. 创建镜像仓库
开通容器镜像服务后,再依次创建命名空间和镜像仓库;
创建命名空间对应的镜像仓库;
这里选择“本地仓库”,然后单击“创建镜像仓库”;
b. 设置密码
选择“实例列表”—“个人实例”—“访问凭证”, 查看登陆实例用户名:
“username=” 之后的为用户名,即 DOCKER_USER ,设置的密码,即DOCKER_PASSWORD;
单击“创建固定密码”;
2. 创建镜像仓库拉取密钥
通过 kubectl 在 kubernetes 集群中创建 Secret,用于集群拉取仓库镜像。
创建拉取仓库镜像的 secret
$ kubectl create secret docker-registry hub-secret --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD -n Jenkins
3. Fork demo 项目
fork https://gitee.com/ahwhya/jenkins-demo.git 这个 demo 项目到自己的 gitee 账号,然后配置 gitee 的拉取密钥(如果设置为公开仓库,这里可以不用配置,但默认环境为私有仓库,参考链接),记住私钥文件。
备注:
a. 公钥私钥生成:ssh-keygen -t rsa -C“邮箱地址”;
b. 检验办法 ssh -T git@gitee.com
4. 创建 jenkins 上传拉取仓库镜像的密钥
通过 kubectl 在 kubernetes 集群中创建 Secret,用于 jenkins 上传构建后的镜像。
a. 参考截图给的登陆示例步骤:
$ docker login --username=DOCKER_USER registry.cn-hangzhou.aliyuncs.com
在 kubectl 的终端中输入访问凭证,登陆 Registry 实例,登陆后访问凭证会自动保存在 /root/.docker/config.json 文件中;
b. 执行以下命令创建名为 jenkins-docker-cfg的secret:
$ kubectl create secret generic jenkins-docker-cfg -n jenkins --from-file=/root/.docker/config.json
注:命名空间请指定自己安装 jenkins 的命名空间。
5. 部署 jenkins
a. 登录容器服务管理控制台;
b. 在阿里云应用页签中,选择 ack-jenkins;
c. 单击参数页签;
d. 可以在 AdminPassword 字段,修改并自定义密码,如:Admin@123!;
e. 选择 Kubernetes 集群以及命名空间(请选择自己创建的命名空间),填写发布名称;
6. 查看 jenkins 资源并设置插件
a. 在容器服务控制台左侧导航栏中,单击集群;
b. 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情;
c. 在集群管理页左侧导航栏中,选择服务与路由> 服务;
d. 选择相应的命名空间,然后单击 ack-jenkins-default 服务的外部端点,访问并登录 Jenkins;
e. 在新手入门配置页面,单击安装推荐的插件;
f. 选择“系统管理”—“全局安全配置”—“跨站请求伪造保护”—“勾选启用代理兼容”;
7. 设置 gitee 代码仓库拉取密钥
添加 gitee 凭据。点击“Dashboard”—“系统管理”—“mangage credentials” —“全局”—“添加凭据”
“类型”选择“SSH Username with private key”,“ID”和“描述”可以随便填,“Username”请填写执行 ssh-keygen 产生 gitee 的密钥对时操作系统的用户名(填写错误将会导致拉取gitee代码失败),“Private key”填写拉取 gitee 代码的私钥。点击“确定”保存。
8. 配置 slave-node
点击“dashboard”—“系统管理”—“节点管理”—“Configure Clouds”—“Pod Templates”—“Pod Template details”
“添加卷”—“secret volume”,Secret 名称为之前在k8s集群中创建的 secret:“jenkins-docker-cfg”,挂载路径为:“/root/.docker”,点击“Save”保存。
9. 新建 pipeline 任务
a. 点击“dashboard”—“新建任务”
设置任务名称,点击“流水线”,然后点击“确定”进入详细的配置页。
b. 在“Gerneral”页签,勾选“参数化构建过程”—“添加参数”—“添加字符参数”,依次填写如下键值对:
image_region:cn-hangzhou,origin_repo:registry.cn-hangzhou.aliyuncs.com/test-xiniao,repo:ack-jenkins-demo,
image_tag:latest,branch:master
c. 在“流水线”页签,“定义”选择“Pipeline sript from SCM”, “SCM”选择“Git”,“ Repository URL”填写 gitee 项目地址,“Credentials”选择之前配置好的 gitee 代码仓库拉取密钥,“Branches to build”填写“*/master”,点击“保存”保存配置:
10. 构建任务
a. 在“Dashboard”页面,选择刚才创建的 pipeline 任务“xiniao-test”,点击右边的构建按钮进行构建;
查看构建历史,可以查看构建的步骤以及失败的记录;
在“构建历史”中点击其中一个构建历史进入某次构建的详情页,点击“Console output”可以查看构建日志;
b. 查看构建完成后在 K8S 集群中创建的应用:
我们部署了一个简单的演示程序“Jenkins-java-demo”,并且采用 LoadBalancer 的方式暴露服务。现在,我们可以在公网上用 IP 和端口来进行访问。
四、参考文档
1. Jenkinfile 使用说明:
https://www.jenkins.io/zh/doc/book/pipeline/jenkinsfile/
2、Jenkins 流水线部署:
https://help.aliyun.com/document_detail/106712.html
注意事项:若 jenkins 控制台有类似“No valid crumb was included in request for /pluginManager/installPlugins by admin. Returning 403”的报错,可以先在插件管理安装“Strict Crumb Issuer“插件,然后在“全局安全配置”处开启代理兼容模式: