【RancherLab】Rancher2.1从集群搭建到Pipeline部署完整教程
Rancher2.1从集群搭建到Pipeline部署完整教程
编者按:
本文来自Rancher用户许先学的投稿。Rancher Kubernetes管理平台 ,能够让用户在生产环境中轻松快捷的部署和管理容器及Kubernetes。Rancher 2.x版本内置的CI/CD Pipeline,让用户得以快速搭建团队所需的CI/CD流水线。本文将分享用户自身的最佳实践,step by step完成从集群搭建到Pipeline部署的完整流程。
1. 搭建Rancher Server
安装Rancher 2.0
Rancher的安装过程很简单,你可以按照官方的基础环境配置及安装文档,进行配置和安装:
https://www.cnrancher.com/docs/rancher/v2.x/cn/installation/basic-environment-configuration/。
Docker所需要的daemon.json可以直接使用下面的json代码:
要求(列出大致要求,具体步骤特别是docker安装部分参照上面的基础环境配置): - CPU: 4C; - 内存:8G以上(亲测16G比较舒服,4G的也可以吧,但是部署应用基本上起不来3个Pod); - Centos/RedHat Linux 7.5+(64位); - Docker 17.03.2;(用其他版本的立马重新装吧) - 配好主机名和host,关防护墙和selinux;(/etc/hosts和/etc/hostname) - 配置Docker镜像加速地址等信息 /etc/docker/daemon.json,如下代码 - 使用非root账户 - 主机名仅只支持包含 - 和 .(中横线和点)两种特殊符号,不能重复
配置要求最好按照官方建议的来:

# 创建 /etc/docker/daemon.json { "max-concurrent-downloads": 3, "max-concurrent-uploads": 5, "registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/","https://IP:PORT/"], "storage-driver": "overlay2", "storage-opts": ["overlay2.override_kernel_check=true"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }
# 配置好环境后执行下面命令创建rancher server(这里需要点耐心等等) sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher
创建第一个集群
快速搭建集群的更详细教程可参照官方文档:
https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/quick-start-guide/#top

我搭设的是1server、2master、2node的集群 ,选择好角色,粘贴至各主机去运行,在高级选项中写上对应的主机外网ip;master只选择etcd和control,node只选择worker;多master实现高可用也是没问题的。

RKE & import & vsphere
2. Rancher2.0中K8S Dashboard的安装
Rancher2.0和之前不一样的地方之一就是没有原生Dashboard,需要我们手动安装。
手动安装Dashboard之前需要安装好kubectl。
安装kubectl
kubectl可以按照官方文档来,如果不能上网,可以使用Rancher提供的安装包,步骤如下:
wget -O kubectl https://www.cnrancher.com/download/kubectl/kubectl_amd64-linux chmod +x ./kubectl sudo mv ./kubectl /usr/local/bin/kubectl kubectl cluster-info kubectl get all kubectl get nodes kubectl get nodes --all-namespaces # kebectl如果安装好执行无效 检查~/.kube/kubeconfig 文件有没有从集群复制过来

手动安装Dashboard
目前我尝试过两种方法,下面分别进行介绍。
-
方法1:
使用github上的教程手动安装:
https://gist.github.com/superseb/3a9c0d2e4a60afa3689badb1297e2a44
其中第一步是安装和验证kubectl,第二步是部署dashboard。如果不能FQ获取不到dashboard镜像,可以修改其中yaml文件的镜像源,这里提供一个其他人上传的源
siriuszg/kubernetes-dashboard-amd64:v1.10.0
或者直接使用这份写好的
kubectl apply -f https://raw.githubusercontent.com/usernamecantbeXXX/kubernetes-dashboard/master/kubernetes-dashboard.yaml
然后在第四步的地方,注意dashboard.yml中name是admin-user,后面生成token的describe secret的命令也需要写上对应的名字。
-
方法2:
使用Rancher 2.1的的应用商店做dashboard部署,目前为止商店上dashboard的版本还是0.6.8或者0.8, 所以我修改了镜像源为 v.10.0版本
按应用商店来搭建操作很简便,接下来只需要生成token:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubernetes-dashboard | awk '{print $1}')
ps:
#token无限过期时间,修改工作负载dahbord的 yaml文件的token-ttl - args: - --auto-generate-certificates - --token-ttl=0
3. Pipeline授权设置
3.1 相关配置
Rancher Pipeline配置的官方文档在此供参考:https://www.cnrancher.com/docs/rancher/v2.x/cn/tools/pipelines/configurations/
Gitlab版本需要在9以上,授权账号必须是项目的Maintainer(GitLab 8 里面是master),在GitLab中创建application,callbackurl在Rancher上复制。

配置完成后启用并显示仓库列表:

配置镜像仓库:

3.2 部署流水线配置
选择一个项目,点击“编辑配置”。

如下图,进入修改流水线配置的界面,可以选择对应的分支进行配置。
步骤1-Clone由Rancher自动写好;
步骤2、3、4修改自己配置,大家按需修改;
我配置的流程分别是2-build(maven构建),3-publish(打包镜像并推送私有镜像仓库),4-deploy(调用Rancher API,更新Pod镜像,完成项目自动部署)。

