写点什么

携程混合云之 kubernetes@AWS 揭秘

  • 2020-02-15
  • 本文字数:4033 字

    阅读完需:约 13 分钟

携程混合云之kubernetes@AWS揭秘

一、引言

随着携程国际化战略的实施和业务海外的部署,混合云已经达到了一定的规模。为了支持容器,我们在 AWS 上部署了 kubernetes。主要是弹性发布的考量。


应用交付效率上,初始化一台虚拟机在分钟级别,涉及操作庞杂,除了启动虚拟机,还需要进行应用环境的安装,而拉起一台容器的时间可以控制在秒级。


运维管理效率上,虚拟机的维护比容器要复杂得多,特别是在目前有着多个公有云合作厂商的情况下,工作量和复杂程度爆增。以镜像为例,自定义的镜像无法在不同公有云厂商之间进行统一,比如 AWS 的 C5 等系列要求我们安装 ENA(Elastic Network Adapter)增强联网的驱动。目前我们在几家公有云上的自定义镜像是也是保持着异构的状态。


所以,引入了混合云的容器发布。借助着业务在 AWS 的应用部署,有了 Kubernetes@AWS 的主题。

二、为什么在 AWS 上自己搭建 kubernetes

首先是网络上的重要考量,目前适配携程的技术体系需要满足两个网络适配的要求。


IP 直连:存在应用互访是通过 IP 进行访问的情况,而且携程的应用并非全是跑在 kubernetes 集群中,所以为了保证全局应用的可用性,就需要容器的 IP 是 kubernetes 集群外可见的 IP。


IP 固定:假设应用在重新发布时 IP 发生变化,那必须有良好的机制通知各个相关的系统。但是目前存在有运维等系统的架构是基于 IP 固定这一前提条件。要完善这种架构不是一时之力,所以我们在这期项目的折中方案是适应当前的技术架构,保证容器应用在发布新版本、宿主机故障重新拉起容器时,IP 保持不变。


这两个需求都不是 kubernetes 可以原生支持的,kubernetes 提供了 Service、Ingress 等服务暴露的方法,但是不能完全满足我们上述的网络需求,社区现成的 flannel、calico 等容器网络方案不能采用,需要进行定制化。


同时,我们也针对 kubernetes 做了调度等层面的自定义开发。虽然 AWS 也发布了 kubernetes 产品——EKS,是一套打通公有云的方案,但也意味着失去了自定义开发及控制平面运维管控的能力。所以,我们也没有采用公有云的原生 kubernetes 产品。


出于对定制化能力和控制平面管控的需求,也为了与私有云 IDC 的技术栈保持一致,尽量减少运维成本,进行过一系列的调研之后,我们最终选择自己在云上搭建 kubernetes 集群。

三、如何在 AWS 上自己搭建 kubernetes

主要从网络、镜像、日志监控这几个组件讲讲我们的方案选型及设计。

3.1 网络

容器网络的方案我们是基于 VPC(Virtual Private Cloud)和弹性网络接口(Elastic Network Interface,ENI)进行实现的。


VPC 是一个用户在公有云上自建的隔离的虚拟网络,可以自定义地址空间段。我们以一个地域(Region)为例,一个 VPC 在其中一个可用区内的架构大致如下:



每个可用区内有一个公有子网和一个私有子网。


公有子网:想对 internet 直接暴露的服务一般部署在公有子网,给实例绑定一个弹性 IP(公有 IP),Internet 即可通过这个公网 IP 进行访问。公有子网里的缺省路由是 Internet 网关,由 Internet 网关实现 VPC 与 Internet 之间的通信。其中公有子网里有个 NAT 网关,有对应的私有 IP 和公有 IP。NAT 网关的作用是允许私有子网中的实例连接到 Internet 或其他 AWS 服务的能力,但能避免 Internet 直接连接这些实例。


私有子网:一般用于供内部调用的服务,如数据库、应用后端等。私有子网里的实例如果要访问 Internet 上的服务,与私有 IDC 里通过代理实现的方式不一样,会通过描述私有子网的缺省路由为公有子网里的 NAT 网关,实现与 Internet 的通信。


图上子网里实例的私有 IP 地址,其实是和弹性网络接口(Elastic Network Interface,ENI)相关的。它是 VPC 中的一个逻辑网络组件,特性如下:


1 个弹性网络接口具有:


  • 1 个 Mac 地址

  • 1 个主要私有 IP 地址

  • 多个辅助私有 IP 地址

  • 1 个或多个安全组,需要注意的是:ENI 上的 IP 地址的安全组是跟随着对应网卡的安全组而决定出入控制的。


其中每个私有 IP 地址都可以绑定一个弹性 IP。


一个实例可以有多个弹性网络接口:


  • 1 个主要弹性网络接口,不可插拔,如 ifconfig 中 eth0

  • 多个辅助网络接口,可动态插拔,如 ifconfig 中 eth1~n



实例可以容纳的最大弹性网络接口数和每个接口的最大 IP 地址个数是有限制的,一般来说,与实例类型相关,总体来说与配置成正比。


