你的位置:开元ky888棋牌官网APP下载 > 技术知识 > APISIX Ingress 低档应用之 Url Rewrite

APISIX Ingress 低档应用之 Url Rewrite

发布日期:2022-08-06 22:16    点击次数:78

前面我们相识了 APISIX Ingress 的根抵应用,一样我们来介绍下怎么应用 APISIX 来实现 URL Rewrite 操作,照旧之前面测试用过的 Nexus 应用为例举行分化,经由过程 ApisixRoute 工具来设置服务路由,对应的资源清单以下所示:

# nexus.yaml apiVersion: apps/v1 kind: Deployment metadata:   name: nexus   labels:     app: nexus spec:   selector:     matchLabels:       app: nexus   template:     metadata:       labels:         app: nexus     spec:       containers:       - image: cnych/nexus:3.20.1         imagePullPolicy: IfNotPresent         name: nexus         ports:         - containerPort: 8081 --- apiVersion: v1 kind: Service metadata:   labels:     app: nexus   name: nexus spec:   ports:   - name: nexusport     port: 8081     targetPort: 8081   selector:     app: nexus --- apiVersion: apisix.apache.org/v2beta2 kind: ApisixRoute metadata:   name: nexus   namespace: default spec:   http:     - name: root       match:         hosts:           - ops.qikqiak.com         paths:           - "/*"       backends:       - serviceName: nexus         servicePort: 8081 

间接创立上面的资源工具即可:

➜ kubectl apply -f nexus.yaml ➜ kubectl get apisixroute NAME    HOSTS                   URIS     AGE nexus   ["ops.qikqiak.com"]   ["/*"]   39s ➜ kubectl get pods -l app=nexus NAME                     READY   STATUS    RESTARTS   AGE nexus-6f78b79d4c-b79r4   1/1     Running   0          48s ➜ kubectl get svc -l app=nexus NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE nexus   ClusterIP   10.102.53.243   <none>        8081/TCP   58s 

陈列实现后,我们痛处 ApisixRoute 工具中的设置,只需要将域名 ops.qikqiak.com 剖析到 node2 节点(上面经由过程 port-forward 表露了 80 端口)即可拜访:

url rewrite

一样假定今朝需要经由过程一个子门路来拜访 Nexus 应用的话又该当怎么来实现呢?比喻经由过程 http://ops.qikqiak.com/nexus 来拜访我们的应用,首先我们必然需要编削 ApisixRoute 工具中成家的 paths 门路,将其编削为 /nexus:

apiVersion: apisix.apache.org/v2beta2 kind: ApisixRoute metadata:   name: nexus   namespace: default spec:   http:     - name: root       match:         hosts:           - ops.qikqiak.com         paths:           - "/nexus*"       backends:       - serviceName: nexus         servicePort: 8081 

更新后我们可以或许经由过程 http://ops.qikqiak.com/nexus 拜访应用:

