Ingress是Kubernetes中的一个资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过Ingress资源来配置不同的转发规则,从而根据转发规则访问集群内Pod。本文介绍如何通过控制台和Kubectl方式创建、查看、更新和删除Nginx Ingress。
前提条件
已创建Kubernetes集群。具体操作,请参见 创建Kubernetes托管版集群 。
注意事项
在您使用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上。详情请参见 部署高可靠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-weigh
。
-
-
协议 :指定后端服务的协议,设置后会添加注解
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名称>