Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过Ingress资源来配置不同的转发规则,从而根据转发规则访问集群内Pod。本文介绍如何通过控制台和kubectl方式创建、查看、更新和删除Nginx Ingress。
前提条件
已创建Kubernetes集群。具体操作,请参见创建ACK托管集群。
注意事项
在您使用Nginx Ingress Controller时,请遵循以下注意事项。
使用组件时,请通过组件管理的方式或者OpenAPI的方式配置组件的自定义参数。通过其他渠道修改组件配置可能会导致组件功能异常,且会影响组件后续的升级过程。
请勿删除Nginx Ingress Controller默认使用的Service(
kube-system/nginx-ingress-lb
)。将其删除将会导致组件运行不稳定,严重时出现崩溃。请优先考虑使用相关注解或者设置项来实现所需功能,不建议您使用Snippet或Lua代码等方式对组件进行额外配置。对于您使用Snippet等方式配置所出现的与预期功能不符等问题,将无法给予有效的支持。
受上游社区版组件影响,Nginx Ingress Controller可能存在Bug或漏洞,请注意及时升级组件,以避免开源组件Bug或漏洞导致您的业务受损。
在高负载情景下,推荐您使用独立部署的方式将Nginx Ingress Controller部署在单独的Node上。详情请参见部署高可靠的Nginx Ingress Controller。
关于更多使用Nginx Ingress Controller的建议,请参见Nginx。
操作步骤
方式一:控制台操作步骤
创建Nginx Ingress
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在路由页面,单击创建 Ingress,在创建 Ingress对话框配置路由。
配置项
说明
示例值
网关类型
可按需选择ALB应用型负载均衡、MSE云原生网关和Nginx三种网关类型。
关于三种网关的差异,请参见Nginx Ingress、ALB Ingress和MSE Ingress对比。
Nginx
名称
自定义路由名称。
nginx-ingress
Ingress Class
自定义Ingress的类。
nginx
规则
单击+ 添加规则可新增多个路由规则。
域名:自定义域名。
路径映射:配置如下配置项。
路径:指定服务访问的URL路径。本例中不做配置,保留根路径/。
匹配规则:支持前缀匹配(Prefix)、完整匹配(Exact)和默认(ImplementationSpecific)。
服务名称:选择目标服务,即K8s内的Service。
端口:选择服务需要暴露的端口。
Ingress支持同一个域名下配置多条路径。单击+ 添加路径新增路径。
域名:test.example.com
路径映射:
路径:/
匹配规则:默认(ImplementationSpecific)
服务名称:nginx-ingress-lb
端口:80
TLS配置
开启TLS配置开关,配置安全的路由服务。
域名:自定义域名。
保密字典:根据需要选择对应的保密字典。
如果您需要创建Secret,请执行如下操作。
在保密字典右侧,单击创建。
在创建 Secret对话框,自定义保密字典的名称、Cert、Key,然后单击确定。
在保密字典的下拉框,选择已创建的Secret。
单击+ 新增TLS配置,可配置多条TLS。
Ingress的更多用法,请参见Ingress支持。
开启TLS配置。
域名:test.example.com
保密字典:cert
更多配置
灰度发布:开启灰度发布开关。灰度规则可按照请求头、Cookie 、权重三个维度进行设置。
说明请求头、Cookie 、权重可以只设置一种,若同时设置生效规则按请求头、Cookie、权重顺序匹配。
按请求头:基于Request Header的流量切分,设置后会添加注解
nginx.ingress.kubernetes.io/canary-by-header
、nginx.ingress.kubernetes.io/canary-by-header-value
或nginx.ingress.kubernetes.io/canary-by-header-pattern
。按Cookie:基于Cookie的流量切分,设置后会添加注解
nginx.ingress.kubernetes.io/canary-by-cookie
。按权重:设置请求到指定服务的百分比(值为0~100的整数),设置后会添加注解
nginx.ingress.kubernetes.io/canary-weight
。
协议:指定后端服务的协议,设置后会添加注解
nginx.ingress.kubernetes.io/backend-protocol
。支持HTTP、HTTPS、gRPC、gRPCS四种服务协议。
重写路径:将客户端请求中的路径重写后发送到后端服务,设置后会添加注解
nginx.ingress.kubernetes.io/rewrite-target
。
开启灰度发布。
生效规则选择按请求头
请求头名称:foo
匹配规则:按值匹配
匹配值:bar
协议:GRPC
重写路径:设置为空
注解
您可自定义注解名称和值,也可根据名称选择或搜索要配置的注解。Ingress的注解请参见Annotations。
单击+添加注解,可对Ingress无上限地添加注解。
名称:nginx.ingress.kubernetes.io/proxy-body-size
值:10m
标签
标签的作用是为Ingress添加对应的标签,标示该Ingress的特点。
单击+添加标签,可对Ingress无上限地添加标签。
名称:foo
值:bar
配置成功后,单击确定。
在路由页面,可以查看路由已成功创建。
相关操作
您可以在路由页面,单击目标路由操作列的更新、YAML编辑、监控,以及中的删除,完成删、改、查相关操作。
方式二:kubectl操作步骤
创建Nginx Ingress
创建Deployment和Service。
在创建Ingress资源之前,必须创建外部访问Kubernetes集群中的服务。
使用以下内容,创建test-deployment-service.yaml。
以下YAML文件中包含了一个名为test-web1的Deployment和一个名为web1-service的Service。
apiVersion: apps/v1 kind: Deployment metadata: name: test-web1 labels: app: test-web1 spec: replicas: 1 selector: matchLabels: app: test-web1 template: metadata: labels: app: test-web1 spec: containers: - name: test-web1 imagePullPolicy: IfNotPresent image: registry.cn-hangzhou.aliyuncs.com/yilong/ingress-test:web1 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: web1-service spec: type: ClusterIP selector: app: test-web1 ports: - port: 8080 targetPort: 8080
执行以下命令,创建Deployment和Service。
kubectl apply -f test-deployment-service.yaml
创建Ingress。
使用以下内容,创建test-ingress.yaml。
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: test-ingress namespace: default spec: rules: - host: test-ingress.com http: paths: - path: /foo backend: serviceName: web1-service servicePort: 8080 - path: /bar backend: serviceName: web1-service servicePort: 8080
1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-ingress namespace: default spec: rules: - host: test-ingress.com http: paths: - path: /foo backend: service: name: web1-service port: number: 8080 pathType: ImplementationSpecific - path: /bar backend: service: name: web1-service port: number: 8080 pathType: ImplementationSpecific
name
:Ingress的名称,本例为test-ingress。host
:指定服务访问域名。path
:指定访问的URL路径。SLB将流量转发到backend
之前,所有的入站请求都要先匹配host
和path
。backend
:由服务名称和服务端口组成。服务名称:Ingress转发的
backend
服务名称。服务端口:服务暴露的端口。
执行以下命令,创建Ingress。
kubectl apply -f test-ingress.yaml
查看Nginx Ingress
执行以下命令,查看Ingress。
kubectl get ingress
更新Nginx Ingress
执行以下命令,更新Ingress。
kubectl edit ingress <ingress名称>
删除Nginx Ingress
执行以下命令,删除Ingress。
kubectl delete ingress <ingress名称>