仔细阐发缔造良多动静资源404了,这是因为今朝我们只成家了 /nexus 的要求,而我们的动静资源是 /static 门路扫尾的,固然就成家不到了,所以就出现了404,所以我们只需要加之这个 /static 门路的成家就能了,一样更新 ApisixRoute 工具,新增 /static/* 门路支持:

apiVersion: apisix.apache.org/v2beta2 kind: ApisixRoute metadata:   name: nexus   namespace: default spec:   http:     - name: root       match:         hosts:           - ops.qikqiak.com         paths:           - "/nexus*"           - "/static/*"       backends:       - serviceName: nexus         servicePort: 8081 

更新后缔造诚然动静资源可以或许畸形拜访了,然则当我们拜访 http://ops.qikqiak.com/nexus 的岁月依然会出现 404 舛误。

这是因为我们这里是将 /nexus 门路的要求间接路由到后端服务去了,尔后端服务没有对该门路做任那边理惩罚,所以也就是404的照顾了,在从前 ingress-nginx 或许 traefik 中我们是经由过程 url 重写来实现的,而在 APISIX 中一样可以或许实现这个处理惩罚,相当于在要求在真正抵达上游服务从前将要求的 url 重写到根目录就能了,这里我们需要用到 proxy-rewrite 这个插件(需要确保在按部就班的岁月已经包孕了该插件),proxy-rewrite 是上游代理信息重写插件,支持对 scheme、uri、host 等信息的重写,该插件可设置的属性以下表所示:

我们今朝的需要是停留将全体 /nexus 上面的要求都重写到根门路 / 上面去,所以我们该当应用 regex_uri 属性,转发到上游的新 uri 地点, 应用正则剖明式成家来自客户端的 uri,当作家告成后应用模板替代转发到上游的 uri, 未成家告成时将客户端要求的uri 转发至上游,从头编削后的 ApisixRoute 工具以下所示,技术知识新增 plugins 属性来设置插件:

apiVersion: apisix.apache.org/v2beta2 kind: ApisixRoute metadata:   name: nexus   namespace: default spec:   http:     - name: root       match:         hosts:           - ops.qikqiak.com         paths:           - "/nexus*"           - "/static/*"       plugins:       - name: proxy-rewrite         enable: true         config:           regex_uri: ["^/nexus(/|$)(.*)", "/$2"]       backends:       - serviceName: nexus         servicePort: 8081 

这里我们启用一个 proxy-rewrite 插件,并且将全体 /nexus 门路的要求都重写到了 / 跟门路下,从头更新后再次拜访 http://ops.qikqiak.com/nexus 该当就能畸形拜访了:

只要最后一个小成就了,从阅读器网络要求中可以或许看出我们没有去成家 /service 这个门路的要求,只需要设置上该门路即可,以下所示:

apiVersion: apisix.apache.org/v2beta2 kind: ApisixRoute metadata:   name: nexus   namespace: default spec:   http:     - name: root       match:         hosts:           - ops.qikqiak.com         paths:           - "/nexus*"           - "/static/*"           - "/service/*"       plugins:       - name: proxy-rewrite         enable: true         config:           regex_uri: ["^/nexus(/|$)(.*)", "/$2"]       backends:       - serviceName: nexus         servicePort: 8081 

今朝从头拜访子门路就实现畸形了:

redirect

今朝当我们拜访 http://ops.qikqiak.com/nexus 或许 http://ops.qikqiak.com/nexus/ 的岁月均可以或许失去畸形的终局,普通来说我们兴许停留兴许统一拜访门路,比喻拜访 /nexus 子门路的岁月可以或许自动跳转到 /nexus/ 以 Splash 扫尾的门路上去。一样要实现该需要我们只需要应用一个名为 redirect 的插件即可,该插件是 URI 重定向插件,可设置的属性以下所示:

要实现我们的需要间策应用 regex_uri 这个属性即可,只需要去成家 /nexus 的要求,尔后举行跳转即可,更新 ApisixRoute 工具:

apiVersion: apisix.apache.org/v2beta2 kind: ApisixRoute metadata:   name: nexus   namespace: default spec:   http:     - name: root       match:         hosts:           - ops.qikqiak.com         paths:           - "/nexus*"           - "/static/*"           - "/service/*"       plugins:       - name: proxy-rewrite         enable: true         config:           regex_uri: ["^/nexus(/|$)(.*)", "/$2"]       - name: redirect         enable: true         config:           regex_uri: ["^(/nexus)$", "$1/"]       backends:       - serviceName: nexus         servicePort: 8081 

我们新启用了一个 redirect 插件,并设置 regex_uri: ["^(/nexus)$", "$1/"],这样当拜访 /nexus 的岁月会自动跳转到 /nexus/ 门路上面去。

一样假定我们想要重定向到 https,只需要在该插件上面设置 config.http_to_https=true 即可:

# ... 其他部份省略 - name: redirect   enable: true   config:     http_to_https: true 
tls

经由过程应用上面的 redirect 插件设置 http_to_https 可以或许将要求重定向到 https 上去,然则我们今朝并无对我们的 ops.qikqiak.com 设置 https 证书,这里我们就需要应用 ApisixTls 工具来举行证书打点。

我们先应用 openssl 创立一个自签名的证书,固然你有正规 CA 机构置办的证书的话间接将证书下载上去应用即可:

➜ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=ops.qikqiak.com" 

尔后经由过程 Secret 工具来引用上面创立的证书文件:

# 要留心证书文件名称必须是 tls.crt 和 tls.key ➜ kubectl create secret tls ops-tls --cert=tls.crt --key=tls.key 

尔后就能创立一个 ApisixTls 资源工具,引用上面的 Secret 即可:

apiVersion: apisix.apache.org/v1 kind: ApisixTls metadata:   name: ops-tls spec:   hosts:     - ops.qikqiak.com   secret:     name: ops-tls     namespace: default 

同时 APISIX TLS 还可以或许设置 spec.client,用于举行 mTLS 双向认证的设置。上面的资源工具创立实现后,即可拜访 https 服务了(chrome 阅读器默认会限定不安好的证书,只需要在页面上输入 thisisunsafe 即可拜访了):

并且当拜访 http 的岁月也会自动跳转到 https 上面去,其他我们还可以或许联结 cert-manager 来实现自动化的 https。

完备的资源工具以下所示:

apiVersion: apisix.apache.org/v2beta2 kind: ApisixRoute metadata:   name: nexus   namespace: default spec:   http:     - name: root       match:         hosts:           - ops.qikqiak.com         paths:           - "/nexus*"           - "/static/*"           - "/service/*"       plugins:       - name: proxy-rewrite         enable: true         config:           regex_uri: ["^/nexus(/|$)(.*)", "/$2"]       - name: redirect         enable: true         config:           regex_uri: ["^(/nexus)$", "$1/"]       - name: redirect         enable: true         config:           http_to_https: true       backends:       - serviceName: nexus         servicePort: 8081 --- apiVersion: apisix.apache.org/v1 kind: ApisixTls metadata:   name: ops-tls spec:   hosts:     - ops.qikqiak.com   secret:     name: ops-tls     namespace: default 

对付 APISIX Ingress 更多低档用法请延续关注后续文章。

 



Powered by 开元ky888棋牌官网APP下载 @2013-2022 RSS地图 HTML地图