正在馬不停蹄的coding,突然接到sandy老師的請求支援,說site部署已經24個小時了,一直部署不成功。
心中一驚,難道CI/CD的pipeline出bug了,不可能吧,如果是,早炸鍋了。
觀察一下jenkins上以往的build job,發現是個例,心稍微放鬆一下。
###發現問題
我司是容器化的jenkins pipeline,每個ultra site 部署完成需要4個pod,首先以問題site的實例名,在整個部署cluster的namespace中 grep一把,想看看當前是什麼狀態,發現沒有任何pod信息輸出。
kubectl -n learn-deployments get pods --show-all |grep submission-list-after
猜測應該是時間比較久了,經過重試一直不成功,被K8s 調度器delete掉了。
那麼首先應該復現問題,我rebuild一下job,直接看到錯誤
submission-list-after-learn-postgres-9f56f79d9-fbxbj 1/1 Running 0 2h
submission-list-after-learn-tomcat-86cb76c85d-qv6nz 2/2 Running 0 2h
submission-list-after-ultra-5fcd59d9b4-gk95p 0/1 InvalidImageName 0 2h
submission-list-after-ultra-router-7cbf4c7875-48mp4 1/1 Running 0 2h
“InvalidImageName” 這麼明顯的問題,其實如果想看進一步的detail 錯誤信息,只需要一步
kubectl -n learn-deployments describe pods/submission-list-after-ultra-5fcd59d9b4-gk95p
Warning InspectFailed 13s (x8 over 34s) kubelet, ip-10-146-22-185.ec2.internal Failed to apply default image tag "AWSACCOUNTID.dkr.ecr.us-east-1.amazonaws.com/learnci/feature/lrn-142928-submission-\u200blist-perf/docker-ultra-ui-3500.6.0-ci:1546_958929e6": couldn't parse image reference "AWSACCOUNTID.dkr.ecr.us-east-1.amazonaws.com/learnci/feature/lrn-142928-submission-\u200blist-perf/docker-ultra-ui-3500.6.0-ci:1546_958929e6": invalid reference format
看到了不速之客“\u200b”, 問題找到了,google一把
原來這貨是U+200B,它還有個學名,叫做:Zero Width Space
##分析問題
什麼地方引入了這個bug呢?
部署的時候,使用的image 是從遠端的aws ecr上拉取的,不會有任何改變,說明生成的image name就出問題了。
回想創建image的pipelinehttps://bbjenkins.dev.bbpd.io/view/Learn/job/ultra/job/create-ultra-ui-images/
image name 是由branch name +version number 通過一定的算法生成的,現在是前半部分出現了問題,是輸入branch name時引入的問題。
image 本身沒有問題,re-run 同一個image 可以正常部署,所以應該是deploy的時候輸入的branch name錯誤(rebuild功能或者複製、粘貼惹得禍),導致部署的job找image錯誤。
##解決問題
以後runjob 儘可能手動輸入參數,rebuild可能會因前人的失誤,帶到坑裏。
加強保護,使用branch_name/version/instance_name的地方都增加上去空格保護。
###經驗教訓
1,系統設計時,儘可能減少人爲輸入,否則容易不可控
2,用戶輸入參數爲字符串類型時,例如instance_name,需要嚴格給出使用規範,比如長度,大小寫,有無空格,數字,有效字符等。否則很可能引入BUG。
3,查問題,不能發散,必須緊扣細節,找到依據,不能想當然。