coveragepy-k8s
隨著目前k8s的使用越來越廣泛蚓让,也對(duì)一些其他技術(shù)解決方案產(chǎn)生了改變,這里就講下 如何在k8s部署的python項(xiàng)目中非侵入式的收集到coverage讥珍。項(xiàng)目地址:Github
coverage 收集在 k8s pod中
-
Dockerfile 中增加相應(yīng)的依賴下載
RUN pip install coverage==4.5.1 RUN apt-get install screen
-
在containers 中 設(shè)置tty 為true
containers: - name: server image: server:latest tty: true
-
將啟動(dòng)服務(wù)的命令修改历极,因?yàn)閏overage.py 采集的方式是通過進(jìn)程接受 "終止"信號(hào)來進(jìn)行采集的,這樣修改使得衷佃,進(jìn)程被kill 時(shí)候不會(huì)導(dǎo)致容器重啟趟卸。
command: ['screen', '-S', 'coverage', 'coverage', 'run', '--branch', '--concurrency=gevent', '--parallel-mode', '/code/server/application.py']
-
在yaml中對(duì)容器增加 preStop的操作,目的是 通過delete pod的時(shí)候 接受到"終止"信號(hào)氏义,觸發(fā)preStop進(jìn)行采集锄列,這樣的好處是,k8s 的pod 在接受"終止信號(hào)時(shí)候"惯悠,會(huì)立即創(chuàng)建一個(gè)新的pod邻邮,這樣能夠幾乎不影響服務(wù)的使用
lifecycle: preStop: exec: command: - "bash" - "-c" - | kill -SIGINT 9 coverage combine; coverage xml -i curl -X POST tool-upload.tool.svc.cluster.local:5000/upload -F "file=@coverage.xml" -F pod="server" //將coverage.xml 通過接口上傳到nfs
-
tool-upload.tool.svc.cluster.local:5000 是使用k8s的內(nèi)部地址的服務(wù),規(guī)則是{server}.{namespace}.svc.cluster.local:{port}克婶,然后通過這個(gè)接口把coverage.xml傳到固定的地方筒严,我這邊是在k8s集群里部署了一個(gè)上傳服務(wù),大家也可以本地起一個(gè)上傳服務(wù)只要ip能通就行情萤。
這個(gè)服務(wù)可以 從flask_app_k8s這個(gè)文件中里 進(jìn)行部署docker build -t tool-upload:v0.1 . #docker build 出上傳服務(wù)的進(jìn)行 kubectl create namespace tool #創(chuàng)建namespace kubectl create -f tool_upload.yaml #創(chuàng)建上傳文件的服務(wù)鸭蛙,在yaml中配置了 nfs,這樣就可以把coverage上傳到這個(gè)xml中