前天才发现,区区一个 nginx ingress controller 竟然2个不同的实现。一个叫 kubernetes/ingress-nginx ,是由 kubernetes 社区维护的,对应的容器镜像是 quay.io/kubernetes-ingress-controller/nginx-ingress-controller ,namespace 是 ingress-nginx ;一个叫 nginxinc/kubernetes-ingress ,是由 nginx 公司与社区共同维护的,对应的容器镜像是 nginx/nginx-ingress ,namespace 是 nginx-ingress

之前我们用的是 nginxinc/kubernetes-ingress (详见之前的博文), 不知道有2个不同的实现,在排查问题时有时查的是 kubernetes/ingress-nginx 的资料,南辕北辙,当时还纳闷明明按照文档进行了设置,为什么不起作用呢?

由于使用 nginxinc/kubernetes-ingress 后遭遇 K8s 中 ASP.NET Core 应用获取不到客户端真实 IP 地址 的问题(X-Forwarded-For转发问题),于是被迫见异思迁试试换成 kubernetes/ingress-nginx 作为 nginx ingress controller 。

接下来是 kubernetes/ingress-nginx 的部署步骤。

首先删除之前的 nginxinc/kubernetes-ingress 部署。

kubectl delete all --all -n nginx-ingress
kubectl delete namespace nginx-ingress

接着从 github 上签出 kubernetes/ingress-nginx 仓库,用其中的 mandatory.yaml 配置文件进行部署。

git clone https://github.com/kubernetes/ingress-nginx
cd deploy/static
kubectl apply -f mandatory.yaml

部署完成后,查看已部署的资源:

$ kubectl get all -n ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/nginx-ingress-controller-6885bc7778-m62kv 1/1 Running 0 37m NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-ingress-controller 1/1 1 1 37m NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-ingress-controller-6885bc7778 1 1 1 37m

还少个 service ,我们这里用 nodePort 的方式部署 service ,于是选用 deploy/static/provider/baremetal/service-nodeport.yaml 部署文件,在其中添加 nodePort: 31080 指定端口。

kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
nodePort: 31080
port: 80
targetPort: 80
protocol: TCP
# ....

部署 service

kubectl apply -f service-nodeport.yaml

查看部署结果

$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.96.151.144 <none> 80:31080/TCP,443:32428/TCP 9

登录 worker 节点用 curl 命令验证 nginx 是否正常工作

$ curl -i localhost:31080/healthz
HTTP/1.1 200 OK
Server: nginx/1.17.8

返回 200 ,说明 nginx OK。

注:kubernetes/ingress-nginx 默认实现了健康检查地址 /healthznginxinc/kubernetes-ingress 没有实现,需要自己实现(详见博问)。

登录 nginx-ingress-controller pod ,查看 nginx 配置。

kubectl exec -it deployment/nginx-ingress-controller -n ingress-nginx /bin/bash

发现 kubernetes/ingress-nginx 中基于 ingress 规则生成的 nginx 配置全都放在 /etc/nginx/nginx.conf 中,而 nginxinc/kubernetes-ingress 是在 /etc/nginx/conf.d/ 目录中用一个专门的配置文件存放,文件名以 ingress 所在的命名空间名称开头。

最后是最关键的时刻,验证 kubernetes/ingress-nginx 是否也存在 X-Forwarded-For 转发问题。

在 ConfigMap 中添加启用 use-forwarded-headers 。

data:
use-forwarded-headers: "true"

kubernetes/ingress-nginx 不负众望!没有 X-Forwarded-For 转发问题,应用中可以正常获取到客户端真实 IP 地址。

对比一下两者处理 X-Forwarded-For 的区别。

1)nginxinc/kubernetes-ingress 生成的 nginx 配置是

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

X-Forwarded-For 的值是 "116.62.124.68, 192.168.107.192"

2)kubernetes/ingress-nginx 生成的 nginx 配置是

proxy_set_header X-Forwarded-For $remote_addr;

X-Forwarded-For 的值是 "116.62.124.68"kubernetes/ingress-nginx 收到的请求是通过阿里云负载均衡转发过来的,客户端真实 IP 地址也是藏在 X-Forwarded-For 中,但它足智多谋,会将 X-Forwarded-For 中的 IP 地址传给 $remote_addr

如果在 ConfigMap 中添加下面的配置,kubernetes/ingress-nginx 的表现就和 nginxinc/kubernetes-ingress 一样了。

data:
compute-full-forwarded-for: "true"

一次成功的见异思迁,情定 kubernetes/ingress-nginx

