一文帮你搞懂 nginx-ingress 控制器

戳下方名片,关注并星标

回复“1024”获取2TB学习资源!

👉体系化学习:运维工程师打怪升级进阶之路 4.0

—   特色专栏  —

MySQL / PostgreSQL / MongoDB

ElasticSearch / Hadoop / Redis

Kubernetes / Docker / DevOps

Kafka / RabbitMQ / Zookeeper 

监控平台 / 应用与服务 / 集群管理

Nginx / Git / Tools OpenStack

大家好,我是民工哥!

想要搞懂 nginx-ingress 控制器,看这篇文章就够了!

主机 nginx

一般nginx做主机反向代理(网关)有以下配置。

upstream order{
 server 192.168.1.10:5001;
 server 192.168.1.11:5001;
}
server {
 listen 80;
 server_name  order.example.com;
 access_log     /var/log/nginx/order.example.com-access.log;
 error_log     /var/log/nginx/order.example.com-error.log;
 location / {
 proxy_pass_header Server;
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Scheme $scheme;
 proxy_pass http://order;
 }
}

其中192.168.1.10:5001192.168.1.10:5001我们把他们称为Endpoint,就是所谓的具体的服务,比如order订单服务。

pod nginx-ingress

nginx-ingress也是一种代理,是一个pod,外部的数据统一经过(必经)这个pod,然后通过该pod内部的nginx方向代理到各各服务(Endpoint)。nginx-ingress是ingress控制器插件的一种,这些插件有很多,比如istio-ingressgateway。

Pod

nginx-ingress pod有两个功能,controller和nginx:

controller #和kubernetes api通讯实时更新nginx配置(就是ingress yaml资源了)
nginx #正常的反向代理

与主机nginx的区别是,该pod nginx-ingress是运行在pod里。主机在定义反向代理配置文件时,需要监听一个对外开放的端口,比如上边的80端口。那么pod中的nginx端口是如何配置的呢?

我们在github上找到了nginx-ingress的deployment.yaml

  • https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

其中一段

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-ingress-controller
 namespace: ingress-nginx
 labels:
 app.kubernetes.io/name: ingress-nginx
 app.kubernetes.io/part-of: ingress-nginx
spec:
 replicas: 1
 selector:
 matchLabels:
 app.kubernetes.io/name: ingress-nginx
 app.kubernetes.io/part-of: ingress-nginx
 template:
 metadata:
 labels:
 app.kubernetes.io/name: ingress-nginx
 app.kubernetes.io/part-of: ingress-nginx
 annotations:
 prometheus.io/port: "10254"
 prometheus.io/scrape: "true"
 spec:
 # wait up to five minutes for the drain of connections
 terminationGracePeriodSeconds: 300
 serviceAccountName: nginx-ingress-serviceaccount
 containers:
 - name: nginx-ingress-controller
 image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.1
 ...
 ...
 ...
 ports:
 - name: http
 containerPort: 80
 - name: https
 containerPort: 443

我们看到

- name: http
 containerPort: 80
- name: https
 containerPort: 443

默认对外监听了两个端口80和443,也就是说,有这两个端口对外就可以web服务了。

ingress 资源

ingress 资源通过yaml进行管理的,比如以下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: order
spec: 
 rules:
 - host: order.example.com
 http:
 paths: /
 backend: 
 serviceName: order
 servicePort: 80

以上我们定义了一个单一规则的ingress,该pod(nginx-ingress)接收到外部所有的请求,将被发送到内部order服务的80端口上。接下来我们看pod(nginx-ingress)如何把ingress资源转化为该pod中的nginx反向代理配置文件。

upstream order{
 server order:80;
}
server {
 listen 80;
 server_name  order.example.com;
 ...
 ...
 location / {
 proxy_pass_header Server;
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Scheme $scheme;
 proxy_pass http://order; # 对应ingress 资源 name: order
 }
}

当然ingress如果包含https,那么会转化nginx对应的443端口及证书的配置文件内容,这里就不写了。

那么,单一个规则的ingress资源代理多个服务(比如order服务,product服务)或者多个ingress资源文件如何转化为nginx配置?猜测,其实就是转化成了多个。

upstream order{
 server order:80;
}

当然,被转化的nginx配置文件要比这些复杂的多,据说还是用lua脚本写的,灵活如openresty。

nginx-ingress对外提供服务

一般来讲,pod直接对外提供服务就只有两种方式:

  • create一个service,该service暴漏nodePort

  • forward 映射

我们一般采用第一种。

nginx-ingress也是一个pod,所以,为了能使外部通过该pod代理访问,还需要nginx-ingress对外提供一个nodePort的service。这个service这里也不再写了。

nginx-ingress工作流程
1d507d007459ccf2de80c8d5a101b494.png

我们可以看到,因为nginx-ingress这个pod做了所有service的代理,在高并发情况下将承受巨大压力,我们可以增加多个pod实例。

来源:https://juejin.cn/post/6844903957479817230

👍 如果你喜欢这篇文章,请点赞并分享给你的朋友!

公众号读者专属技术群

构建高质量的技术交流社群,欢迎从事后端开发、运维技术进群(备注岗位,已在技术交流群的请勿重复添加微信好友)。主要以技术交流、内推、行业探讨为主,请文明发言。广告人士勿入,切勿轻信私聊,防止被骗。

扫码加我好友,拉你进群

1d493d3a037ec9175b0a8224d4a4ab38.jpeg

e8e8bb5c7d4295cb3796ecee7f3279c8.gif

当前最好用的OCR 工具!无限制、断网可用,关键免费

这些国产软件只因免费强大,常被认为是老外开发的

太突然!宣布永久关闭,已运营近 28 年

突发!152 亿、收购 H3C 的 30% 股权

为什么网上这么多破解的工具,但是官方却不管呢?

使用 VPN “翻墙”违法,为什么大部分人都没事?

服务器为什么大多用 Linux 而不是 Windows ?

dc144bfa68b5dd06fbe7a5689ac8e707.png

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下在看,加个星标,这样每次新文章推送才会第一时间出现在你的订阅列表里。点在看支持我们吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值