Kubernetes 集群 Ingress 网关实践

背 景

vivo 人工智能计算平台小组从 2018 年底开始建设 AI 计算平台至今,已经在 kubernetes 集群、以及离线的深度学习模型训练等方面,积累了众多宝贵的开发、运维经验,并逐步打造出稳定的基础容器平台 - AI 容器平台(VContainer)。为了支撑公司 AI 在线业务的发展,满足公司对算力资源的高效调度管控需求,需要将在线业务,主要包括 C 端、推理等业务,由原来的虚拟机或物理机迁移至 AI 容器平台。于是小组从 2020 年初开始,基于在线业务的需求对 AI 容器平台进行进一步建设,并将平台与公司的 CMDB、CICD 等基础模块进行打通,使在线业务能够顺利从虚拟机、物理机迁移至 AI 容器平台。

ingress 简介

kubernetes 将业务运行环境的容器组抽象为 Pod 资源对象,并提供各种各样的 workload(deployment、statefulset、daemonset 等)来部署 Pod,同时也提供多种资源对象来解决 Pod 之间网络通信问题,其中,Service 解决 kubernetes 集群内部网络通信问题 (东西向流量),Ingress 则通过集群网关形式解决 kubernetes 集群外访问 集群内服务的网络通信问题 (南北向流量)。

kubernetes Ingress 资源对象定义了集群内外网络通信的路由协议规范,目前有多个 Ingress 控制器实现了 Ingress 协议规范,其中 Nginx Ingress 是最常用的 Ingress 控制器。Nginx Ingress 有 2 种实现,其一由 kubernetes 社区提供,另外一个是 Nginx Inc 公司提供的,我们采用是 kubernetes 官方社区提供的 ingress-nginx。

ingress-nginx 包含 2 个组件:ingress controller 通过 watch kubernetes 集群各种资源(ingress、endpoint、configmap 等)最终将 ingress 定义的路由规则转换为 nginx 配置;nginx 将集群外部的 HTTP 访问请求转发到对应的业务 Pod。

file

1.nginx 所有转发逻辑都是根据 nginx.conf 配置来执行的,ingress controller 会 watch kubernetesapiserver 各种资源对象,综合起来形成最终的 nginx.conf 配置;

2.ingress 资源对象:生成 nginx 中 server host、location path 配置,以及根据 ingress annotation 生成服务维度的 nginx 配置;

3.configmap 资源对象:生成全局维度的 nginx 配置信息;

4.endpoint 资源对象:根据 Pod IP 动态变更 nginx upstream ip 信息。

其中针对 ingress nginx upstream 有 2 种路由方案:

方案一:上图 红色箭头所示方案:nginx upstream 设置 Pod IP。由于 Pod IP 不固定,nginx 基于 ngx-lua 模块将实时监听到的 Pod IP 动态更新到 upstream,nginx 会直接将 HTTP 请求转发到业务 Pod,这是目前 ingress nginx 默认方案;

方案二:上图 黑色箭头所示方案:nginx upstream 设置 Service name。由于 Service name 保持不变,nginx 直接使用 kubernetes 集群已有的 Service 通信机制,请求流量会经过 kube-proxy 生成的 iptables,此时 nginx 无需动态更新 upstream,这是 ingress nginx 早期方案。

由于 ngx-lua 动态更新 upstream 这个方案非常稳定,以及 kubernetes Service 通过 iptables 通信的网络延时、DNAT 和 conntrack 的复杂性,我们采用了方案一。

Kubernetes 集群 Ingress 网关实践

为者常成,行者常至