1、概述
本文當介紹,如果創建一個ingress,里面包括多個path,也就是實際情況的location,要怎么進行配置。
接下去的這個文檔,就會介紹基本的配置的過程
2、配置過程
2.1、創建一個常規的ingress(包含一個path)
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test-ingress
namespace: test01
spec:
ingressClassName: nginx
rules:
- host: nginx-test.k8s.com
http:
paths:
- backend:
service:
name: nginx-test
port:
number: 80
path: /
pathType: Prefix
EOF
那么,這個ingress只包含一個path "/"
查看創建的ingress
[root@nccztsjb-node-23 ~]# kubectl get ingress -n test01
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-test-ingress nginx nginx-test.k8s.com 172.20.58.18 80 151m
[root@nccztsjb-node-23 ~]#
查看生成的ingress-nginx-controller中的配置
server {
server_name nginx-test.k8s.com ;
listen 80 ;
listen [::]:80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
location / {
set $namespace "test01";
set $ingress_name "nginx-test-ingress";
set $service_name "nginx-test";
set $service_port "80";
set $location_path "/";
set $global_rate_limit_exceeding n;
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = false,
ssl_redirect = true,
force_no_ssl_redirect = false,
preserve_trailing_slash = false,
use_port_in_redirects = false,
global_throttle = { namespace = "", limit = 0, window_size = 0, key = { }, ignored_cidrs = { } },
})
balancer.rewrite()
plugins.run()
}
2.2、創建多個path的ingress
通過以下的命令創建包含多path的ingress
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test-ingress
namespace: test01
spec:
ingressClassName: nginx
rules:
- host: nginx-test.k8s.com
http:
paths:
- backend:
service:
name: nginx-test
port:
number: 80
path: /
pathType: Prefix
- backend:
service:
name: nginx-test-02
port:
number: 80
path: /test02
pathType: Prefix
EOF
注意:就是在paths中,增加path的部分
- backend:
service:
name: nginx-test-02
port:
number: 80
path: /test02
pathType: Prefix
生成的ingress-nginx-controller中的nginx的配置
server {
server_name nginx-test.k8s.com ;
listen 80 ;
listen [::]:80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
location /test02/ {
set $namespace "test01";
set $ingress_name "nginx-test-ingress";
set $service_name "nginx-test-02";
set $service_port "80";
set $location_path "/test02";
set $global_rate_limit_exceeding n;
...中間省略...
}
location = /test02 {
set $namespace "test01";
set $ingress_name "nginx-test-ingress";
set $service_name "nginx-test-02";
set $service_port "80";
set $location_path "/test02";
set $global_rate_limit_exceeding n;
...中間省略...
}
location / {
set $namespace "test01";
set $ingress_name "nginx-test-ingress";
set $service_name "nginx-test";
set $service_port "80";
set $location_path "/";
set $global_rate_limit_exceeding n;
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = false,
ssl_redirect = true,
force_no_ssl_redirect = false,
preserve_trailing_slash = false,
use_port_in_redirects = false,
global_throttle = { namespace = "", limit = 0, window_size = 0, key = { }, ignored_cidrs = { } },
})
balancer.rewrite()
plugins.run()
}
發現生成了包括多個location的nginx的配置
OK,以上的過程,就介紹了,如何配置包含多個path的ingress.
3、注意
如果在path中配置了多個"/",會怎么樣
我們通過以下的配置做個實驗
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test-ingress
namespace: test01
spec:
ingressClassName: nginx
rules:
- host: nginx-test.k8s.com
http:
paths:
- backend:
service:
name: nginx-test
port:
number: 80
path: /
pathType: Prefix
- backend:
service:
name: nginx-test-02
port:
number: 80
path: /
pathType: Prefix
EOF
查看ingress-nginx-controller中的nginx.conf配置
## start server nginx-test.k8s.com
server {
server_name nginx-test.k8s.com ;
listen 80 ;
listen [::]:80 ;
listen 443 ssl http2 ;
listen [::]:443 ssl http2 ;
set $proxy_upstream_name "-";
ssl_certificate_by_lua_block {
certificate.call()
}
location / {
set $namespace "test01";
set $ingress_name "nginx-test-ingress";
set $service_name "nginx-test";
set $service_port "80";
set $location_path "/";
set $global_rate_limit_exceeding n;
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = false,
ssl_redirect = true,
force_no_ssl_redirect = false,
preserve_trailing_slash = false,
use_port_in_redirects = false,
global_throttle = { namespace = "", limit = 0, window_size = 0, key = { }, ignored_cidrs = { } },
})
balancer.rewrite()
plugins.run()
}
發現只有上面的“/”是生效的。
OK,我們在更改下順序
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test-ingress
namespace: test01
spec:
ingressClassName: nginx
rules:
- host: nginx-test.k8s.com
http:
paths:
- backend:
service:
name: nginx-test-02
port:
number: 80
path: /
pathType: Prefix
- backend:
service:
name: nginx-test
port:
number: 80
path: /
pathType: Prefix
EOF
查看ingress-nginx-controller中的nginx.conf配置
location / {
set $namespace "test01";
set $ingress_name "nginx-test-ingress";
set $service_name "nginx-test-02";
set $service_port "80";
set $location_path "/";
set $global_rate_limit_exceeding n;
rewrite_by_lua_block {
lua_ingress.rewrite({
force_ssl_redirect = false,
ssl_redirect = true,
force_no_ssl_redirect = false,
preserve_trailing_slash = false,
use_port_in_redirects = false,
global_throttle = { namespace = "", limit = 0, window_size = 0, key = { }, ignored_cidrs = { } },
})
balancer.rewrite()
plugins.run()
}
發現是上面的那個是起作用的。
簡單來說,如果有path,也就是location重復的,那么上面的那個會生效,后面的不生效。