本文介绍如何部署一套高性能、高可靠的Ingress接入层。
背景信息
Nginx Ingress Controller 是一个用于 Kubernetes 环境的开源 Ingress 控制器,它基于 Nginx 服务器实现了负载均衡、SSL 终止和路由功能。通过使用 Nginx Ingress Controller,你可以轻松地在 Kubernetes 集群中管理入站流量,并将 HTTP 和 HTTPS 请求路由到不同的服务。它还支持基于规则的路由、TLS 终止和灵活的配置选项,使得在 Kubernetes 中管理和控制流量变得更加简单和高效。作为集群流量接入层,Ingress的高可用性显得尤为重要,为了达到生产级的阈值,我们必须要要配置ingress的高可用。
前提条件
- 确保您已经创建SCE集群,具体操作请参阅创建SCE集群。
- 确保kubectl工具已经连接目标集群。
实现原理
高可用首先要解决的就是单点故障问题,在sce集群中Nginx Ingress Controller 通常采用多副本部署的方式,同时由于Ingress作为集群流量接入口,可以在ingress前面使用ELB来统一代理ingress-controller的服务,以负载均衡到不同的ingress-controller pod。高可用架构图如下:
如上述部署架构图所示,由多个Ingress-controller实例组成统一接入层来承载集群入口流量,同时可依据后端业务流量水平扩缩容Ingress-controller pod。
您可以在容器服务控制台页面上,通过为应用创建不同的Ingress对象,来为不同的应用指定不同的域名。IngressController目前不支持配置HTTPS证书,后续会支持,所以该方案目前不支持HTTPS,只支持HTTP。
操作步骤
步骤一:安装nginx-ingress-controller插件
- 登录容器服务控制台,在左侧菜单栏选择“集群”。
- 在集群列表页面,选择目标集群名称,然后在左侧菜单栏选择“插件”下的“插件市场”,点击安装nginx-ingress-controller插件。
- 提交安装插件,稍后会在集群中创建2个nginx-ingress-controller pod。
- 查看nginx-ingress-controller是否正常运行。
- 您可以根据业务流量水平修改nginx-ingress-controller deployment的副本数量。
步骤二:创建前端应用
这里使用nginx代表前端应用,部署2个副本。
- 登录容器服务控制台,在左侧菜单栏选择“集群”。
- 在集群列表页面,选择目标集群名称,然后在左侧菜单栏选择“工作负载”下的“无状态”,点击“创建deployment”。
也可以使用yaml创建工作负载,创建nginx工作负载参考如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: registry-huadong1.crs-internal.ctyun.cn/open-source/nginx:1.25-alpine
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
步骤三:创建service服务
- 为前端nginx工作负载创建service,参考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
ports:
- port: 30003
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
- 为nginx-ingress-controller pod创建service,创建LoadBalance类型的service,并绑定ELB,参考如下:
apiVersion: v1
kind: Service
metadata:
name: ngixn-ingress-svc
namespace: kube-system
spec:
ports:
- name: nginx-ingress
port: 30002
protocol: TCP
targetPort: 80
selector:
k8s-app: nginx-ingress-controller
type: LoadBalance
步骤四:为前端应用创建Ingress路由
创建ingress,参考如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx-ingress-controller"
spec:
rules:
- host: myingress.com
http:
paths:
- backend:
service:
name: nginx-service
port:
number: 30003
path: /nginx
pathType: Prefix
步骤五:使用域名进行访问前端应用
在浏览器访问myingress.com域名需要在hosts中配置该域名对应的ELB的IP地址。这样在浏览器通过域名访问,DNS服务器把域名解析为ELB的IP,ELB把请求转给其中某个IngressController,IngressController通过域名转发到不同的集群内应用。