Kubernetes Ingress Nginx使用

在此我們不講述如何部署ingress-controller,只演示如何使用ingress之nginx使用。主要演示如何使用ingress nginx實現我們nginx的多樣化配置

案例1(最簡單基本配置):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  namespace: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  tls:
  - hosts:
    - nginx-a.gogen.cn
    secretName: gogen.cn
  rules:
  - host: nginx-a.gogen.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-a
          servicePort: 80
      - path: /.*.(txt|css|doc)
        backend:
          serviceName: nginx-b
          servicePort: 80
      - path: /(api|app)/
        backend:
          serviceName: nginx-c
          servicePort: 80
      - path: /api
        backend:
          serviceName: nginx-d
          servicePort: 80

上面我們定義了一個ingress,並指定運行在test名稱空間(此名名稱空間需要自行創建)。後端我們定義了四組服務,分別爲:nginx-a,nginx-b,nginx-c和nginx-d,並指定服務的port爲80(這四組服務也需要自行定義)。

然後我們ingress的主要配置裏面我們定義了tls證書,並指定可使用的host和需要使用的secret。我們是將證書先導入進secret,然後直接引用secret,導入方法如下:

kubectl create secret tls gogen.cn --cert=1592339__gogen.cn.pem --key=1592339__gogen.cn.key -n test
tls:
- hosts:                        #此爲固定項,是一個列表,我們可以有另外的證書對應其它域名
  - nginx-a.gogen.cn            #此爲列表,必須爲一個域名,一個secret可以對多個域名
  secretName: gogen.cn          #創建secret時指定的名稱

annotations配置:作用於server

# 指定了我們使用後端ingress controller的類別,如果後端有多個ingress controller的時候很重要
kubernetes.io/ingress.class: "nginx"

# 指定我們的rules的path可以使用正則表達式,如果我們沒有使用正則表達式,此項則可不使用
nginx.ingress.kubernetes.io/use-regex: "true"

rules配置:作用於location

rules:
- host: nginx-a.gogen.cn            #相當於定義了nginx的一個server_name
  http:
    paths:
    - path: /                       #一個path就相當於一個location,path的值必須爲“/”。這裏爲匹配的規則,根表示默認請求轉發規則
      backend:
        serviceName: nginx-a        #定義後端的service
        servicePort: 80             #定義後端service的訪問端口,也就是service port指定的端口
    - path: /.*.(txt|css|doc)        #這裏使用的正則(低版本不支持),默認情況下都是不區分大小寫,可以進入到ingress controller查看nginx的配置,這裏相當於把結尾爲txt,css,doc的url請求轉發到nginx-b service
      backend:
        serviceName: nginx-b
        servicePort: 80
    - path: /(api|app)/              #這裏相當於將api和app開頭的目錄語法轉發至nginx-c service
      backend:
        serviceName: nginx-c
        servicePort: 80
    - path: /api                    #這裏相當於將api開頭的url(可以是一個文件,也可以是一個目錄)的請求,轉發到nginx-d
      backend:
        serviceName: nginx-d
        servicePort: 80

說明:上面定義的所有path到ingress controller都將會轉換成nginx location規則,那麼關於location的優先級與nginx一樣

案例2(修改某些參數):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  namespace: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"
spec:
  tls:
  - hosts:
    - nginx-a.gogen.cn
    secretName: gogen.cn
  rules:
  - host: nginx-a.gogen.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-a
          servicePort: 80
      - path: /.*.(txt|css|doc)
        backend:
          serviceName: nginx-b
          servicePort: 80
      - path: /(api|app)/
        backend:
          serviceName: nginx-c
          servicePort: 80
      - path: /api
        backend:
          serviceName: nginx-d
          servicePort: 80

在案例1的基礎上面我們增加了annotations的一些配置

kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/use-regex: "true"

#連接超時時間,默認爲5s
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"

#後端服務器迴轉數據超時時間,默認爲60s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"

#後端服務器響應超時時間,默認爲60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"

#客戶端上傳文件,最大大小,默認爲20m
nginx.ingress.kubernetes.io/proxy-body-size: "10m"

上面我們自定義了四項基本配置,我們還可以定義更多的基本配置,可參考nginx-configuration annotations相關文檔

案例3(rewrite重寫一):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-rewrite-tfs
  namespace: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: https://gogen-test.oss-cn-hangzhou.aliyuncs.com
spec:
  tls:
  - hosts:
    - nginx-a.gogen.cn
    secretName: gogen.cn
  rules:
  - host: nginx-a.gogen.cn
    http:
      paths:
      - path: /v1/tfs
        backend:
          serviceName: nginx-a
          servicePort: 80

上面的方法也是官方的方法,使用“nginx.ingress.kubernetes.io/rewrite-target”來定義。通過上面的的定義代表如果訪問https://nginx-a.gogen.cn/v1/tfs/(.*),則會rewrite爲https://gogen-test.oss-cn-hangzhou.aliyuncs.com/$1,如果有多個path,每個都會被rewrite,所以如果只需要替換單個path(也就是location)的時候單獨使用個manifests寫。這裏我個人感覺不應該如此,研究不透徹,如果有問題的地方還請指出

案例3(rewrite重寫二):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  namespace: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/server-snippet: |
        if ($uri ~* "/v1/tfs/.*") {
            rewrite ^/v1/tfs/(.*)$ https://gogen-test.oss-cn-hangzhou.aliyuncs.com/$1 permanent;
        }
spec:
  tls:
  - hosts:
    - nginx-a.gogen.cn
    secretName: gogen.cn
  rules:
  - host: nginx-a.gogen.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-a
          servicePort: 80
      - path: /.*.(txt|css|doc)
        backend:
          serviceName: nginx-b
          servicePort: 80
      - path: /(api|app)/
        backend:
          serviceName: nginx-c
          servicePort: 80
      - path: /api
        backend:
          serviceName: nginx-d
          servicePort: 80

這裏直接使用了“ginx.ingress.kubernetes.io/server-snippet”來指定配置,這裏可以直接寫nginx的配置,通過這裏可以不止是實現rewrite重寫,還可以實現更多的功能需求,只要是作用於server的都可以


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章