利用弹性网络接口,我们衍生出了两种容器网络的子方案:


  • 单网卡多 IP

  • 单网卡单 IP


单网卡多 IP 容器网络方案



该方案的网络要点在于:一个弹性网络接口绑定多个 IP,其中第一个 IP(主要私有 IP)作为宿主机对外通信的 IP,后面的 IP(辅助私有 IP)是容器的 IP。容器和宿主机之间通过 veth pair 进行连接,同时通过路由表进行容器出入流量的控制。


单网卡单 IP 容器网络方案



虽然一个弹性网络接口可以绑定多个 IP,但是也提高了复杂性。该单网卡单 IP 子方案中,把一个弹性网络接口作为一个调度的单元,每个弹性网络接口只使用一个 IP,其中第一个弹性网络接口(eth0)留给宿主机继续使用,在实例上添加新的辅助弹性网络接口(eth1-N),并把弹性网络接口移入容器的网络命名空间,直接给容器使用。对比如下:


网络子方案优势劣势
单网卡多IP可部署的Pod个数较多,资源利用率高调度层要选择可容纳新IP的网卡
IP的出入访问由网卡的安全组决定,调度还需选择对应安全组的网卡
单网卡单IP独占网卡设备,便于隔离
无新增的虚拟化层,性能是网卡的性能
只利用了网卡上的第一个IP,可容纳的Pod个数较少,资源利用率相对较少


我们最终选择了单网卡单 IP 的子方案,原因在于,比较简单,同时,承载的主要是 Java 应用,对应的配置一般不会太低,不会有很明显的资源浪费。


可以看到,如上的网络方案,由于容器的 IP 其实是 VPC 范畴地址空间段的 IP 地址,所以可以达到 kubernetes 集群外 IP 可见的需求,还有 IP 固定的需求,是这么实现的。



有一个全局的 IP 地址管理模块,简称 GIPAM,它存储了 pod name(我们使用的是 Statefulset)与 IP 的一对一关系,并负责与公有云进行 API 的交互。Node 上的 cni 插件,在设置网络前,先去 GIPAM 上查询一下 IP 的信息。应用重新发布,故障迁移,重新拉起一个容器时,不管是不是在同个 node,由于 cni 插件会以 GIPAM 作为 IP 的数据源,这样就保证了 IP 的固定和漂移。


举个创建容器网络的图例:


3.2 镜像

我们在私有云的每个 IDC 都部署了一套 Harbor,组成了 Harbor 集群联邦,并且跨越测试环境和生产环境。并使用了 DNS 劫持的技术,推送 docker 镜像时,是往各自 IDC 的 Harbor 进行推送,后台自动异步地同步到其他 IDC。保证应用在部署时优先从同 IDC 的 Harbor 进行镜像的拉取,如果失败,再跨 IDC 拉取镜像,减少应用拉起的时间。


在 AWS 上我们选择了自己搭建 Harbor,后端的存储采用 S3。由于目前我们在公有云 IDC 上的应用相对较少,暂时未加入联邦,未开启自动同步,在发布流程上保证在应用在部署时预先推送镜像到 AWS IDC 的 Harbor。同样也使用了 DNS 劫持技术,保证使用同样的镜像域名。


3.3 日志监控

网络解决了,镜像可以拉取了,可以正式拉起一台容器了。那监控和日志是如何解决的呢?



在公有云我们部署了一套与私有云一致的日志监控系统,hickwall、grafana 等,采用了 Prometheus+Telegraf+InfluxDB+Grafana 等与私有云一致的技术栈。在云上采集,云上处理,只送回必要的告警数据,并对接了 NOC 体系,进行 7*24 的监控。

四、同步私有云数据到公有云及疑难杂症

4.1 同步私有云数据到公有云

涉及到 IDC 之间大量数据的同步,我们是采用公网传输的方式,毕竟专线带宽有限而且昂贵。有关 AWS 数据的流量费用,可以总结为:


如果服务部署在私有子网,与 Internet 的通信会经过 NAT 网关。经过 NAT 网关的流量不管出入,一律收取数据处理费用。


如果服务部署在公有子网,通过公网 IP 与 Internet 通信。而公网 IP 的收费模式是只收出流量,进流量不收费。


所以我们通用的把数据从私有 IDC 同步到公有云的部署架构是:把数据收集服务部署在公有子网,实例带有公有 IP,私有云 IDC 的推送服务通过 Internet 进行数据的推送。



同样,如果公有云上的服务需要从外部供应商拉取的数据量比较大,我们也是采用服务部署在公有子网的模式。如此节省了经过 NAT 网关的数据处理费用。

4.2 AWS ELB 负载均衡不支持回环路由

我们通过 AWS ELB(Elastic Load Balancing)把 kubernetes api server 组成一个高可用的集群,但是上线后,发现在 master 节点上使用 kubectl 命令经常会超时,集群中也有比较多的访问 api-server 的 i/o timeout 日志。


