见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx
2021-06-04 13:04
标签:rem nginx 配置 空间 转发 容器 stat read ext let 前天才发现,区区一个 nginx ingress controller 竟然2个不同的实现。一个叫 kubernetes/ingress-nginx ,是由 kubernetes 社区维护的,对应的容器镜像是 之前我们用的是 由于使用 接下来是 首先删除之前的 接着从 github 上签出 部署完成后,查看已部署的资源: 还少个 service ,我们这里用 nodePort 的方式部署 service ,于是选用 部署 service 查看部署结果 登录 worker 节点用 curl 命令验证 nginx 是否正常工作 返回 200 ,说明 nginx OK。 注: 登录 nginx-ingress-controller pod ,查看 nginx 配置。 发现 最后是最关键的时刻,验证 在 ConfigMap 中添加启用 use-forwarded-headers 。 对比一下两者处理 1) 2) 如果在 ConfigMap 中添加下面的配置, 一次成功的见异思迁,情定 见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx 标签:rem nginx 配置 空间 转发 容器 stat read ext let 原文地址:https://www.cnblogs.com/dudu/p/12334613.htmlquay.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
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
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
# ....
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
$ curl -i localhost:31080/healthz
HTTP/1.1 200 OK
Server: nginx/1.17.8
kubernetes/ingress-nginx
默认实现了健康检查地址 /healthz
,nginxinc/kubernetes-ingress
没有实现,需要自己实现(详见博问)。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
转发问题。data:
use-forwarded-headers: "true"
kubernetes/ingress-nginx
不负众望!没有 X-Forwarded-For
转发问题,应用中可以正常获取到客户端真实 IP 地址。X-Forwarded-For
的区别。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"
。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
。kubernetes/ingress-nginx
的表现就和 nginxinc/kubernetes-ingress
一样了。data:
compute-full-forwarded-for: "true"
kubernetes/ingress-nginx
。
上一篇:Web - 消息队列
文章标题:见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx
文章链接:http://soscw.com/index.php/essay/90414.html