这篇文章教你看明白 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;
}
}
pod nginx-ingress
1、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服务了。
2、ingress 资源
ingress 资源通过yaml进行管理的,比如以下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: order
spec:
rules:
- host: order.example.com
http:
paths: /
backend:
serviceName: order
servicePort: 80
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。
3、nginx-ingress对外提供服务
create一个service,该service暴漏nodePort forward 映射
4、nginx-ingress工作流程
我们可以看到,因为 nginx-ingress 这个pod做了所有service的代理,在高并发情况下将承受巨大压力,我们可以增加多个pod实例。
作者:dakesolo
链接:https://juejin.cn/post/6844903957479817230
相关文章