作者回复: Istio/ServiceMesh是K8s推荐的流量治理(或多版本控制)机制,这个机制的好处是可以做到应用无关,不足是运维门槛成本较高。
其它方案可以考虑软件方式实现,一般采用功能开关或A/B测试技术实现,这个机制需要侵入代码,但是灵活性更高,参考项目:
https://github.com/checkr/flagr
https://github.com/markphelps/flipt
https://github.com/intuit/wasabi
作者回复: k8s默认支持的就是滚动发布(rolling update),假设你有一个svc v1版本已经发布到k8s,svc v1假设有10个pod实例,那么下次你发布svc的v2新版本,在deployment yml文件中只需修改镜像版本,然后kubectl apply这yml文件,k8s就会自动进行滚动发布,将v2的pod实例陆续拉入,v1的pod实例陆续拉出,例如,k8s会先拉入2个v2的pod实例,然后拉出2个v1的pod实例,间隔一段时间,再拉入2个v2的pod实例,然后拉出2个v1的pod实例,间隔一段时间,依次类推,一直到v2的pod实例全部拉入,v1的pod实例全部拉出,这就是滚动发布的过程,每次拉入拉出的数量(maxSurge)是可以配置的,具体可参考k8s文档:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
作者回复: 金丝雀是很好理解的,升级时候先上一台新版本去试水,这台新版本就是金丝雀,金丝雀没有问题,继续发全量新版本,同时下老版本;如果金丝雀有问题,则下金丝雀,取消升级。再升级还是这样做。
金丝雀源于过去矿工下矿井前,为防止一氧化碳等中毒,先放一个金丝雀下去试,用在发布上也是这个道理,先上一台新版本去试。
作者回复: 蓝绿切换后,老版是继续留着一段时间,不是马上kill掉的,这样那些连着老版本的请求将继续得到处理,直到处理完毕,但是新的请求将不会再路由到老版本,而是都路由到新版本,所以蓝绿发布一般是安全的。