正在马不停蹄的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,查问题,不能发散,必须紧扣细节,找到依据,不能想当然。