1. 程式人生 > >Knative 基本功能深入剖析:Knative Serving 之服務路由管理

Knative 基本功能深入剖析:Knative Serving 之服務路由管理

 

導讀:本文主要圍繞 Knative Service 域名展開,介紹了 Knative Service 的路由管理。文章首先介紹瞭如何修改預設主域名,緊接著深入一層介紹瞭如何新增自定義域名以及如何根據 path 關聯到不同的 Knative Service 。期望通過本文的介紹,能夠幫助您瞭解更多相關內容。

 

Knative 預設會為每一個 Service 生成一個域名,並且 Istio Gateway 要根據域名判斷當前的請求應該轉發給哪個 Knative Service。Knative 預設使用的主域名是 example.com,這個域名是不能作為線上服務的。

 

Knative Serving 的預設域名 example.com

 

首先需要部署一個 Knative Service,可以參考 Knative 初體驗:Serving Hello World。

 

如果你已經有了一個 Knative 叢集,那麼直接把下面的內容儲存到 helloworld.yaml 檔案中。然後執行一下 kubectl apply -f helloworld.yaml  即可把 hello 服務部署到 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!"

 

 

接下來看一下 Knative Service 自動生成的域名配置:

 

└─# kubectl -n helloworld get ksvc
NAME    URL                                   LATESTCREATED   LATESTREADY   READY   REASON
hello   http://hello.helloworld.example.com   hello-wsnvc     hello-wsnvc   True

 

 

現在使用 curl 指定 Host 就能訪問服務了。

 

  • 首先獲取到 Istio Gateway IP;

 

└─# kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"
47.95.191.136

 

 

  • 然後訪問 hello 服務。

 

└─# curl -H "Host: hello.helloworld.example.com" http://47.95.191.136/
Hello World!!

 

 

如果想要在瀏覽器中訪問 hello 服務需要先做 host 繫結,把域名 hello.helloworld.example.com 指向 47.95.191.136 才行。這種方式還不能對外提供服務。

 

配置自定義主域名

 

下面介紹一下如何把預設的 example.com 改成我們自己的域名,假設我們自己的域名是:serverless.kuberun.com,現在執行 kubectl edit cm config-domain --namespace knative-serving ,如下圖所示,新增 serverless.kuberun.com 到 ConfigMap 中,然後儲存退出就完成了自定義主域名的配置。

 

 

再來看一下 Knative Service 的域名, 如下所示已經生效了。

 

└─# 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 預設生成域名的規則是 servicename.namespace.use-domain 。所以不同的 namespace 會生成不同的子域名,每一個 Knative Service 也會生成一個唯一的子域名。為了保證所有的 Service 服務都能在公網上面訪問到,需要做一個泛域名解析。把 *.serverless.kuberun.com  解析到 Istio Gateway 47.95.191.136 上面去。如果你是在阿里雲(萬網)上面購買的域名,你可以通過如下方式配置域名解析:

 

 

現在直接通過瀏覽器訪問 http://hello.helloworld.serverless.kuberun.com/ 就可以直接看到 helloworld 服務了:

 

 

自定義服務域名

 

剛才我們給 Knative 指定了一個主域名,使得 Service  基於主域名生成自己的唯一域名。但自動生成的域名不是很友好,比如剛才部署的 helloworld 的域名 hello.helloworld.serverless.kuberun.com 對於普通使用者來說意義不明顯、不好記憶。

 

如果能通過 hello.kuberun.com 訪問 hello world 服務那就完美了,接下來將會介紹實現方法:

 

  • 先在萬網上面修改域名解析,把 hello.kuberun.com  的 A 記錄指向  Istio Gateway 47.95.191.136;

  • hello.kuberun.com 解析到 Istio Gateway 以後 Istio Gateway 並不知道此時應該轉發到哪個服務,所以還需要配置 VirtualService 告知 Istio 如何轉發。

 

把下面的內容儲存到 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

 

 

現在開啟 http://hello.kuberun.com/ 就能看到 helloworld 服務了:

 

 

基於路徑的服務轉發

 

