聚石塔在云原生之前的应用部署基本都是基于 VM 直接部署进程,这种方式缺乏进程间的资源隔离。同时当 ECS 数量变多,资源的统一管理就变得非常复杂,很容易造成资源争抢导致应用稳定性问题以及资源浪费导致的多余成本开销。同时,在传统的 VM 部署模式中,应用的扩缩容不仅仅需要处理应用的代码包启动,还需要处理应用的端口冲突,应用所关联的存储资源分配,应用流量在 SLB 的挂载和摘除,应用配置的分发以及持久化,整个部署过程会变得非常耗时且容易出错。
事件监控和告警功能,不仅能在日常帮助用户排查和定位自身应用问题,也为平台对各个应用的运行情况有较好的了解,从而制定个性化的优化方案以及大促保障方案。此外,对于集群底层的组件,也可以通过配置相应的规则进行告警通知,此次 双11 大促,聚石塔为核心集群自动配置了集群 DNS 组件的告警,以便及时扩容或者切换更高可用的 DNS 方案,从而确保业务稳定。
4. DNS 生产环境优化实践
由于聚石塔的用户大多是电商或小程序的场景,流量波动明显,并且开发语言多样化,有些语言没有很好的连接池,导致每一次请求都需要进行一次 DNS 解析。Kubernets 默认的 CoreDNS 在高并发时会遇到性能瓶颈,部分用户在日常活动中,已经遇到了 DNS 性能的问题,更不要说 双11 期间,因此聚石塔对 DNS 的性能做了深入的优化,确保 双11 的稳定性。
1)Node Local DNS
默认的 CoreDNS 方式是采用的 Deployment 方式部署的无状态服务,集群中的 Pod,通过 service 对其进行访问。通过上述流程可以看到,DNS 解析需要跨节点请求,性能不是很高,在高并发的场景下,容易达到瓶颈。 为了进一步提高性能,阿里云提供了 ack-node-local-dns。原理如下,通过 DaemonSet 的方式,将 DNS 解析的服务在每个节点上启动一个实例,同时设置相应的 转发规则,将 Pod 发出的 DNS 的请求转发到各自节点上对应的 DNS 解析服务,从而避免了跨节点的访问,很大程度上提高了性能。 聚石塔对该插件进行了相应封装,可以使用户无感知的在两种方式间进行切换。
2)Sidecar DNS
对于 ECI 的场景,由于不存在真实的宿主机,因此无法采用上述 Node Local DNS 的方案提高 DNS 性能,同时各个节点上的服务数量不同,并且不同应用对的 dns 解析并发量的不同,在极端的场景下可能会出现 DNS 解析并发量分布不均,从而导致部分节点上 DNS 解析出现问题。 基于以上场景,聚石塔结合 Kubernetes 提供的 sidecar 能力,提供了 sidecar dns。原理如下图所示。 通过在 Pod 容器组中加入 DNS 解析服务容器。实现容器组中,其他容器所有的 DNS 解析请求均通过 sidecar dns 获取。sidecar dns 可以看做是业务容器的缓存,只为自身所在的 Pod 提供服务,不会存在负载分配不均的问题,并且可以为 ECI 提供相应的 dns 解决方案。
Kubernetes 最先是在 1.14 版本 GA 实现了 Windows Server 2019 上进程容器的调度,随着后面的不断迭代,Windows 容器在调度、安全、网络、存储和镜像管理等模块上都有了很大的进步,正在慢慢对齐 Linux 容器的功能并尽最大努力保持对异构容器管理的统一性。但我们还是能看到 Windows 容器有很多的限制,这种限制更多的是来自于操作系统层面的。
隔离不彻底
目前 Windows 容器的实现模式分为:"进程容器"和"Hyper-V 容器"。"进程容器"是通过任务名管理来模拟资源隔离的,所以这种隔离是不彻底的,最常见的限制就是没法 OOM kill。而"Hyper-V 容器"是通过内核隔离技术来实现,因此这种隔离是最彻底的。 Kubernetes 默认支持的是"进程容器",其实说"只支持"都不为过,为什么呢?因为目前能支持"Hyper-V 容器"的运行时只有 Dokcer EE,而又受限于其实现,"Hyper-V 容器"不能支持 Multiple Container one Pod 的场景,再加上微软把节点上可以跑"Hyper-V 容器"的数目也 License 化,这就极大的阻碍了"Hyper-V 容器"Kubernetes 化的进程。
升级难平滑
为了提高迭代效率,加速功能沉淀,微软在 2017 年推出一种新的系统发布里程:"半年通道版"(Semi-Annual Channel)。相比于"长通道版"(Long-Term Servicing Channel),"半年通道版"是按照半年一次来进行 release 的,所 release 的内核是完全兼容当前所支持的 "长通道版"的操作系统。比方说,Windows Server 1809 SAC,Windows Server 1903 SAC ,Windows Server 1909 SAC 等都属于 Windows Server 2019 LTSC。 比起"长通道版",显然"半年通道版"来得更加敏捷高效,但是转而来的是更复杂的升级管理。
严格内核版本要求的"进程容器":由于进程容器是通过任务名模拟的,这就导致了容器的 base 镜像内核版本必须等于节点内核版本。换句话说,1903 SAC 的容器是没法跑在 1809 SAC 的节点上,反之亦然。
目前的 Windows 容器的文件管理比较 tricky。由于 Docker EE 只实现了主机目录级别的挂载,这就导致 Windows 要读写某个文件的时候,必须把其整个目录挂载进来。于此同时,由于主机的 ACL 管理不能被投影到容器内,这就导致了 Windows 容器对文件的权限修改是不能被主机所接收的。 在 Secret 资源的管理上,在 Linux 上请求挂载的 Secret 资源会被暂存到内存里面,但由于 Windows 不支持挂载内存目录,所以 Secret 资源的内容会被放置在节点上。这就需要一些额外的机制来对 Secret 资源做控制。
2)展望
不过随着这几年的努力,我们正在迎来一个更加稳定和成熟的 Kubernetes Windows 解决方案。