3.2.1 运行脚本的当前目录
在配置Rancher Pipeline的时候,我们会执行一些Linux命令,那么首先要搞清楚命令执行的当前目录的层级。
Rancher的Pipeline,运行起来后也是一个Pod,构建也是基于Jenkins。
在集群的Default目录下的工作负载,可以找到一个x-xxxx-pipeline的命名空间,其中有一个Jenkins的Pod,这个pod启用Pipeline功能后就会出现,一直存在。

当我们运行一个pipeline后,会生成一个jenkins-slave-xxxxx的pod,展开pod节点可查看pod的日志,也可以进入pod中执行命令,进去这个pod的控制台,执行
cd ./workspace/pipeline_p-cdk7j-13/
可以看到,pipeline第一步clone代码就是在该目录下进行的,这个也是我们在配置pipeline运行脚本的当前目录。

由于jenkins-slave-xxx这个pod是运行pipeline后动态创建的,属于用后即焚的模式,所以这个pod中拉下来的代码编译后的jar包或者前端dist目录静态文件,都要移动到将要打包的镜像目录中。
3.2.2 Build配置
那么知道了当前目录,就可以大胆的开始写配置了。
第一步 build,选择的类型是运行脚本,执行mvn clean package命令,选用的镜像是我自己打包maven3.6镜像。 如果公司有自己的maven私服,那么打包maven镜像的时候,可以设置好setting.xml文件,上传到前面配置的harbor仓库就可以了;如果是自己的demo项目,那么也可以换成公共的maven:latest;这种情况下也可以把setting.xml上传到代码根目录中,在复制出来放到maven中,适用于不想打包maven镜像,但又有公司私服的情况
mkdir -p /root/.m2 && mv setting.xml /root/.m2
值得注意的是公共的maven:latest镜像,其jdk环境是openjdk,一些老项目用openjdk可能会有一些奇奇怪怪的问题,无法通过mvn编译,我就遇到过项目中如果有图片验证码的时候,base64找不到jar包的情况,所以我才自己打包了个Oracle jdk的maven。
另外,mvn package 后面最好不要带 -U,带上会去检查依赖的版本是否最新,会很慢很慢的。
3.2.3 Publish配置
这一步主要是用build构建后的包,根据代码中的Dockerfile打包成镜像,当前目录依然是git clone后的目录,指定Dockerfile的相对位置,并命名打包后的惊醒名,其中镜像名中的:${CICD_EXECUTION_SEQUENCE}是rancher提供的变量,我用这个来区分镜像的版本,有好几个,具体大家输入后去选择,也可以查看官方的文档。

下面讲下dockerfile的配置:
一般的web后台项目,mvn编译后把jar包放到tomcat目录中,其中的base_image是cnetos7 + tomcat8 + oraclejdk8:

而springboot项目由于内置了tomcat,就直接复制出jar到镜像目录中,然后直接运行:

对于前端的vue项目,基础镜像用的是dockerhub上的公共nodejs镜像node:current-slim,同样先把代码复制出来,再npm install,最后npm start (npm run dev),我是直接去跑dev环境。
ps:如果是build出静态文件的,可以再打包个nginx镜像:

另外,对于vue项目用dev环境的,要开放host限制:
/build/webpack.dev.conf.js watchOptions: { poll: config.dev.poll, }, # 1.不检查host disableHostCheck: true /config/index.js proxyTable: { '/updance': { # 2.target指定为后台pod节点的ip+port target: 'http://192.168.242.83:32583', changeOrigin: true, pathRewrite: { '^/updance': '/updance' } } }, # 3.host设置为0.0.0.0 host: '0.0.0.0'
3.2.4 Deploy配置
最后一步,调用Rancher的API更新pod节点,这里基础镜像选什么都可以了,因为不需要依赖镜像:
curl -k -u token-zcgsp:****************************************** \ -X PUT \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{"containers":[{"image":"harbor.bluemoon.com.cn/rancher/buying-center-parent:'${CICD_EXECUTION_SEQUENCE}'","name":"snc-backed"}]}' \ 'https://192.168.242.80/v3/project/c-zrq7x:p-kql7m/workloads/deployment:default:snc-backed'
Rancher的API再pod节点的更多选项查看


3.3 运行pipeline
配置完成后,相关的配置会生成一份 .rancher-pipeline.yml 文件,可以下载到本地,也可以上传到对应的代码分支。
执行之前要先创建号pod节点,后面最后一步的API修改才能成功执行。
执行过程可以实时观看运行日志, 各步骤成功执行就是绿色的,红色的话就是失败,最后查看pod节点,可以看到pod自动更新。

以上就是Rancher 2.1从集群搭建到Pipeline部署完成的完整的流程。
作者介绍:
许先学,Java开发工程师。
欢迎后续技术讨论 :906696264@qq.com
简书地址:https://www.jianshu.com/u/749dce579f00
拓展阅读
浙公网安备 33010602011771号