成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

GitLab CICD與Kubernetes實踐·部署Flask Web服務

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

[[413159]]

服務背景

通過Gitlab CI完成Flask web Service服務代碼風格檢查、單元測試、打包、發布到k8s環境里面,同時我們會在.gitlab-ci.yml文件中配置基于分支branch和tag的匹配執行相應的操作任務。Flask web Service是一個帶有web登錄界面的測試代碼服務,服務運行的端口為5000,下面是該服務構建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

然后為項目準備.gitlab-ci.yml文件,這個文件稍微有點長,可以通過👉遠程調用模板庫的方式優化配置,此處我們不在多說:

  1. stages: # 此處分為五個階段,按順序執行對應的環節 
  2.   - style 
  3.   - test 
  4.   - release 
  5.   - review 
  6.   - deploy 
  7.  
  8. pep8: # pep8是自定義命名的jobs 
  9.   image: python:2.7 # 指定下面script塊的指令在哪個鏡像運行的容器環境內運行 
  10.   stage: style # 聲明該pep8的job是屬于哪個stage階段運行 
  11.   script: # 該階段執行的操作,其實就像在terminal里面執行命令一樣。 
  12.     - pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tox 
  13.     - tox -e pep8 # 使用tox命令進行pep8代碼格式檢查規范性檢查,配置文件為當前項目下的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虛擬環境 
  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虛擬環境 
  28.  
  29. buildimage: 
  30.   image: docker:latest # 該環節需要構建鏡像,需要docker二進制命令,所以指定一個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" # 配置鏡像加速,當登錄私有鏡像倉庫的時候,如果倉庫的證書不受信任,可以在下方添加`--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 . # 構建鏡像 
  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 # 該環節需要創建k8s資源,需要kubectl二進制命令 
  48.   stage: review 
  49.   only
  50.     - branches # 該stage直對分支有效 
  51.   except
  52.     - tags # 創建tags該stage不被執行 
  53.   environment: # 定義jobs將被部署在的環境,如果沒有將會被指定,keyword(name,url,kubernetes...) 
  54.     name: dev 
  55.     url: https://dev-gitlab-k8s-demo.*******.cn-beijing.alicontainer.com 
  56.     on_stop: stop_review # 定義stop的時候執行的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 # 手動觸發是否繼續執行 
  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 # 服務的訪問域名 
  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持續構建持續部署的配置文件,配置文件中主要是.gitlab-ci.yaml的語法[1]到諸多的配置環境變量[2],需要仔細的閱讀和掌握才能很好的玩轉CI.

K8s資源對象聲明

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

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

服務部署的配置文件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暴露的外網訪問的資源對象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環境變量

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

Gitlab平臺上配置Runner環境變量

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

查看效果

master分支變化

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

master分支變化時Gitlab CI Pipeline

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

其他分支變化時Gitlab CI Pipeline

其他分支

在Review環節需要手動的觸發,當結果沒有問題之后,就可以手動觸發stop_review刪除部署測試服務

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

deploy_review

deploy_review任務執行日志

stop_review

然后我們手動的觸發stop_review刪除剛才部署的已經沒用的測試環境

stop_review執行日志

創建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 

當推送一個新的tag到gitlab之后,就會觸發一個pipeline,匹配到那個tag的jobs

創建Tags后觸發的Gitlab CI Pipeline

這說明是一個比較穩定的可以上線的版本了,

穩定版本Tags后上線日志

查看一下創建的服務

查看服務的運行狀態

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

Flask web服務登錄后的界面

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

參考資料

[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

 

責任編輯:姜華 來源: 云原生生態圈
相關推薦

2011-06-02 10:25:10

Web服務器部署

2022-10-17 10:35:34

DevOpsCICD

2023-02-10 10:54:48

DevOpsCICD

2022-05-26 15:02:35

Docker容器云原生

2019-08-09 10:58:48

2022-05-11 08:45:49

VaultGitlab加密

2023-09-05 08:21:07

項目CICD場景

2022-10-19 13:11:35

2019-05-14 13:59:52

Flask服務器部署

2024-05-30 14:18:04

2022-07-13 15:43:02

Docker后端api

2021-12-14 06:59:39

微服務Kubernetes架構

2012-12-24 09:55:15

JavaJava WebJava優化

2021-07-07 10:21:26

技術

2020-03-16 08:48:18

Kubernetes容器云原生

2018-07-18 09:45:09

云服務Kubernetes實踐

2018-10-17 10:49:49

Kubernetes存儲處理

2025-03-07 10:23:46

2025-06-09 07:30:00

Kubernetes節點自動伸縮集群

2021-07-19 06:02:56

DockerGitLab 14.0開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩at| 欧美成人高清视频 | 日韩精品成人一区二区三区视频 | 一级片在线免费播放 | 91精品国产综合久久婷婷香蕉 | 国产一区高清 | 免费在线成人 | av超碰 | 国产精品久久一区二区三区 | 99久久精品一区二区毛片吞精 | 欧美日韩不卡合集视频 | 337p日本欧洲亚洲大胆 | 日韩一区二区三区在线 | 一区二区三区免费在线观看 | 美女露尿口视频 | 午夜精品久久久久久久久久久久 | 国产欧美日韩在线观看 | 国产精品久久777777 | 成人欧美一区二区三区黑人孕妇 | 亚洲国产成人久久综合一区,久久久国产99 | 久久一区二区视频 | a在线免费观看 | 亚洲bt 欧美bt 日本bt | 成人免费视频在线观看 | 日本亚洲欧美 | 啪啪av | 日韩三级电影在线看 | 中国免费黄色片 | 国产精品视频一区二区三区, | www国产成人免费观看视频,深夜成人网 | 婷婷久久综合 | 免费日本视频 | 天天综合网7799精品 | 欧美自拍视频 | 五月激情综合 | 国产高清在线精品一区二区三区 | 亚洲在线| 午夜婷婷激情 | 伊人久久成人 | 一区二区三区视频 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 |