本篇文章給大家分享的是有關(guān)如何理解Knative Serving中的路由管理和 Ingress,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)提供高防服務(wù)器、云服務(wù)器、香港服務(wù)器、多線服務(wù)器托管等
Knative 默認(rèn)會(huì)為每一個(gè) Service 生成一個(gè)域名,并且 Istio Gateway 要根據(jù)域名判斷當(dāng)前的請(qǐng)求應(yīng)該轉(zhuǎn)發(fā)給哪個(gè) Knative Service。Knative 默認(rèn)使用的主域名是 example.com,這個(gè)域名是不能作為線上服務(wù)的。本文我首先介紹一下如何修改 默認(rèn)主域名,然后再深入一層介紹如何添加自定義域名以及如何根據(jù) path 關(guān)聯(lián)到不同的 Knative Service。
首先需要部署一個(gè) Knative Service,可以參考 Knative 初體驗(yàn):Serving Hello World。如果你已經(jīng)有了一個(gè) Knative 集群,那么直接把下面的內(nèi)容保存到 helloworld.yaml 文件中。然后執(zhí)行一下 kubectl apply -f helloworld.yaml
即可把 hello 服務(wù)部署到 helloworld namespace 中。
--- apiVersion: v1 kind: Namespace metadata: name: helloworld --- apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: hello namespace: helloworld spec: template: metadata: labels: app: hello annotations: autoscaling.knative.dev/target: "10" spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/simple-app:132e07c14c49 env: - name: TARGET value: "World!"
現(xiàn)在我們來看一下 Knative Service 自動(dòng)生成的域名配置:
└─# kubectl -n helloworld get ksvc NAME URL LATESTCREATED LATESTREADY READY REASON hello http://hello.helloworld.example.com hello-wsnvc hello-wsnvc True
現(xiàn)在使用 curl 指定 Host 就能訪問服務(wù)了。
首先獲取到 Istio Gateway IP
└─# kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}" 47.95.191.136
訪問 hello 服務(wù)
└─# curl -H "Host: hello.helloworld.example.com" http://47.95.191.136/ Hello World!!
如果想要在瀏覽器中訪問 hello 服務(wù)需要先做 host 綁定,把域名 hello.helloworld.example.com 指向 47.95.191.136 才行。這種方式還不能對(duì)外提供服務(wù)。
下面我來介紹一下如何把默認(rèn)的 example.com 改成我們自己的域名,假設(shè)我們自己的域名是:serverless.kuberun.com,現(xiàn)在執(zhí)行 kubectl edit cm config-domain --namespace knative-serving
如下圖所示,添加 serverless.kuberun.com 到 ConfigMap 中,然后保存退出就完成了自定義主域名的配置。
再來看一下 Knative Service 的域名, 如下所示已經(jīng)生效了。
└─# kubectl -n helloworld get ksvc NAME URL LATESTCREATED LATESTREADY READY REASON hello http://hello.helloworld.serverless.kuberun.com hello-wsnvc hello-wsnvc True
泛域名解析
Knative Service 默認(rèn)生成域名的規(guī)則是 servicename.namespace.use-domain 。所以不同的 namespace 會(huì)生成不同的子域名,每一個(gè) Knative Service 也會(huì)生成一個(gè)唯一的子域名。為了保證所有的 Service 服務(wù)都能在公網(wǎng)上面訪問到,需要做一個(gè)泛域名解析。把 *.serverless.kuberun.com
解析到 Istio Gateway 47.95.191.136 上面去。如果你是在阿里云(萬網(wǎng))上面購買的域名,你可以通過如下方式配置域名解析:
現(xiàn)在直接通過瀏覽器訪問 http://hello.helloworld.serverless.kuberun.com/ 就可以直接看到 helloworld 服務(wù)了:
## 自定義服務(wù)域名
剛才我們給 Knative 指定了一個(gè)主域名,使得 Service 基于主域名生成自己的唯一域名。但自動(dòng)生成的域名不是很友好,比如剛才部署的 helloworld 的域名 hello.helloworld.serverless.kuberun.com
對(duì)于普通用戶來說意義不明顯、不好記憶。
如果能通過 hello.kuberun.com
訪問 hello world 服務(wù)那就完美了,接下來我來介紹實(shí)現(xiàn)方法:
先在萬網(wǎng)上面修改域名解析,把 hello.kuberun.com 的 A 記錄指向 Istio Gateway 47.95.191.136
hello.kuberun.com 解析到 Istio Gateway 以后 Istio Gateway 并不知道此應(yīng)該轉(zhuǎn)發(fā)到哪個(gè)服務(wù),所以還需要配置 VirtualService 告知 Istio 如何轉(zhuǎn)發(fā),把下面的內(nèi)容保存到 hello-ingress-route.yaml
文件:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: hello-ingress-route namespace: knative-serving spec: gateways: - knative-ingress-gateway hosts: - hello.helloworld.serverless.kuberun.com - hello.kuberun.com http: - match: - uri: prefix: "/" rewrite: authority: hello.helloworld.svc.cluster.local retries: attempts: 3 perTryTimeout: 10m0s route: - destination: host: istio-ingressgateway.istio-system.svc.cluster.local port: number: 80 weight: 100 timeout: 10m0s websocketUpgrade: true
現(xiàn)在打開 http://hello.kuberun.com/ 就能看到 helloworld 服務(wù)了:
基于路徑的服務(wù)轉(zhuǎn)發(fā)
真實(shí)線上服務(wù)的場景可能是一個(gè)路徑后端對(duì)應(yīng)著一個(gè)應(yīng)用,現(xiàn)在我們對(duì)剛才的 hello.kuberun.com 進(jìn)行一下擴(kuò)展。讓 /blog 開頭的路徑映射到 blog service,其他的路徑還是原樣打到 hello service 上面。
把下面的內(nèi)容保存到 blog.yaml
文件,然后執(zhí)行: kubectl apply -f blog.yaml
即可完成 blog 服務(wù)的部署。
--- apiVersion: v1 kind: Namespace metadata: name: blog --- apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: hello-blog namespace: blog spec: template: metadata: labels: app: hello annotations: autoscaling.knative.dev/target: "10" spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/simple-app:132e07c14c49 env: - name: TARGET value: "Blog!"
查看 blog 服務(wù)的默認(rèn)域名:
└─# kubectl -n blog get ksvc NAME URL LATESTCREATED LATESTREADY READY REASON hello http://hello-blog.blog.serverless.kuberun.com hello-zbm7q hello-zbm7q True
現(xiàn)在使用瀏覽器打開 http://hello-blog.blog.serverless.kuberun.com 就可以訪問剛剛部署的服務(wù)了:
這是默認(rèn)域名,我們的需求是想要通過 http://hello.kuberun.com/blog 訪問, 所以還需要修改 Istio VirtualService 的配置。如下所示在 hello-ingress-route.yaml 增加 /blog 的配置:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: hello-ingress-route namespace: knative-serving spec: gateways: - knative-ingress-gateway hosts: - hello.helloworld.serverless.kuberun.com - hello.kuberun.com http: - match: - uri: prefix: "/blog" rewrite: authority: hello-blog.blog.svc.cluster.local retries: attempts: 3 perTryTimeout: 10m0s route: - destination: host: istio-ingressgateway.istio-system.svc.cluster.local port: number: 80 weight: 100 - match: - uri: prefix: "/" rewrite: authority: hello.helloworld.svc.cluster.local retries: attempts: 3 perTryTimeout: 10m0s route: - destination: host: istio-ingressgateway.istio-system.svc.cluster.local port: number: 80 weight: 100 timeout: 10m0s websocketUpgrade: true
現(xiàn)在就能在瀏覽器中打開 http://hello.kuberun.com/blog 如下所示:
這里主要圍繞 Knative Service 域名展開介紹了 Knative Service 的路由管理。
以上就是如何理解Knative Serving中的路由管理和 Ingress,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。