真實線上服務的場景可能是一個路徑後端對應著一個應用,現在我們對剛才的 hello.kuberun.com 進行一下擴充套件。讓 /blog 開頭的路徑對映到 blog service,其他的路徑還是原樣打到 hello service 上面。

 

把下面的內容儲存到 blog.yaml 檔案,然後執行: kubectl apply -f blog.yaml 即可完成 blog 服務的部署。

 

---
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 服務的預設域名:

 

└─# kubectl -n blog get ksvc
NAME    URL                                        LATESTCREATED   LATESTREADY   READY   REASON
hello   http://hello-blog.blog.serverless.kuberun.com   hello-zbm7q     hello-zbm7q   True

 

 

現在使用瀏覽器開啟 http://hello-blog.blog.serverless.kuberun.com 就可以訪問剛剛部署的服務了:

 

 

這是預設域名,我們的需求是想要通過 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

 

現在就能在瀏覽器中開啟 http://hello.kuberun.com/blog ,如下所示:

小結

 

本文主要圍繞 Knative Service 域名展開,介紹了 Knative Service 的路由管理。通過本文的介紹,您應該瞭解到如下內容:

 

  • Knative Service 預設的主域名是 example.com, 所有 Knative Service 生成的獨立域名都是這個主域名的子域名;
  • Knative Service 生成的域名規範;
  • 如何配置 Knative Service 使用自定義的主域名,以及如何配置公網域名解析;
  • 如何基於 Istio VirtualService 實現 Knative Service 的個性化 Ingress 配置,提供生產級別的服務路由。

 

 

歡迎加入 Knative 交流群

 

相關推薦

Knative 基本功能深入剖析Knative Serving 自動擴縮容 Autoscaler

Knative Serving 預設情況下,提供了開箱即用的快速、基於請求的自動擴縮容功能 - Knative Pod Autos

Knative 基本功能深入剖析Knative Serving 的流量灰度和版本管理

本篇主要介紹 Knative Serving 的流量灰度,通過一個 rest-api 的例子演示如何建立不同的 Revision、

Knative 基本功能深入剖析Knative Serving 服務路由管理

  導讀:本文主要圍繞 Knative Service 域名展開,介紹了 Knative Service 的路由管理。文章首先介紹瞭如何修改預設主域名,緊接著深入一層介紹瞭如何新增自定義域名以及如何根據 path 關聯到不同的 Knative Service

Kafka集群內復制功能深入剖析

部分 replicat 分數 內存 shadow 其他 遞增 裏的 成長 Kafka是一個分布式發布訂閱消息系統。由LinkedIn開發並已經在2011年7月成為apache頂級項目。kafka在LinkedIn, Twitte等許多公司都得到廣泛使用,主要用於:日誌聚合,

Kafka叢集內複製功能深入剖析

Kafka是一個分散式釋出訂閱訊息系統。由LinkedIn開發並已經在2011年7月成為apache頂級專案。kafka在LinkedIn, Twitte等許多公司都得到廣泛使用,主要用於:日誌聚合,訊息佇列,實時監控等。 0.8版本開始,kafka支援叢集內複製,從而提高可用性和系統穩定性,這篇文章主要概

NHibernate3剖析Mapping篇集合映射基礎(3):List映射

mage 專題 類名 sni adding query size top hive 系列引入 NHibernate3.0剖析系列分別從Configuration篇、Mapping篇、Query篇、Session策略篇、應用篇等方面全面揭示NHibernat

IL2CPP 深入講解程式碼生成

上次我們翻譯了由Unity開發人員JOSH PETERSON所寫的、IL2CPP深入講解系列的第一期,現在第二期的中文版也新鮮出爐,歡迎大家分享給身邊的程式設計師。 IL2CPP INTERNALS: A TOUR OF GENERATED CODE 作者:JOSH PETERSON 翻

IL2CPP 深入講解程式碼生成旅(二)

IL2CPP 深入講解:程式碼生成之旅 IL2CPP INTERNALS: A TOUR OF GENERATED CODE 這是IL2CPP深入講解系列的第二篇博文。在這篇文章中,我們會對由il2cpp產生的C++程式碼進行分析。我們會看到託管程式碼中的類在C++中如何

深入理解java虛擬機器自動記憶體管理機制(二)

