k8s中創建包含多個path(location)的ingress的方法


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重復的,那么上面的那個會生效,后面的不生效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM