K8s 微服務(wù)自動化部署容器(Rancher 流水線)
一、背景
最近公司上線辦公網(wǎng)零信任安全網(wǎng)關(guān)系統(tǒng),由我負責部署上線,在部署的時候同時也在想如何保障穩(wěn)定性,以及后續(xù)部署的簡便性;
想起了 k8s 微服務(wù)的成熟方案,不僅可以自動重啟還可以監(jiān)控容器運行狀態(tài),也可以集成自動化部署,于是找了一些資料將之前接觸過的 rancher 用了起來,首先要做的就是簡化安裝方式,下面是我的一些過程,同時也可以給大家提供參考。
二、操作步驟
讓Rancher能訪問GitLab
在流水線添加項目
在倉庫添加必備文件
CICD自動部署調(diào)試
三、gitlab添加oauth授權(quán)
在進入集群的命名空間中,可以在菜單欄點擊工具-流水線,然后就可以看到如下圖所示的界面

接下來打開gitlab,然后打開設(shè)置頁面:
http://xx.xx.xx.xx/admin/applications/4
如下圖所示

在上圖中將所需信息填寫進去,然后點擊保存
保存之后,gitlab會生成Application Id和Secret,我們將它復制出來

復制出來之后,切回rancher系統(tǒng)中,將其一一填寫進來,如下圖所示

點擊完成后,會有一個彈窗進行授權(quán),授權(quán)完成后rancher就可以訪問到gitlab倉庫了。

四、在rancher中添加代碼倉庫
在確保rancher可以訪問gitlab倉庫之后,在rancher菜單欄點擊工具-流水線,將需要自動化部署的項目啟用并保存,如下圖所示

保存之后,回到CICD列表中,可以看到兩個已經(jīng)啟用的項目,如下圖所示

五、添加部署必備個文件
接下來就可以開始在代碼中啟用CICD自動化部署了,需要在項目根目錄添加三個文件,分別是:
.rancher-pipeline.yml
Dockerfile
deployment.yaml
5.1 設(shè)置發(fā)布流程
自動部署首先需要確定部署流程,主要用到文件.rancher-pipeline.yml,這里我是golang 的項目,使用了三個流程。
首先編譯項目;接著構(gòu)建鏡像推送到rancher的鏡像倉庫中,最后使用容器編排文件發(fā)布項目,配置代碼核心關(guān)注點如下圖紅色區(qū)域所示

stages:
- name: Build
steps:
- runScriptConfig:
image: golang:1.16
shellScript: |-
go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct
go mod tidy
pwd
go build -o ./bin/funfecenter
- name: Publish
steps:
- publishImageConfig:
dockerfilePath: ./Dockerfile
buildContext: .
tag: funfecenter:${CICD_EXECUTION_SEQUENCE}
- name: Deploy
steps:
- applyYamlConfig:
path: ./deployment.yaml
timeout: 60
notification: {}
5.2 構(gòu)建鏡像
在上一步中已經(jīng)將項目編譯好,接著就需要將編譯好的可執(zhí)行文件放入到鏡像中,這里起作用的主要是Dockerfile文件,配置代碼比較簡單,如下所示
FROM golang:1.16
EXPOSE 1333
COPY ./bin/funfecenter /data/funfecenter/center
COPY ./init/ /
COPY script.py /root/
RUN apt update -y
RUN apt install -y python3
#CMD ["python3","/root/script.py"]
CMD ["/data/funfecenter/center"]
5.3 容器編排
上一步已經(jīng)將需要運行的鏡像推送到rancher的鏡像倉庫之后,接下來就需要構(gòu)建pod來運行容器,這里發(fā)揮作用的主要是deployment.yaml 文件。
這個文件如果沒有接觸過k8s的同學可能會比較陌生,這里我將每一行都寫了注釋,并將需要修改的地方用紅色標記圈出來了,如下圖所示

參考配置如下所示
kind: Service # 指定創(chuàng)建資源的角色/類型
apiVersion: v1 # 指定api版本,此值必須在kubectl api-versions中
metadata: # 資源的元數(shù)據(jù)/屬性
name: funfe-center # 資源的名字,在同一個namespace中必須唯一
spec: # 資源規(guī)范字段
selector: # 選擇器
app: center
type: NodePort # 端口類型
ports:
- protocol: TCP # 協(xié)議
port: 80 # service 端口
targetPort: 80 # 容器暴露的端口
---
apiVersion: apps/v1 # 指定api版本,此值必須在kubectl api-versions中
kind: Deployment # 指定創(chuàng)建資源的角色/類型
metadata: # 資源的元數(shù)據(jù)/屬性
name: funfe-center # 資源的名字,在同一個namespace中必須唯一
namespace: default # 資源的名字,在同一個namespace中必須唯一
spec: # 資源規(guī)范字段
replicas: 1 # 聲明副本數(shù)目
selector: # 選擇器
matchLabels: # 匹配標簽
app: center
template: # 模版
metadata: # 資源的元數(shù)據(jù)/屬性
labels: # 設(shè)定資源的標簽
app: center
spec: # 資源規(guī)范字段
imagePullSecrets: # 鏡像倉庫拉取密鑰
- name: pipeline-docker-registry
containers:
- name: funfe # 容器的名字
image: ${CICD_IMAGE}:${CICD_EXECUTION_SEQUENCE} # 容器使用的鏡像地址
ports:
- containerPort: 80 # 容器開發(fā)對外的端口
六、修改代碼自動部署
修改代碼后會自動執(zhí)行編譯、推送到鏡像庫、拉取代碼部署
現(xiàn)在我修改代碼倉庫的代碼,回到rancher流水線中,就看到有一個任務(wù)在執(zhí)行自動部署流程,如下圖所示

執(zhí)行完成周,回到集群的工作負載當中,就可以看到已經(jīng)有一個服務(wù)自動化部署到K8s中