垃圾收集演算法     java中的記憶體是交給虛擬機器管理的。要實現垃圾回收,必須考慮如下三個問題:     1. 哪些記憶體需要回收?     2. 什麼時候回收?     3. 怎麼回收?     對於第一點,往大了來說,是堆和方法區的記憶體需要回收。往具體了來說,是堆中哪些物件的記憶體可以回

深入理解java虛擬機器自動記憶體管理機制(三)

  各類垃圾收集器與GC日誌 (一)垃圾收集器   一、Serial收集器     最基本、歷史最悠久的收集器。使用複製演算法,用在新生代,通常老年代用Serial old配合。GC過程需要stop the world。適用於client模式下的虛擬機器。   二、ParNew收集器  

深入理解java虛擬機器自動記憶體管理機制(四)

記憶體分配與回收策略 (一)記憶體分配策略     給誰分配?分配到哪?是記憶體分配策略必須解答的問題。     java物件是分配的物件,往大方向來說,是分配到堆中,更細一點說,根據物件不同的特點分配到新生代和老年代區域。如果啟動了本地執行緒分配緩衝,就按執行緒優先在TLAB上分配。     一、新

Spring Cloud 服務發現與呼叫-Ribbon

1. 簡介 Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. F

Python Web開發教你如何解放路由管理,新手教程!

支持 find 擴展 例如 github ces 每天 RoCE 註冊 如何解放路由管理 痛點 隨著業務的飛速發展,API接口越來越多,路由管理文件從幾十號變成幾百上千行,且每次上新服務,需要在修改路由文件代碼,帶來一定的風險。 解決方案 既然路由文件隨著業務的擴展

第 13 篇DRF 框架 API 版本管理

![](https://img2020.cnblogs.com/blog/759200/202007/759200-20200724091014753-1442331804.jpg) 作者:[HelloGitHub-追夢人物](https://www.zmrenwu.com) API 不可能一成不變,

Bash基本功能輸入輸出重定向

com stderr 即將 tdi 輸入輸出 小於號 鍵盤輸入 png 描述 輸入輸出重定向的作用:   輸出重定向就是把命令的執行結果保存到文件,便於查看。   輸入重定向就是把原先由鍵盤的輸入改為由文件輸入。 先了解一下標準輸入輸出: [  設備  ][  設備文件

SpringCloud系列八Zuul 路由訪問(Zuul 的基本使用、Zuul 路由功能、zuul 過濾訪問、Zuul 服務降級)

定義 頭信息 操作 客戶 response art lB face bubuko 1、概念:Zuul 路由訪問 2、具體內容 在現在為止所有的微服務都是通過 Eureka 找到的,但是在很多的開發之中為了規範微服務的使用,提供有一個路由的處理控制組件:Zuul,也就是說 Z

循序漸進學.Net Core Web Api開發系列【8】訪問數據庫(基本功能)

ddb 開發 數據庫的操作 文件 源碼 tps hub produce eating 系列目錄 循序漸進學.Net Core Web Api開發系列目錄 本系列涉及到的源碼下載地址:https://github.com/seabluescn/Blog_WebApi

LINUX系統服務器上搭建DHCP服務,實現兩大基本功能1,自動分配ip;2,手工指定ip

完成 重啟 釋放 p地址 進行 基本功 blog process 自動 在linux系統服務器上搭建DHCP服務,實現兩大基本功能:1,自動分配ip地址;2,手動指定ip地址。首先準備兩臺虛擬機作為實驗對象,一個linux系統作為服務器,一個windows7系統作為客戶機,

Java並發編程深入剖析ThreadLocal

轉載 就是 場景 null return 也有 既然 多個 vat 想必很多朋友對ThreadLocal並不陌生,今天我們就來一起探討下ThreadLocal的使用方法和實現原理。首先,本文先談一下對ThreadLocal的理解,然後根據ThreadLocal類的源碼分析了

軟件工程java實現wordcount基本功能

param process mar 一個 match sig str 需求 war github鏈接:https://github.com/Nancy0611/wc 一:項目相關要求   該項目能統計文本文件的字符數、單詞數和行數。這個項目要求寫一個命令行程序,模仿已有wc