见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx
前天才发现,区区一个 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 默认实现了健康检查地址 /healthz,nginxinc/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的更多相关文章
- 使用 NGINX 和 NGINX Plus 的 Ingress Controller 进行 Kubernetes 的负载均衡
运行和管理跨机器集群的大规模的容器微服务应用是一个极具挑战的任务.Kubernetes 提供了一个强大的容器编排解决方案,从而帮助我们迎接这个挑战.它包含了一些重要特性,比如容错,自动伸缩,滚动升级, ...
- 实操教程丨如何在K8S集群中部署Traefik Ingress Controller
注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...
- Kubernetes 服务入口管理与 Nginx Ingress Controller
Kubernetes 具有强大的副本,动态扩容等特性,每一次 Pod 的变化 IP 地址都会发生变化,所以 Kubernetes 引进了 Service 的概念.Kubernetes 中使用 Serv ...
- Kubernetes学习之路(十五)之Ingress和Ingress Controller
目录 一.什么是Ingress? 1.Pod 漂移问题 2.端口管理问题 3.域名分配及动态更新问题 二.如何创建Ingress资源 三.Ingress资源类型 1.单Service资源型Ingres ...
- k8s部署高可用Ingress
部署高可用Ingress 官网地址https://kubernetes.github.io/ingress-nginx/deploy/ 获取ingress的编排文件 wget https://raw. ...
- Kubernetes 学习11 kubernetes ingress及ingress controller
一.上集回顾 1.Service 3种模型:userspace,iptables,ipvs 2.Service类型 ClusterIP,NodePort NodePort:client -> N ...
- 11. Ingress及Ingress Controller(主nginx ingress controller)
11. Ingress,Ingress Controller拥有七层代理调度能力 什么是Ingress: Ingress是授权入站连接到达集群服务的规则集合 Ingress是一个Kubernetes资 ...
- (八)Kubernetes Ingress资源
前言 Kubernetes提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的Service资源,它实现的是“TCP负载均衡器”,另一种是 ...
- [转帖]K8s 工程师必懂的 10 种 Ingress 控制器
K8s 工程师必懂的 10 种 Ingress 控制器 https://www.kubernetes.org.cn/5948.html 控制器有好多啊. 2019-10-18 23:07 中文社区 分 ...
随机推荐
- 使用docker增加部署速度的一次实践
问题: 公司给我们分配的服务器到期后不付费了,换成新服务商的服务器了.也就是说我们之前的环境需要重新搭建一次.光项目就50多个(微服务40+,其他服务不到10个),需要重新部署. 之前部署项目时,需要 ...
- APICloud联合腾讯云推出“云主机解决方案“,各种福利等你拿
为了帮助开发者一站式打通云.开发.运维全流程服务,更全面提供基于自身业务情况的云服务器.数据库.存储等基础设施服务,APICloud联合腾讯云重磅推出“云主机解决方案“.开发者可通过控制台简单清晰的购 ...
- flask部署深度学习模型
flask部署深度学习模型 作为著名Python web框架之一的Flask,具有简单轻量.灵活.扩展丰富且上手难度低的特点,因此成为了机器学习和深度学习模型上线跑定时任务,提供API的首选框架. 众 ...
- hdu6601 主席树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601 Problem Description N sticks are arranged in a r ...
- SpringMVC简单使用教程
一.SpringMVC简单入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--conf ...
- 推荐几个高质量图片网站,再也不怕没图装X了
这几个图片网站都是高质量的图片网站,建议收藏! 找个高逼格的图片发票圈,不再难了. Unsplash 网址:https://unsplash.com Unsplash是一个免费高质量照片的网站,照片都 ...
- Error connecting to the Service Control Manager: 拒绝访问 Mongodb问题-解决
原文地址:https://blog.csdn.net/carrot5032/article/details/74742888 发现在mongodb.log里出现 2017-07-07T17:01:5 ...
- Python-logging模块简单使用
logging模块只要用于日志的打印.模块的源码在:Lib/logging/__init__.py 其中,logging.basicConfig(**kwargs)方法用于进行基本的属性配置,它的参数 ...
- 微服务的多数据源配置: step 1
spring boot + mybatis: 实现的功能点: 多数据源 jdbc: spring.datasource.test1.url = jdbc:mysql://localhost:3306/ ...
- Xen+OpenQRM快速部署
一.选择系统平台 a) Ubuntu-11.10-server-amd64 二.Xen安装 a) Xen安装 # apt-get -y install xen-hypervisor-4.1-a ...