这个问题在于通过实例 id 进行注册的 ELB 不支持回环路由。即通过实例 id 注册到 ELB 的目标时,客户端的源 IP 地址会保留,ELB 在路由后发现源地址和目的地址相同,会丢弃这些包,连接仅在请求路由到不同的实例时才会成功。Kubernetes 在部署架构中,通常采用混合部署的模式,在同一台主机上同时启用 kube-scheduler、kube-api 等组件。


该问题可以通过改用通过 IP 地址注册目标到 ELB 负载均衡进行解决。为了支持这种应用混布场景,AWS 推出了通过 IP 地址进行注册的 ELB 负载均衡,即可避免不支持回环路由而导致连接超时的问题。


4.3 kubelet 进程 max-pods 设置

由于我们的网络方案受限于实例上弹性网络接口的最大个数,要注意在 kubernetes node 上对 kubelet 进程的 max-pods 参数进行设置以限制 Pod 的最大数量。


五、总结


本文首先介绍了在携程混合云平台上支持容器发布的背景,并引出了自搭 kubernetes 的初衷,要适配的网络需求,再详细从网络、镜像、日志监控等组件介绍了携程在 AWS 自己搭建 kubernetes 的方案选型及设计,接着给出了从私有云 IDC 同步数据到公有云的通用部署架构,并从几个示例介绍了探索过程中碰到过的注意事项。


我们在混合云上的广大探索还在持续中


作者介绍


陈丹双,携程高级工程师,毕业于复旦大学,积累多家公有云对接经验,持续探索混合云,关注 kubernetes、docker 等容器技术。


本文转载自公众号携程技术(ID:ctriptech)。


原文链接


https://mp.weixin.qq.com/s/r7HeP6FCr6ZbHIRsOt0kcg


2020-02-15 17:37926

评论

发布
暂无评论
发现更多内容

Linux系统搭建FTP服务

百度开发者中心

ftp服务

网易云信 Crash 异常治理实践 | 智企技术委员会技术专题系列

网易云信

系统设计 异常处理

直播预约|Search for Future,阿里云 × Elastic 中国用户峰会 2023

阿里云大数据AI技术

大数据 阿里云 搜索

预售登上计算机新书热卖榜TOP1,开年重磅,助力Java程序员飙升核心技能

图灵社区

Spring boot starter test java 后端、 程序员 java

一个可以早点下班的开发技巧

引迈信息

前端 敏捷开发 低代码 JNPF

预售登上计算机新书热卖榜TOP1,开年重磅,助力Java程序员飙升核心技能

图灵教育

Spring boot starter test java 后端、 程序员 java

2023年适用于Windows和Mac的FTP传输工具

镭速

软件测试/测试开发 | Spring Boot 异常处理

测试人

软件测试 springboot 自动化测试 测试发开

我在京东做研发丨【混合多云第一课】为何多云多活被称为“技术皇冠上的明珠”?

京东科技开发者

京东云 研发 混合多云

ERP和MES如何做到优势互补,它们的区别在哪?

工赋开发者社区

关于微服务系统中数据一致性的总结

做梦都在改BUG

Java 微服务 数据一致性

GitHub破千Star!Java多线程编程实战指南:核心篇+设计模式篇

做梦都在改BUG

Java 并发编程 多线程

【经验分享】电路板上电就挂?新手工程师该怎么检查PCB?

华秋PCB

工程师 电路 PCB PCB设计

九科祝福丨人生不设限,愿你自由绽放

九科Ninetech

23年国内最牛的Java面试八股文合集(全彩版),不接受反驳

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

Kubernetes 部署主从结构的 MySQL 服务

CTO技术共享

工赋开发者社区 | 关于ChatGPT八个技术问题的猜想

工赋开发者社区

Windows2008与Windows2012下使用IIS服务搭建网站

百度开发者中心

windows IIS 云服务器

京东二面,Redis为什么这么快?

做梦都在改BUG

Java 数据库 redis 缓存 面试

最佳实践 | 使用WebSocket做个实时人脸活体比对服务

牵着蜗牛去散步

人工智能 腾讯 最佳实践 腾讯云智能 慧眼人脸核身

黑盒测试方法—等价类划分法

测吧(北京)科技有限公司

测试

选对调度器,让你的设备“纵享丝滑”

鼎道智联

算法 cpu ESA

网易云信 Crash 异常治理实践 | 智企技术委员会技术专题系列

网易智企

系统设计 异常处理

软件测试/测试开发 | 数据持久化技术(Java)

测试人

软件测试 测试发开

那些年,我们写过的无效单元测试

阿里巴巴中间件

阿里云 编程 云原生

C++ sort和for_each算法的普通、文艺和2B用法

老王同学

c++ 排序

Gartner首次针对中国市场发布产业数字化白皮书,联合卡奥斯共探区域经济发展最优解

Openlab_cosmoplat

数字化 产业数字化 白皮书 开源社区 Gartner

如何让SpringBoot项目启动时执行特定代码

做梦都在改BUG

Java Spring Boot

Dubbo 在 Proxyless Mesh 模式下的探索与改进

阿里巴巴中间件

阿里云 云原生 dubbo

携程混合云之kubernetes@AWS揭秘_技术管理_陈丹双_InfoQ精选文章