自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

GitLab CICD與Kubernetes實踐·部署Flask Web服務(wù)

系統(tǒng) Linux
通過Gitlab CI完成Flask web Service服務(wù)代碼風(fēng)格檢查、單元測試、打包、發(fā)布到k8s環(huán)境里面,同時我們會在.gitlab-ci.yml文件中配置基于分支branch和tag的匹配執(zhí)行相應(yīng)的操作任務(wù)。

[[413159]]

服務(wù)背景

通過Gitlab CI完成Flask web Service服務(wù)代碼風(fēng)格檢查、單元測試、打包、發(fā)布到k8s環(huán)境里面,同時我們會在.gitlab-ci.yml文件中配置基于分支branch和tag的匹配執(zhí)行相應(yīng)的操作任務(wù)。Flask web Service是一個帶有web登錄界面的測試代碼服務(wù),服務(wù)運行的端口為5000,下面是該服務(wù)構(gòu)建Docker鏡像的Dockerfile

  1. FROM python:3.4 
  2.  
  3. COPY . /skeleton 
  4. WORKDIR /skeleton 
  5. RUN pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com # 配置pip源,加速下載 
  6. EXPOSE 5000 
  7. ENTRYPOINT ["sh""scripts/dev.sh"

定義.gitlab-ci.yml

然后為項目準(zhǔn)備.gitlab-ci.yml文件,這個文件稍微有點長,可以通過👉遠(yuǎn)程調(diào)用模板庫的方式優(yōu)化配置,此處我們不在多說:

  1. stages: # 此處分為五個階段,按順序執(zhí)行對應(yīng)的環(huán)節(jié) 
  2.   - style 
  3.   - test 
  4.   - release 
  5.   - review 
  6.   - deploy 
  7.  
  8. pep8: # pep8是自定義命名的jobs 
  9.   image: python:2.7 # 指定下面script塊的指令在哪個鏡像運行的容器環(huán)境內(nèi)運行 
  10.   stage: style # 聲明該pep8的job是屬于哪個stage階段運行 
  11.   script: # 該階段執(zhí)行的操作,其實就像在terminal里面執(zhí)行命令一樣。 
  12.     - pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tox 
  13.     - tox -e pep8 # 使用tox命令進(jìn)行pep8代碼格式檢查規(guī)范性檢查,配置文件為當(dāng)前項目下的tox.ini 
  14.  
  15. unittest-py2.7: 
  16.   image: python:2.7 
  17.   stage: test 
  18.   script: 
  19.     - pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tox 
  20.     - tox -e py27 # 指定使用py27虛擬環(huán)境 
  21.  
  22. unittest-py3.4: 
  23.   image: python:3.4 
  24.   stage: test 
  25.   script: 
  26.     - pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tox 
  27.     - tox -e py34 # 指定使用py34虛擬環(huán)境 
  28.  
  29. buildimage: 
  30.   image: docker:latest # 該環(huán)節(jié)需要構(gòu)建鏡像,需要docker二進(jìn)制命令,所以指定一個docker鏡像 
  31.   variables: # 給buildimage這個job傳遞的變量 
  32.     DOCKER_DRIVER: overlay 
  33.     DOCKER_HOST: tcp://localhost:2375 # 與service指定容器通信 
  34.   services: 
  35.     - name: docker:17.03-dind 
  36.       command: 
  37.           - "--registry-mirror=https://*****.mirror.aliyuncs.com" # 配置鏡像加速,當(dāng)?shù)卿浰接戌R像倉庫的時候,如果倉庫的證書不受信任,可以在下方添加`--insecure-registry=*****`選項 
  38.   stage: release 
  39.   script: 
  40.     - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" ${CI_REGISTRY_REPO_URL} # 登錄私有或者共有鏡像倉庫 
  41.     - docker build -t "${CI_REGISTRY_IMAGE}:latest" -f ./Dockerfile . # 構(gòu)建鏡像 
  42.     - docker tag "${CI_REGISTRY_IMAGE}:latest" "${CI_REGISTRY_REPO_URL}/${CI_REGISTRY_NAMESPACE}/${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}" # 給鏡像打個推送到鏡像倉庫的地址 
  43.     - test ! -z "${CI_COMMIT_TAG}" && docker push "${CI_REGISTRY_REPO_URL}/${CI_REGISTRY_NAMESPACE}/${CI_REGISTRY_IMAGE}:latest" # 判斷CI_COMMIT_TAG是否存在 
  44.     - docker push "${CI_REGISTRY_REPO_URL}/${CI_REGISTRY_NAMESPACE}/${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}" # 推送到鏡像倉庫 
  45.  
  46. deploy_review: 
  47.   image: bitnami/kubectl # 該環(huán)節(jié)需要創(chuàng)建k8s資源,需要kubectl二進(jìn)制命令 
  48.   stage: review 
  49.   only
  50.     - branches # 該stage直對分支有效 
  51.   except
  52.     - tags # 創(chuàng)建tags該stage不被執(zhí)行 
  53.   environment: # 定義jobs將被部署在的環(huán)境,如果沒有將會被指定,keyword(name,url,kubernetes...) 
  54.     name: dev 
  55.     url: https://dev-gitlab-k8s-demo.*******.cn-beijing.alicontainer.com 
  56.     on_stop: stop_review # 定義stop的時候執(zhí)行的jobs 
  57.   script: 
  58.     - kubectl version 
  59.     - cd manifests/ 
  60.     - sed -i "s/__CI_ENVIRONMENT_SLUG__/${CI_ENVIRONMENT_SLUG}/" deployment.yaml ingress.yaml service.yaml 
  61.     - sed -i "s/__VERSION__/${CI_COMMIT_REF_NAME}/" deployment.yaml ingress.yaml service.yaml 
  62.     - | 
  63.       if kubectl apply -f deployment.yaml | grep -q unchanged; then 
  64.           echo "=> Patching deployment to force image update." 
  65.           kubectl patch -f deployment.yaml -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"ci-last-updated\":\"$(date +'%s')\"}}}}}" 
  66.       else 
  67.           echo "=> Deployment apply has changed the object, no need to force image update." 
  68.       fi 
  69.     - kubectl apply -f service.yaml || true 
  70.     - kubectl apply -f ingress.yaml 
  71.     - kubectl rollout status -f deployment.yaml 
  72.     - kubectl get all,ing -n devops 
  73.   when: manual 
  74.  
  75. stop_review: 
  76.   image: bitnami/kubectl 
  77.   stage: review 
  78.   variables: 
  79.     GIT_STRATEGY: none # 聲明此jobs不會再做代碼的check out 
  80.   when: manual # 手動觸發(fā)是否繼續(xù)執(zhí)行 
  81.   only
  82.     - branches 
  83.   except
  84.     - master # 除了master分支與tags的變化 
  85.     - tags 
  86.   environment: 
  87.     name: dev 
  88.     action: stop 
  89.   script: 
  90.     - kubectl version 
  91.     - kubectl delete ing -l ref=${CI_ENVIRONMENT_SLUG} 
  92.     - kubectl delete all -l ref=${CI_ENVIRONMENT_SLUG} 
  93.  
  94. deploy: 
  95.   image: bitnami/kubectl 
  96.   stage: deploy 
  97.   environment: 
  98.     name: live 
  99.     url: https://${$CI_ENVIRONMENT_SLUG}.****.cn-beijing.alicontainer.com # 服務(wù)的訪問域名 
  100.   only
  101.     - tags 
  102.   when: manual 
  103.   script: 
  104.     - kubectl version 
  105.     - cd manifests/ 
  106.     - sed -i "s/__CI_ENVIRONMENT_SLUG__/${CI_ENVIRONMENT_SLUG}/" deployment.yaml ingress.yaml service.yaml 
  107.     - sed -i "s/__VERSION__/${CI_COMMIT_REF_NAME}/" deployment.yaml ingress.yaml service.yaml 
  108.     - kubectl apply -f deployment.yaml service.yaml ingress.yaml 
  109.     - kubectl rollout status -f deployment.yaml 
  110.     - kubectl get all,ing -l ref=${CI_ENVIRONMENT_SLUG} 

上面便是運行Flask web service的Gitlab持續(xù)構(gòu)建持續(xù)部署的配置文件,配置文件中主要是.gitlab-ci.yaml的語法[1]到諸多的配置環(huán)境變量[2],需要仔細(xì)的閱讀和掌握才能很好的玩轉(zhuǎn)CI.

K8s資源對象聲明

正如上面看到的,k8s的資源定義文件在項目.gitlab-ci.yml同級目錄manifests內(nèi)

  1. 🐳 👉 ls 
  2. README.md       deployment.yaml ingress.yaml    service.yaml 

服務(wù)部署的配置文件deployment.yaml

  1. --- 
  2. apiVersion: apps/v1 
  3. kind: Deployment 
  4. metadata: 
  5.   name: gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__ 
  6.   namespace: devops 
  7.   labels: 
  8.     app: gitlab-k8s-demo 
  9.     ref: __CI_ENVIRONMENT_SLUG__ 
  10.     track: stable 
  11. spec: 
  12.   replicas: 2 
  13.   selector: 
  14.     matchLabels: 
  15.       app: gitlab-k8s-demo 
  16.       ref: __CI_ENVIRONMENT_SLUG__ 
  17.   template: 
  18.     metadata: 
  19.       labels: 
  20.         app: gitlab-k8s-demo 
  21.         ref: __CI_ENVIRONMENT_SLUG__ 
  22.         track: stable 
  23.     spec: 
  24.       imagePullSecrets: 
  25.         - name: myregistry 
  26.       containers: 
  27.       - name: app 
  28.         image: registry.cn-beijing.aliyuncs.com/*****/gitlab-ci-flaskapp-test:__VERSION__ # 前面是鏡像的地址 
  29.         imagePullPolicy: Always 
  30.         ports: 
  31.         - name: web 
  32.           protocol: TCP 
  33.           containerPort: 5000 # flask web service暴露的端口 
  34.         livenessProbe: 
  35.           httpGet: 
  36.             path: / 
  37.             port: 5000 
  38.           initialDelaySeconds: 3 
  39.           timeoutSeconds: 2 
  40.         readinessProbe: 
  41.           httpGet: 
  42.             path: / 
  43.             port: 5000 
  44.           initialDelaySeconds: 3 
  45.           timeoutSeconds: 2 

Flask web service暴露的svc資源對象聲明:

  1. apiVersion: v1 
  2. kind: Service 
  3. metadata: 
  4.   name: gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__ 
  5.   namespace: devops 
  6.   labels: 
  7.     app: gitlab-k8s-demo 
  8.     ref: __CI_ENVIRONMENT_SLUG__ 
  9.   annotations: 
  10.     prometheus.io/scrape: "true" 
  11.     prometheus.io/port: "5000" 
  12.     prometheus.io/scheme: "http" 
  13.     prometheus.io/path: "/" 
  14. spec: 
  15.   type: ClusterIP 
  16.   ports: 
  17.     - name: http-metrics 
  18.       port: 5000 
  19.       protocol: TCP 
  20.   selector: 
  21.     app: gitlab-k8s-demo 
  22.     ref: __CI_ENVIRONMENT_SLUG__ 

Flask web service暴露的外網(wǎng)訪問的資源對象ingress聲明:

  1. --- 
  2. apiVersion: extensions/v1beta1 
  3. kind: Ingress 
  4. metadata: 
  5.   name: gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__ 
  6.   namespace: devops 
  7.   labels: 
  8.     app: gitlab-k8s-demo 
  9.     ref: __CI_ENVIRONMENT_SLUG__ 
  10.   annotations: 
  11.     nginx.ingress.kubernetes.io/service-weight: '' 
  12. spec: 
  13.   rules: 
  14.   - host: __CI_ENVIRONMENT_SLUG__-gitlab-k8s-demo.****.cn-beijing.alicontainer.com 
  15.     http: 
  16.       paths: 
  17.       - path: / 
  18.         backend: 
  19.           serviceName: gitlab-k8s-demo-__CI_ENVIRONMENT_SLUG__ 
  20.           servicePort: 5000 

配置Runner環(huán)境變量

上面的.gitlab-ci.yml中引用的變量就是從這里配置的,變量分為項目變量,gitlab group級別的,具體按需使用

Gitlab平臺上配置Runner環(huán)境變量

配置完成之后就可以使用了。

查看效果

master分支變化

將代碼推送到master分支,gitlab會自動的創(chuàng)建一個pipeline交由gitlab runner,當(dāng)master分支發(fā)生變化時,CI的效果圖如下:

master分支變化時Gitlab CI Pipeline

切換到一個新的分支上feature-01上看下CI會執(zhí)行那些jobs,如下圖,可以在.gitlab-ci.yaml中通過only/except按需定義。

其他分支變化時Gitlab CI Pipeline

其他分支

在Review環(huán)節(jié)需要手動的觸發(fā),當(dāng)結(jié)果沒有問題之后,就可以手動觸發(fā)stop_review刪除部署測試服務(wù)

其他分支變化時包含deploy_review與stop_review

deploy_review

deploy_review任務(wù)執(zhí)行日志

stop_review

然后我們手動的觸發(fā)stop_review刪除剛才部署的已經(jīng)沒用的測試環(huán)境

stop_review執(zhí)行日志

創(chuàng)建Tags

  1. git tag v2.0 
  2. 🐳 👉 git push origin --tags                 
  3. Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 
  4. To http://code.*******.cn-beijing.alicontainer.com/root/flask-ci-demo.git 
  5.  * [new tag]         v2.0 -> v2.0 

當(dāng)推送一個新的tag到gitlab之后,就會觸發(fā)一個pipeline,匹配到那個tag的jobs

創(chuàng)建Tags后觸發(fā)的Gitlab CI Pipeline

這說明是一個比較穩(wěn)定的可以上線的版本了,

穩(wěn)定版本Tags后上線日志

查看一下創(chuàng)建的服務(wù)

查看服務(wù)的運行狀態(tài)

然后我們訪問一下服務(wù),查看是否可以正常使用

Flask web服務(wù)登錄后的界面

可以正常登錄并且顯示如下表示服務(wù)運行成功了,測試到這里,基本上通過實踐操作說清楚.gitlab-ci.yml里面配置的各項指令含義以及通過Gitlab CI pipeline進(jìn)行持續(xù)集成、持續(xù)部署、持續(xù)交付等實踐。如果有什么不清楚的,大家可以留言,我們一起交流學(xué)習(xí)。

參考資料

[1]gitlab-ci reference: https://docs.gitlab.com/ee/ci/yaml/README.html

[2]runner variables: https://docs.gitlab.com/ee/ci/variables/README.html

 

責(zé)任編輯:姜華 來源: 云原生生態(tài)圈
相關(guān)推薦

2011-06-02 10:25:10

Web服務(wù)器部署

2022-10-17 10:35:34

DevOpsCICD

2023-02-10 10:54:48

DevOpsCICD

2022-05-26 15:02:35

Docker容器云原生

2022-05-11 08:45:49

VaultGitlab加密

2019-08-09 10:58:48

2023-09-05 08:21:07

項目CICD場景

2022-10-19 13:11:35

2019-05-14 13:59:52

Flask服務(wù)器部署

2024-05-30 14:18:04

2022-07-13 15:43:02

Docker后端api

2021-12-14 06:59:39

微服務(wù)Kubernetes架構(gòu)

2020-03-16 08:48:18

Kubernetes容器云原生

2021-07-07 10:21:26

技術(shù)

2012-12-24 09:55:15

JavaJava WebJava優(yōu)化

2018-07-18 09:45:09

云服務(wù)Kubernetes實踐

2019-07-30 10:33:01

2018-10-17 10:49:49

Kubernetes存儲處理

2025-03-07 10:23:46

2021-07-19 06:02:56

DockerGitLab 14.0開源
點贊
收藏

51CTO技術(shù)棧公眾號