k8s灰度更新 k8s實現灰度發布

2021-10-13 09:39:05 字數 3785 閱讀 8460

灰度發布在實際生產部署中是經常被使用的方式,常規的方法是手動從前端lb(負載均衡)上將後端伺服器摘掉,然後,停服務,最後上傳**,完成軟連線更新。在使用ci/cd工具時,這個過程變得自動化了,我們只需要通過jenkins這個功能強大的開源持續整合和部署工具,就可以聯合gitlab 或 gogs 來實現自動拉取**,並根據自己編寫的pipeline指令碼,實現自動連線到lb上摘掉後端server,並自動連線到後端server上,上傳**,並重啟服務,最後通過郵件通知管理員整個過程的結果報告。但今天,k8s的更讓我們看到了一種更便捷高效的灰度發布的實現方法,下面就來說說:

由於本人能力有限,對k8s的理解尚淺,原理部分在後續研究透徹後,在來詳細說明,本編僅供初學者參考

首先需要製作此次實驗的基礎映象:

1. dockerfile的編寫:

mkdir dockerfile && cd dockerfile

vim dockerfile    #注意: dockerfile的檔名首字母要大寫

from alpine:latest

maintainer "zcf "

env ngx_doc_root="/var/lib/nginx/html" hostname="" ip="" port="" index_page=""

run apk --no-cache add nginx && mkdir -p $/shop /run/nginx

copy chk.html   $

copy entrypoint.sh /bin

cmd ["/usr/sbin/nginx","-g","daemon off;"] #定義啟動nginx服務為前端啟動, -g:是global段,中修改daemon off;

entrypoint ["/bin/entrypoint.sh"] #將cmd的命令,作為引數傳遞給/bin/entrypoint.sh 指令碼.

#準備dockerfile配套的基礎檔案:

1) 啟動容器時,執行的指令碼檔案: entrypoint.sh

vim entrypoint.sh

#!/bin/sh

echo "

" > $/index.html

cat > /etc/nginx/conf.d/default.conf <

server ;

listen $:$;

root $;

location / index.html index.htm;

location = /404.html {

internal;

eofexec "$@"      #它就是來接受cmd傳入的引數的.

2 ) 給entrypoint.sh 新增執行許可權

chown +x entrypoint.sh

3) 後期做健康檢查時,使用的html檔案:

echo ok > chk.html

2. 開始製作docker映象檔案:

3. 將製作好的映象檔案,打上標籤,並上傳到harbor上。

docker login harbor.zcf.com -u admin -p 123456      #登入harbor

4. 為了方便延時恢**布的效果,我們還需要在製作乙個映象

# 因此,這裡我可以直接給容器傳遞這個變數,來實現修改nginx首頁的效果.

docker commit --pause ngx1      #將ngx1暫停,並將當前容器狀態,匯出為乙個新映象。

docker kill ngx1 && docker rm -fv ngx1  #製作完映象,就直接刪除測試ngx1容器.

[email protected]:~# docker images

repository tag image id created size

85355d4af36c 6 seconds ago 7.02mb    #這個就上剛製作的新映象.

#測試執行映象,若沒有問題,就可以上傳到本地harbor上了。

測試映象是否修改了nginx的首頁為you_info的內容.

docker kill ngx1      #刪除ngx1容器.

#先建立三個pod,乙個client,兩個nginx

#1. 先建立 client

kubectl get pods -o wide      #檢視pod的建立詳情.

#2. 建立nginx

kubectl get deployment -w      #watch著監控k8s幫我們建立2個pod的過程.

kubectl get pod -o wide

#3. 登入client,測試訪問nginx

/ #    #說明: 若你的kube-dns沒有部署成功,這裡的nginx可換成service的ip.

/ #    #   kubectl get svc |grep nginx    #這個就是nginx的service的集群ip.

#4. 以上測試可看到,已經能夠實現負載均衡的效果了。

接著,開始進行灰度發布測試

kubectl set image --help

#上面執行命令時,就可以看著,另乙個終端中client的訪問變化情況,你可以發現,訪問逐漸從 v1 變成 diy-helloworld-v2了。

#5.測試動態調整nginx pod的數量

kubectl scale --replicas=5 deployment nginx    #修改nginx的pod副本數量為5個.

kubectl get pods

#接著在到client所在的終端上,檢視變化,你會發現,主機名和ip部分開始有更多變化了。

#6. 檢視nginx映象公升級狀態,是否成功

kubectl rollout status deployment nginx

kubectl describe pods nginx-***-xx

kubectl rollout undo --help

kubectl rollout undo deployment nginx

6. 測試k8s集群外部訪問nginx

#type: clusterip 把它修改為 type:nodeport

#檢視svc的更新資訊:

kubectl get svc #這裡就可以看到,myap service的埠將動態增加乙個. 如:80:30020/tcp,注意:30020是隨機分配的。

#它的範圍是,你在使用kubeasz部署時,設定 node_port_range="30000-60000"中隨機選的.

http://master或node的物理ip:30020/

#好了,以上測試結果,我就不截圖了,想看到結果的道友們要多多動手測試,然後多多總結,多多思考,就可以看到,並且明白了。

原文:

K8s部署prometheus監控K8s細節

prometheus 一些配置檔案可以再github上找到。部署 root kube prometheus manifests 目錄下所有檔案 部署 root kube prometheus manifests setup 目錄下所有檔案 要注意的是自己要建立乙個工作空間 如果報錯執行下面語句 部署...

k8s 多租戶 k8s 基礎介紹

備註 1 每乙個pod裡執行著乙個特殊的容器 pause容器,其他容器都是業務容器,這些業務容器共享pause容器的網路棧和volume 邏輯卷 掛載卷。因此他們之間的通訊和資料交換更為高效。2 k8s設計了pod物件,將每個服務程序包裝到相應的pod中,使其成為pod中執行的乙個容器 contai...

k8s集群部署 docker部署k8s安裝篇

1 安裝docker 緊接著配置乙個穩定 stable 的倉庫 倉庫配置會儲存到 etc yum.repos.d docker ce.repo檔案中 yum config manager add repo 更新yum安裝的相關docke軟體包 安裝docker ce yum update y yum...