本文主要为您介绍Nginx 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。
Nginx Ingress Controller 1.7.0及以后版本,如要启用TLS v1.0与TLS v1.1,需要将@SECLEVEL=0
添加到ssl-ciphers
中。
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-Forwarded-For和X-Real-IP来透传客户端IP,但是当客户端主动在请求头里指定了X-Forwarded-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
状态码,具体如下图所示。
当客户端不希望支持自动转到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-snippet。
在ACK组件管理中升级Nginx Ingress Controller组件时,系统所做的更新是什么?
Nginx Ingress Controller组件在0.44之前的版本,包含以下资源:
serviceaccount/ingress-nginx
configmap/nginx-configuration
configmap/tcp-services
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的监听由四层改为七层。
修改监听时服务会有短暂中断,建议在业务低谷期进行修改监听操作。
创建证书,并记录cert-id。具体操作,请参见选择阿里云签发证书。
通过Annotation将Ingress所用负载均衡的监听由四层改为七层。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在服务页面顶部设置命名空间为kube-system,单击ingress-nginx-lb右侧操作列下的YAML 编辑。
在查看YAML对话框中,将
ports
中443端口的targetPort
改为80。- name: https port: 443 protocol: TCP targetPort: 80 # 将443端口的targetPort改为80
在
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}"
结果验证。
在服务页面,单击ingress-nginx-lb服务类型列的。
单击监听页签,可以看到监听的前端协议/端口显示HTTP:80和HTTPS:443,说明通过Annotation将负载均衡的监听由四层改为七层成功。
应用市场部署的ack-ingress-nginx如何使用已有SLB?
登录容器服务管理控制台,在左侧导航栏选择 。
在应用目录页面搜索ack-ingress-nginx或ack-ingress-nginx-v1。
1.20以下集群选中ack-ingress-nginx。
1.20以上集群选中ack-ingress-nginx-v1。
部署Ingress Controller。详细信息,请参见部署多个Ingress Controller。
在部署过程中的参数页面,删除旧注解,添加新注解。
删除controller.service.annotations下的所有注解。
添加新的注解。
# 指定SLB service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}" # 强制覆盖监听 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
单击确定,继续部署。
部署成功后,配置对应的IngressClass,使用Ingress Controller。详细信息,请参见部署多个Ingress Controller。
如何获取多个Ingress Controller对应的访问日志?
前提条件
安装日志组件。集群创建时,默认会安装日志组件,如未安装。具体操作,请参见步骤一:启用日志服务组件Logtail进行手动安装。
默认的Ingress Controller组件已经开启Nginx Ingress日志采集配置。
已获取其他Ingress Controller组件容器的Label。具体操作,请参见如何获取容器的Label和环境变量。
操作步骤:
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息。
在集群信息页面,单击集群资源。然后在集群资源的列表中单击日志服务Project的右侧ID。
跳转到目标集群的SLS日志服务,在日志库页面创建Logstore。具体操作,请参见创建Logstore。为确保日志不会重复采集,一个Logstore只采集一个Ingress Controller组件日志。
Logstore名称可以参考不同的Ingress Controller的组件名称。
创建成功后,在弹出的数据接入向导框中,单击取消。
在日志库左侧列表栏,单击
,然后在Logtail配置列表下,单击k8s-nginx-ingress进入配置页面。在Logtail配置页面,单击复制。然后在Logtail复制页面,单击下拉框,选择新创建的Logstore名称,在容器过滤中,单击容器Label白名单列的添加,并以键值对的方式添加Ingress Controller组件容器Label。在Logtail复制页面,单击提交。
在日志库左侧列表栏,单击新创建的Logstore名称。在右侧栏顶部,单击开启索引,然后在查询分析页面,单击确定。即可完成对Logstore的配置。
在日志库左侧列表栏,选择
。在Logtail配置页面中,单击右侧操作列下的管理Logtail配置。在配置详情页面,单击处理插件名称列下的提前字段(正则模式),查看日志处理字段。在Logtai配置页面,单击切换为编辑器配置。在Logtail配置下,单击编辑。在插件配置中,配置对应日志字段Keys和Regex。配置完成,单击保存。
说明若不同的Nginx Ingress Controller日志格式定义有所区别,需要对应修改Logtail配置下的processors部分。
如何开启nginx-ingress-controller的TCP协议?
ACK集群中的Ingress资源默认仅支持路由外部HTTP和HTTPS流量至服务内,通过修改ingress-nginx组件的配置,可以实现来自非HTTP协议的外部TCP流量通过在ConfigMap中定义的TCP端口映射,路由至集群内的服务。
操作步骤如下:
按tcp-echo服务模板部署Service、Deployment服务。
部署以下模板ConfigMap。
编辑tcp-services-cm.yaml,保存退出。
apiVersion: v1 kind: ConfigMap metadata: name: tcp-services namespace: kube-system data: 9000: "default/tcp-echo:9000" # 表示任何通过端口9000接收到的外部TCP流量都将被路由到default命名空间下名为tcp-echo的服务上,该服务监听的是内部端口9000。 9001:"default/tcp-echo:9001"
使用如下命令部署ConfigMap。
kubectl apply -f tcp-services-cm.yaml
新增nginx-ingress-controller组件的Service TCP端口,保存退出。
kubectl edit svc nginx-ingress-lb -n kube-system
apiVersion: v1 kind: Service metadata: labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: allocateLoadBalancerNodePorts: true clusterIP: 192.168.xx.xx ipFamilies: - IPv4 ports: - name: http nodePort: 30xxx port: 80 protocol: TCP targetPort: 80 - name: https nodePort: 30xxx port: 443 protocol: TCP targetPort: 443 - name: tcp-echo-9000 # 新增 port: 9000 # 新增 protocol: TCP # 新增 targetPort: 9000 # 新增 - name: tcp-echo-9001 # 新增 port: 9001 # 新增 protocol: TCP # 新增 targetPort: 9001 selector: app: ingress-nginx sessionAffinity: None type: LoadBalancer
测试配置生效。
执行以下命令,查看Ingress服务,获取Ingress SLB的地址。
kubectl get svc -n kube-system| grep nginx-ingress-lb
预期输出。
nginx-ingress-lb LoadBalancer 192.168.xx.xx 172.16.xx.xx 80:31246/TCP,443:30298/TCP,9000:32545/TCP,9001:31069/TCP
使用
nc
命令给Ingress IP的9000端口发送helloworld
。无返回数据则表示测试正常。echo "helloworld" | nc <172.16.xx.xx> 9000 echo "helloworld" | nc <172.16.xx.xx> 9001