Rancher2.1從搭建叢集到pipeline部署專案

暱稱不能是叉叉叉發表於2019-03-04

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

以上就是一個完整的流程,溜了溜了,玩奧德賽去。。

相關文章