前天才发现,区区一个 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. BFT-SMaRt:用Netty做客户端的可靠信道

    目录 一.Netty服务端的构建 1. 父类构造函数 ① 查找缓存 ② 相关日志 2. 服务端构造 ① 配置读取 ② 服务端配置 3. 服务端功能 ① 通用接口功能 ② Channel处理器 4. 节 ...

  2. Flask路由+视图补充

    一.路由设置的两种方法 1.装饰器 @app.route('/index/') def index(): return 'Hello World!' 2.源码 route->decorator- ...

  3. spring boot的日常配置

    配置篇 #数据库连接配置msql spring.datasource.url:jdbc:mysql://127.0.0.1:3306/test spring.datasource.username: ...

  4. 编程基础--XML约束

    2020年新年第一天,不写一篇博客纪念一下都感觉对不起这个跨年 为什么会写一篇关于xml的博客呢?xml在编程中用的又不多,再多也用不着自己写约束文件,只要能看懂就行了不是吗?嗯,没别的原因,就是想研 ...

  5. 基于python的感知机

    一. 1.感知机可以描述为一个线性方程,用python的伪代码可表示为: sum(weight_i * x_i) + bias -> activation #activation表示激活函数,x ...

  6. 团队项目—Beta版本冲刺3

    博客介绍 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业要求在哪里 https://w ...

  7. Qt使用QAxObject快速批量读取Excel内容

    网上各种教程用的方法主要是如下这一句: QAxObject * range = worksheet->querySubObject("Cells(int,int)", 1, ...

  8. selenium获取页面源码,判断是否存在指定内容,执行不同的操作

    本案例用于解决selenium UI自动化,判断页面是否存在指定文字,执行后续不同的操作 主要用到browser.page_source 如,保存百度分享文件到自己的百度盘中,会出现文件被删除无法保存 ...

  9. Centos7使用docker搭建Sentry

    1.安装docker Sentry 是一款基于 Django实现的错误日志收集和聚合的平台,它是 Python 实现的,但是其日志监控功能却不局限于python,对诸如 Node.js, php,ru ...

  10. 【WPF学习】第二十六章 Application类——应用程序的生命周期

    在WPF中,应用程序会经历简单的生命周期.在应用程序启动后,将立即创建应用程序对象,在应用程序运行时触发各种应用程序事件,你可以选择监视其中的某些事件.最后,当释放应用程序对象时,应用程序将结束. 一 ...