见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx的更多相关文章

  1. 使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡

    运行和管理跨机器集群的大规模的容器微服务应用是一个极具挑战的任务.Kubernetes 提供了一个强大的容器编排解决方案,从而帮助我们迎接这个挑战.它包含了一些重要特性,比如容错,自动伸缩,滚动升级, ...

  2. 实操教程丨如何在K8S集群中部署Traefik Ingress Controller

    注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...

  3. Kubernetes 服务入口管理与 Nginx Ingress Controller

    Kubernetes 具有强大的副本,动态扩容等特性,每一次 Pod 的变化 IP 地址都会发生变化,所以 Kubernetes 引进了 Service 的概念.Kubernetes 中使用 Serv ...

  4. Kubernetes学习之路(十五)之Ingress和Ingress Controller

    目录 一.什么是Ingress? 1.Pod 漂移问题 2.端口管理问题 3.域名分配及动态更新问题 二.如何创建Ingress资源 三.Ingress资源类型 1.单Service资源型Ingres ...

  5. k8s部署高可用Ingress

    部署高可用Ingress 官网地址https://kubernetes.github.io/ingress-nginx/deploy/ 获取ingress的编排文件 wget https://raw. ...

  6. Kubernetes 学习11 kubernetes ingress及ingress controller

    一.上集回顾 1.Service 3种模型:userspace,iptables,ipvs 2.Service类型 ClusterIP,NodePort NodePort:client -> N ...

  7. 11. Ingress及Ingress Controller(主nginx ingress controller)

    11. Ingress,Ingress Controller拥有七层代理调度能力 什么是Ingress: Ingress是授权入站连接到达集群服务的规则集合 Ingress是一个Kubernetes资 ...

  8. (八)Kubernetes Ingress资源

    前言 Kubernetes提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的Service资源,它实现的是“TCP负载均衡器”,另一种是 ...

  9. [转帖]K8s 工程师必懂的 10 种 Ingress 控制器

    K8s 工程师必懂的 10 种 Ingress 控制器 https://www.kubernetes.org.cn/5948.html 控制器有好多啊. 2019-10-18 23:07 中文社区 分 ...

随机推荐

  1. ubuntu pycharm、idea创建快捷方式

    编辑/usr/share/application/pycharm.desktop [Desktop Entry] Type=Application Name=Pycharm GenericName=P ...

  2. 7月17日刷题记录 分治Getting!循环比赛日程表

    通过数:1 ┭┮﹏┭┮ qdoj.xyz 1053 分治-循环比赛日程表 其实今天晚上留给编程的时间并不多,做出一道... 不过收获还是非常大的 毕竟本人从来没有学习过分治算法,今天竟然攻克了我人生中 ...

  3. .net core2.2上传文件总结

    总结一下.net core的上传文件操作,这里主要分上传到本地的也就是MVC的,另一种是上传到WebAPi的. 一.Web端 1.新建一个.net core mvc项目 2.这里的版本是.net co ...

  4. django count(*) 慢查询优化

    分页显示是web开发常见需求,随着表数据增加,200万以上时,翻页越到后面越慢,这个时候慢查询成为一个痛点,关于count(*)慢的原因,简单说会进行全表扫描,再排序,导致查询变慢.这里介绍postg ...

  5. Nginx作为web静态资源服务器——跨域访问

    跨站访问 ​ 为什么浏览器禁止跨域访问 ​ Nginx跨站访问 Syntax:add_header name value [always]; Default:—— Context:http,serve ...

  6. 基于iTextSharp的PDF操作(PDF打印,PDF下载)

    基于iTextSharp的PDF操作(PDF打印,PDF下载) 准备 1. iTextSharp的简介 iTextSharp是一个移植于java平台的iText项目,被封装成c#的组件来用于C#生成P ...

  7. Scrapy解析器xpath

    一.使用xpath 不在scrapy框架中通过response from scrapy.http import HtmlResponse HtmlResponse->TextResponse-& ...

  8. lisp学习总结(二)-----lisp应该探索发展的方向

    现在流行一种语言叫做Clojure,他是lisp直接嫁接到java的结果,但是我就感觉这却成为lisp的失败. 因为lisp最强大最有优势的能力是构造抽象,构造设计思想,而不是运行期以确定的方式运行, ...

  9. Asp.Net Core 3.1 Api 集成Abp项目依赖注入

    Abp 框架 地址https://aspnetboilerplate.com/ 我们下面来看如何在自己的项目中集成abp的功能 我们新建core 3.1 API项目和一个core类库 然后 两个项目都 ...

  10. 浏览器警告Failed to decode downloaded font和OTS parsing error: Failed to convert *** font to ***

    昨晚,在做一个自己感兴趣的东西时,发现浏览器报警告,Failed to decode downloaded font以及OTS parsing error: Failed to convert *** ...