Rancher2.1从搭建集群到pipeline部署项目

8,055 阅读6分钟

rancher2.1

rancher 容器管理平台 在生产环境中轻松快捷的部署和管理容器 管理K8s 内置CI/CD 快速搭建 导入和纳管 集中式身份

1. 搭建rancher server

  • 安装Rancher 2.0

基础环境配置及安装文档

按照上面的文档进行配置和安装,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 8888:80 -p 8443:443 rancher/rancher

同机子 端口冲突
IP 角色
192.168.242.80 rancher server
192.168.242.81 master1
192.168.242.82 master2
192.168.242.83 node1
192.168.242.84 node2

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

添加集群

  • rke && import && vsphere

2. rancher2.0中K8s Dashbord的安装

rancher2.0 和之前不一样的地方之一就是没有原生Dashboard,需要我们手动安装。

手动安装Dashbord之前需要安装好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 文件有没有从集群复制过来
    
    

    kubeconfig

  • 手动安装Dashbord目前我尝试过两种方法,下面分别进行介绍。

  • 方法1:

使用github上的教程手动安装

Deploy kubernetes-dashboard on Rancher 2.0 cluster exposed using NodePort

其中Step1是安装和验证kubectl。Step2部署dashbord,如果不能翻墙获取不到dashbord镜像。 可以修改其中yaml文件的镜像源,这里提供一个其他人上传的源

siriuszg/kubernetes-dashboard-amd64:v1.10.0

或者直接使用这份写好的

kubectl apply -f https://raw.githubusercontent.com/usernamecantbeXXX/kubernetes-dashboard/master/kubernetes-dashboard.yaml

然后再Step4处,注意dashbord.yml中name是admin-user,后面生成token的describe secret的命令也需要写上对应的名字。

  • 方法2:

使用rancher2.1的的应用商店做dashbord部署,到目前(18/11/13)商店上dashbord的版本还是0.6.8或者0.8, 所以我修改了镜像源为 v.10.0版本

dashbord

按应用商店来搭建操作很简便,接下来只需要生成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

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1wbHNxdiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImY4ZjhiODBmLWUzMzMtMTFlOC1iZjgwLTAwNTA1NmExZWEyMyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.a6UIUisGF9bsQ9Od3DVP0CyeZBoSQ_sO64LrEc9GYfBpcRCRpoXDDqOGGgJb54mu0hNkykCKUdY1dqJHDIjebrsKUKfno-yFR9JXhUItPQrUT6zhHeEzWGjaywe0dGoPdBNcU6C98FHSgWMo1PmTGxXX2odm1fwpSvLLqADmfc8MQEbPbB58B1Z6e0SyNXx6i6hIT6bSqtWznqmzsRWJHnOxHkwaCTNRwm1G1QkrEcC0l2sChWsnkEDvTR2gCRRa5pU0vqBwBRxq6z2h5shRZt0pgiQ_pV1hWcif1nNCnN4iZr2eEkSOpPec5WMwCJ62otBNHBsSRn9JcsRel2rb-A

3. Pipeline授权设置

3.1 相关配置

Configuring Pipelines

Gitlab版本需要在9以上,授权账号必须是项目的Maintainer(gitlab 8 里面是master),在gitlab中创建application,callbackurl在rancher上复制

gitlab application

gitlab rancher

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

repos

配置镜像仓库

harbor rancher

3.2 部署流水线配置

选择一个项目,点击 编辑配置

clk edit config

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

rp config

3.2.1 运行脚本的当前目录

在配置rancher pipeline的时候,我们会执行一些linux命令,那么首先要搞清楚,命令执行的当前目录的层级。

rancher的pipeline,运行起来后也是一个Pod,构建也是基于Jenkins。

在集群的Default目录下的工作负载,可以找到一个x-xxxx-pipeline的命名空间,其中有一个jenkins的Pod,这个pod启用pipeline功能后就会出现,一直存在。

jenkins slave pod

当我们运行一个pipeline后,会生成一个jenkins-slave-xxxxx的pod,展开pod节点可查看pod的日志,也可以进入pod中执行命令,进去这个pod的控制台,执行

cd  ./workspace/pipeline_p-cdk7j-13/

可以看到,pipeline第一步clone代码就是在该目录下进行的,这个也是我们在配置pipeline运行脚本的当前目录。

jenkins slave pod

jenkins slave pod

由于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,带上会去检查依赖的版本是否最新,会很慢很慢的。

build

3.2.3 publish配置

这一步主要是用build构建后的包,根据代码中的Dockerfile打包成镜像,当前目录依然是git clone后的目录,指定Dockerfile的相对位置,并命名打包后的惊醒名,其中镜像名中的:${CICD_EXECUTION_SEQUENCE}是rancher提供的变量,我用这个来区分镜像的版本,有好几个,具体大家输入后去选择,也可以查看官方的文档。

publish

下面讲下dockerfile的配置:

一般的web后台项目,mvn编译后把jar包放到tomcat目录中,其中的base_image是cnetos7+ tomcat8+oraclejdk8

tomcat

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

spring_boot

对于前端的vue项目,基础镜像用的是dockerhub上的公共nodejs镜像node:current-slim,同样先把代码复制出来,再npm install,最后npm start(npm run dev),我是直接去跑dev环境。

ps:如果是build出静态文件的可以再打包个nginx镜像

vue

另外,对于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节点,这里基础镜像选什么都可以了,因为不需要依赖镜像

deploy

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节点的更多选项查看

image
image

3.3 运行pipeline

配置完成后,相关的配置会生成一份 .rancher-pipeline.yml 文件,可以下载到本地,也可以上传到对应的代码分支。

执行之前要先创建号pod节点,后面最后一步的API修改才能成功执行

执行过程可以实时观看运行日志, 各步骤成功执行就是绿色的,红色的话就是失败,最后查看pod节点,可以看到pod自动更新。

logs

以上就是一个完整的流程,溜了溜了,玩奥德赛去。。