近期项目小结2019-10
2019-11-11 本文已影响0人
ragpo
项目背景
这个客户是个法国中型电商,此前使用的是数人云的mesos容器云平台,现准备迁移至 Openshift,本次项目的目标就是平滑迁移并且不改变应用架构。
客户的Mesos现状
- 网络:
容器网络全部采用host模式,性能几乎无损,因为客户之前采用overlay的网络走了些坑,hostnetwork模式稳定可追溯。 - 存储:
mesos宿主机采用的是ESXI虚拟机,容器的数据直接使用hostpath映射到虚拟机上,虚拟机的路径使用ceph的文件cephfs进行多副本备份。 - CI/CD
使用Jenkins+shell脚本进行ci/cd发布,Jenkins的网络和存储也采用上诉网络和存储模式。
应用现状
spring cloud技术栈,还有tengine、nodejs、varnish等中间件
实施过程中的一些关键技术点
- 应用启动命令中含有宿主机IP环境变量
在spring cloud的应用启动命令中含有一个$HOST环境变量,这个在mesos的容器里面是有的,但是在openshift是没有的,这个环境变量是获取当前容器IP,也就是容器的宿主机IP,这时候可以使用downward API获取到相应的环境变量,将宿主机IP(fieldPath:status.podIP)设置为环境变量名为HOST,容器就可以获取到相应的值了。
解决方法:在deployment内添加如下字段:
spec:
containers:
- env:
- name: HOST
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- 在容器不健康时不重启容器
通常在配置了健康检查(readiness和liveness)后,在readiness检查没有通过时会将pod从服务可用列表中移除,在liveness检查没有通过时会重启pod中的容器;这个需求的原因是,当发现一个pod不正常时,想直接进入pod查看事故现场,方便排查问题,容器重启后有些东西就看不到了。
解决方法:是配置readiness,不配置liveness,这样应用有问题就不会重启了。
- 优雅终止pod
容器在启动时会想eureka注册中心注册自己,但是有时候在pod被delete或者更新时,没有向eureka注销自己,造成服务其实已经停止或者不可用时,注册中心还留存着旧的信息,所以希望在终止容器前主动向注册中心注销。
解决方法:通过prestop在删除容器前向eureka注销自己来解决
- 更新策略:蓝绿部署
比如现在应用有10个pod,希望在更新的时候也创建10个新的pod,并且在10个新的pod ready之后再逐步替换旧的10个pod。
解决方法:在deployment文件中添加如下:maxSurge: 100%就是新pod复制你旧pod的数量,maxUnavailable: 0%是新版本的应用不可用数量为0,也就是新pod全部ready后才会替换旧的
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
name: jenkins
strategy:
activeDeadlineSeconds: 21600
resources: {}
rollingParams:
intervalSeconds: 1
maxSurge: 100%
maxUnavailable: 0%
timeoutSeconds: 600
updatePeriodSeconds: 1
type: Rolling
- 服务发现
mesos自带的服务发现是consul,openshift使用的service做服务发现,不过service的服务发现性能不如consul,
最佳的方案还是使用consul。