基於容器和K8s的 Devops 探索和落地實踐

2022-01-09 22:19:52 字數 4157 閱讀 6979

長話短說,本文全景呈現我司專案組gitlab flow && devops

現代devops技術基於容器技術自動化指令碼實現了依賴環境的打包、版本管理、敏捷部署。

為在迭代便利性、部署嚴謹性上取得平衡,專案組設計了如下gitlab flow & devops流程。

乙個完整的功能迭代上線週期:

這裡為什麼保留master分支, 是因為理論上當feature分支合併回develop分支,develop已經被汙染了,這裡保留master只為兜底。

後續就是開始新的sprint週期了,git release分支名/tag標籤名跟隨迭代。

整個過程貫徹了git flow 預發布分支release,hotfix的核心用法, 同時在部署方式上也有一定的改進。

針對分支的持續自動部署,本來嘗試使用分支名作為映象名,實際上git分支不像git tag, git 分支的**是會變動的,所以這裡我使用了乙個騷操作:

找到此次分支提交的快照(commit_id),打出'branchname: '這樣的映象tag,該帶字尾的映象tag定位了此次**快照!

整合測試採用docker-compose部署; alpha,prod是採用k8s部署

alpha,prod是不同的機器環境,在不同環境下編寫部署合適的指令碼,ssh遠端登入機器後,執行放置的部署指令碼

stages:

- build

- build_image

- deploy

build:

stage: build

script:

- pwd

tags:

- my-tag

build_image:eapwebsite:

stage: build_image

script:

- if [ $ci_commit_ref_name != "$ci_commit_tag" ]; then ci_commit_ref_name=$ci_commit_branch.$ci_commit_short_sha; fi; # 如果不是正常的git tag,則騷操作定義映象tag

- docker login $docker_registry_host -u $ci_registry_user -p $ci_registry_password

- docker push $docker_registry_host/eap/website:$ci_commit_ref_name

tags:

- my-tag

only:

- tags

- develop

- master

- /^release-.*$/i # 針對git tag 和git branch打出映象

deploy:intergate-test:

stage: deploy

script:

- if [ $ci_commit_ref_name != "$ci_commit_tag" ]; then ci_commit_ref_name=$ci_commit_branch.$ci_commit_short_sha; fi; # 如果不是正常的git tag,則騷操作定義映象tag

- echo $ci_commit_ref_name

- ssh -t [email protected] "cd /home/eap/website && export tag=$ci_commit_ref_name && docker-compose pull website && docker-compose -f docker-compose.yml up -d"

dependencies:

- build_image:eapwebsite

tags:

- my-tag

only:

- develop # develop分支,自動部署到整合測試環境

deploy:alpha:

stage: deploy

script:

- if [ $ci_commit_ref_name != "$ci_commit_tag" ]; then ci_commit_ref_name=$ci_commit_branch.$ci_commit_short_sha; fi; # 如果不是正常的git tag,則騷操作定義映象tag

- echo $ci_commit_ref_name

- ssh -t [email protected] "export tag=$ci_deploy_imagetag && ./eapwebsite_cd.sh"

dependencies:

- build_image:eapwebsite

tags:

- my-tag

only:

- /^release-.*$/i # release-1.0.0分支,自動部署到alpha測試環境

deploy:prod:

stage: deploy

script:

- if [ $ci_commit_ref_name != "$ci_commit_tag" ]; then ci_commit_ref_name=$ci_commit_branch.$ci_commit_short_sha; fi; # 如果不是正常的git tag,則騷操作定義映象tag

- echo $ci_commit_ref_name

- ssh -t [email protected] "export tag=$ci_commit_ref_name && ./eapwebsite_cd.sh"

dependencies:

- build_image:eapwebsite

tags:

- my-tag

only:

- tags

when: manual # prod環境,人工點選部署

使用ssh遠端部署,請參閱

基於docoer-compose完成的gitlab-ci,請參閱

如果是對git分支試圖製作映象,既要保留分支名稱,又要保留本次提交動作的快照,

我們嘗試使用分支名和commitid共同作為映象tag,

於是修改ci_commit_ref_name=$ci_commit_branch.$ci_commit_short_sha, 在每個job上作為映象tag,

後續部署的job從build.env讀取映象tag

ssh遠端登入之後,進入的是wd-deploy的主目錄,執行此處放置的部署指令碼。

自動部署利用的是原生的kustomize命令,

#!/bin/sh

cd /home/wd-deploy/localdeploy/wd/overlays/

kustomize edit set image repository.gridsum.com:8443/eap/website=repository.gridsum.com:8443/eap/website:$

kustomize edit set image可即時修改kustomization.yml檔案內容,修改之後再應用,起到了部署的效果!

以上是乙個完整的【整合測試環境----> 針對release分支打包映象到alpha環境(有騷操作)---> 針對生產自動部署tag】的devops流程, 有效實用!。

看官如有細節問題,歡迎垂詢!

k8s 容器鉤子

有兩個鉤子暴露在容器中 poststart 這個鉤子在建立容器之後立即執行。但是,不能保證鉤子會在容器入口點之前執行。沒有引數傳遞給處理程式。kind deployment metadata name testlifecycle labels spec replicas 1 selector mat...

k8s的 容器映象

my registry.example.com 5000 example web example v1.0.1 2.綠色部分 registry 埠 3.紫色部分 repository 名字 4.紅色部分 image 名字 5.棕色部分 image 標籤 更新映象 如果您期望每次啟動 pod 時,都強...

容器編排工具k8s

如何實踐 1 搜尋kubunetes online kubernetes playground katacoda pod k8s最小排程單位 docker pause 二個容器 deployments 維持pod一定數量 service 解決deploytemnets內部之間的乙個負載均衡 dns解...