K8s微服務自動化部署容器(Rancher流水線)

1、背景

最近公司上線辦公網零信任安全網關係統,由我負責部署上線,在部署的時候同時也在想如何保障穩定性,以及後續部署的簡便性;python

想起了k8s微服務的成熟方案,不只能夠自動重啓還能夠監控容器運行狀態,也能夠集成自動化部署,因而找了一些資料將以前接觸過的rancher用了起來,首先要作的就是簡化安裝方式,下面是個人一些過程,同時也能夠給你們提供參考。git

2、操做步驟

  1. 讓Rancher能訪問GitLab
  2. 在流水線添加項目
  3. 在倉庫添加必備文件
  4. CICD自動部署調試

3、gitlab添加oauth受權

在進入集羣的命名空間中,能夠在菜單欄點擊工具-流水線,而後就能夠看到以下圖所示的界面

接下來打開gitlab,而後打開設置頁面http://xx.xx.xx.xx/admin/applications/4,以下圖所示golang

在上圖中將所需信息填寫進去,而後點擊保存docker

保存以後,gitlab會生成Application IdSecret,咱們將它複製出來,
shell

複製出來以後,切回rancher系統中,將其一一填寫進來,以下圖所示api

點擊完成後,會有一個彈窗進行受權,受權完成後rancher就能夠訪問到gitlab倉庫了。
安全

4、在rancher中添加代碼倉庫

在確保rancher能夠訪問gitlab倉庫以後,在rancher菜單欄點擊工具-流水線,將須要自動化部署的項目啓用並保存,以下圖所示微信

保存以後,回到CICD列表中,能夠看到兩個已經啓用的項目,以下圖所示
app

5、添加部署必備個文件

接下來就能夠開始在代碼中啓用CICD自動化部署了,須要在項目根目錄添加三個文件,分別是:微服務

  1. .rancher-pipeline.yml
  2. Dockerfile
  3. deployment.yaml

5.1 設置發佈流程

自動部署首先須要肯定部署流程,主要用到文件.rancher-pipeline.yml,這裏我是golang 的項目,使用了三個流程。

首先編譯項目;接着構建鏡像推送到rancher的鏡像倉庫中,最後使用容器編排文件發佈項目,配置代碼核心關注點以下圖紅色區域所示

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 構建鏡像

在上一步中已經將項目編譯好,接着就須要將編譯好的可執行文件放入到鏡像中,這裏起做用的主要是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 容器編排

上一步已經將須要運行的鏡像推送到rancher的鏡像倉庫以後,接下來就須要構建pod來運行容器,這裏發揮做用的主要是deployment.yaml 文件。

這個文件若是沒有接觸過k8s的同窗可能會比較陌生,這裏我將每一行都寫了註釋,並將須要修改的地方用紅色標記圈出來了,以下圖所示

參考配置以下所示

kind: Service      # 指定建立資源的角色/類型
apiVersion: v1     # 指定api版本,此值必須在kubectl api-versions中
metadata:          # 資源的元數據/屬性
  name: funfe-center    # 資源的名字,在同一個namespace中必須惟一
spec:               # 資源規範字段
  selector:         # 選擇器
    app: center
  type: NodePort    # 端口類型
  ports:
    - protocol: TCP     # 協議
      port: 80          # service 端口
      targetPort: 80    # 容器暴露的端口
---
apiVersion: apps/v1   # 指定api版本,此值必須在kubectl api-versions中
kind: Deployment      # 指定建立資源的角色/類型
metadata:             # 資源的元數據/屬性
  name: funfe-center    # 資源的名字,在同一個namespace中必須惟一
  namespace: default    # 資源的名字,在同一個namespace中必須惟一
spec:                 # 資源規範字段
  replicas: 1         # 聲明副本數目
  selector: # 選擇器
    matchLabels: # 匹配標籤
      app: center
  template:           # 模版
    metadata: # 資源的元數據/屬性
      labels: # 設定資源的標籤
        app: center
    spec:             # 資源規範字段
      imagePullSecrets:                    # 鏡像倉庫拉取密鑰
        - name: pipeline-docker-registry
      containers:
        - name: funfe                  # 容器的名字
          image: ${CICD_IMAGE}:${CICD_EXECUTION_SEQUENCE}   # 容器使用的鏡像地址
          ports:
            - containerPort: 80               # 容器開發對外的端口

6、修改代碼自動部署

修改代碼後會自動執行編譯、推送到鏡像庫、拉取代碼部署

如今我修改代碼倉庫的代碼,回到rancher流水線中,就看到有一個任務在執行自動部署流程,以下圖所示

執行完成周,回到集羣的工做負載當中,就能夠看到已經有一個服務自動化部署到K8s中


日期:2021-03-04

做者:湯青松

微信:songboy8888

相關文章
相關標籤/搜索