本文主要为您介绍Ingress常见问题的处理方法。

Ingress支持哪些SSL/TLS版本?

Ingress-Nginx默认支持TLS V1.2及V1.3版本,对于部分旧版本的浏览器,或者移动客户端TLS版本低于1.2时,会导致客户端在与Ingress-Nginx服务SSL版本协商时报错。

修改kube-system/nginx-configuration configmap添加以下配置,为Ingress-Nginx开启支持更多TLS版本的功能。具体操作,请参见TLS/HTTPS
ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA"
ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2 TLSv1.3"

Ingress L7请求头默认是透传的吗?

Ingress-Nginx默认透传客户端的请求头,有些不符合HTTP规则的请求头(例如Mobile Version),在转发到后端服务前会被过滤掉。为了不过滤掉这类请求头,您可以执行kubectl edit cm -n kube-system nginx-configuration命令在ConfigMap中添加配置。更多信息,请参见ConfigMap
enable-underscores-in-headers:true

后端服务为HTTPS服务访问时是否可以通过Ingress-Nginx转发?

对于后端业务是HTTPS服务,但同样希望可以通过Ingress-Nginx转发时,执行以下命令,在Ingress资源配置中添加以下注解即可。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: xxxx
  annotations:
    # 注意这里:必须指定后端服务为HTTPS服务。
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

Ingress L7透传客户端IP吗?

Ingress-Nginx默认会通过X-Forward-For和X-Real-IP来透传客户端IP,但是当客户端主动在请求头里指定了X-Forward-For和X-Real-IP,会导致服务端获取不到真实的客户端IP。

执行以下命令,开启kube-system/nginx-configuration configmap的以下配置可实现Ingress L7透传客户端IP。
compute-full-forwarded-for: "true"
forwarded-for-header: "X-Forwarded-For"
use-forwarded-headers: "true"

更多相关信息,请参见阿里云容器服务Ingress设置原IP透传

Nginx Ingress Controller组件支持HSTS吗?

nginx-ingress-controller组件默认是开启HSTS的,有些浏览器第一次基于PLAIN HTTP访问时,服务端(开启HSTS)会在返回给客户端的响应头里携带Non-Authoritative-Reason: HSTS字段,说明服务端支持HSTS,当客户端也支持的情况下下次会直接以HTTPS方式访问服务端。服务端返回的响应头消息体中包含有307 Internal Redirect状态码,具体如下图所示。1
当客户端不希望支持自动转到HTTPS访问服务端时,您可以关闭nginx-ingress-controller组件的HSTS。具体操作,请参见HSTS
说明 在浏览器端HSTS默认是有缓存的,当关闭nginx-ingress-controller组件的HSTS后,请您清理缓存。

Ingress-Nginx支持哪些Rewrite配置?

目前Ingress-Nginx支持一些简单的Rewrite配置,具体请参见Rewrite。但是,对于一些高级的特别的Rewrite需求,您可以通过下面方式来配置。
  • configuration-snippet:请参见Configuration snippet,扩展一些配置到Location章节中。
  • server-snippet:请参见Server snippet,扩展一些配置到Server章节中。
同时,snippet也支持一些全局配置,具体如下图所示。更多相关信息,请参见main-snippet2

在ACK组件管理中升级Nginx Ingress Controller组件时,系统所做的更新是什么?

Nginx Ingress Controller组件在0.44之前的版本,包含以下资源:
  • serviceaccount/ingress-nginx
  • configmap/nginx-configuration
  • configmap/tcp-service
  • configmap/udp-services
  • clusterrole.rbac.authorization.k8s.io/ingress-nginx
  • clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx
  • role.rbac.authorization.k8s.io/ingress-nginx
  • rolebinding.rbac.authorization.k8s.io/ingress-nginx
  • service/nginx-ingress-lb
  • deployment.apps/nginx-ingress-controller
Nginx Ingress Controller组件在0.44版本及其之后的版本,额外包含以下资源:
  • validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission
  • service/ingress-nginx-controller-admission
  • serviceaccount/ingress-nginx-admission
  • clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission
  • clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission
  • role.rbac.authorization.k8s.io/ingress-nginx-admission
  • rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission
  • job.batch/ingress-nginx-admission-create
  • job.batch/ingress-nginx-admission-patch
在ACK的组件管理页面对Nginx Ingress Controller组件进行升级时,系统保留以下资源配置不变更:
  • configmap/nginx-configuration
  • configmap/tcp-services
  • configmap/udp-services
  • service/nginx-ingress-lb

所有其他资源的配置都会被覆盖成默认配置。以deployment.apps/nginx-ingress-controller资源配置为例,其默认的replicas参数为2。如果您升级Nginx Ingress Controller组件之前的replicas为5,但是通过组件管理升级Ingress后,其replicas将会为2,和默认配置一致。

如何将Ingress-nginx的监听由四层改为七层(HTTPS/HTTP)?

Ingress Pod的负载均衡默认是TCP 443 和TCP 80,您可以创建一个HTTPS/HTTP类型的负载均衡,将Ingress-nginx的监听由从四层改为七层。
说明 修改监听时服务会有短暂中断,建议在业务低谷期进行修改监听操作。
  1. 创建证书,并记录cert-id。具体操作,请参见选择阿里云签发证书
  2. 通过Annotation将Ingress所用负载均衡的监听由四层改为七层。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择网络 > 服务
    5. 服务页面顶部设置命名空间为kube-system,单击ingress-nginx-lb右侧操作列下的查看YAML
    6. 在编辑YAML对话框中annotations参数下添加以下内容,然后单击更新
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80,https:443"
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
  3. 验证通过Annotation将负载均衡的监听由四层改为七层成功。
    1. 服务页面单击ingress-nginx-lb右侧的监控信息
    2. 单击监听页签,可以看到监听的前端协议显示HTTP:80和HTTPS:443,说明通过Annotation将负载均衡的监听由四层改为七层成功。
      监听

应用市场部署的ack-ingress-nginx如何使用已有SLB?

  1. 登录容器服务管理控制台,在左侧导航栏中选择市场 > 应用市场
  2. 应用目录页面搜索ack-ingress-nginxack-ingress-nginx-v1
    • 1.20以下集群选中ack-ingress-nginx
    • 1.20以上集群选中ack-ingress-nginx-v1
  3. 部署Ingress Controller。详细信息,请参见部署多个Ingress Controller
    在部署过程中的参数页面,
    1. 删除controller.service.annotations下的所有注解。1
    2. 添加新的注解。
      # 指定SLB
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}"
      # 强制覆盖监听
      service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
      0
  4. 单击确定,继续部署。
  5. 部署成功后,配置对应的IngressClass,使用Ingress Controller。详细信息,请参见部署多个Ingress Controller

ALB Ingress和SLB Ingress(仅ASK支持)、Nginx Ingress有什么区别?

ALB Ingress基于阿里云应用型负载均衡ALB(Application Load Balancer) 提供了更为强大的Ingress流量管理方式,推荐您使用ALB Ingress。
  • 相较于SLB Ingress, ALB Ingress具备处理复杂业务路由(支持Header、Cookie)和证书自动发现的能力,支持HTTP、HTTPS和QUIC协议,满足在云原生应用场景下七层流量处理能力的需求。
  • 相较于Nginx Ingress组件需要客户自己运维,ALB Ingress提供全托管免运维的方式,通过ALB云产品的方式提供高性能的网关服务。关于Nginx Ingress与ALB Ingress的对比详情,请参见Nginx Ingress与ALB Ingress对比

出现报错:The param of ServerGroupName is illegal.

当前服务器ServerGroupName的生成格式是namespace+svcName+port。服务器组名称的长度为2~128个字符,必须以大小写字母或中文开头,可包含数字、半角句号(.)、下划线(_)和短划线(-)。请您按照服务器组名称的格式要求进行修改。

出现报错:The specified resource sgp-vz2fb219vv792flx3u is in use.

该服务器组被另外一个ALB实例引用,需要手动从另外的ALB实例引用中移除。具体操作,请参见配置AlbConfig

ALB后端默认监听转发到kube-system-fake-svc-80,这个监听的作用是什么?

由于创建监听必须有一个默认转发规则,并且转发规则目前只支持转发到某个服务器组,所以当前通过创建Fake服务器组实现监听功能。该服务器组不参与业务处理,但不能被删除。

ALB Ingress是否支持同时使用内外网?

支持。使用外网时,您需要先创建公网ALB。对于ALB公网实例,提供给您的ALB域名会解析为公网EIP;如果您需要从VPC内访问,建议您创建一个私网ALB实例;如果您需要同时从公网和私网访问同一个ALB公网实例,目前ALB公网实例会在每个可用区创建一个公网EIP,同时提供一个私网VIP,用于访问私网VIP,可以实现从内网访问的效果。