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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理。文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 path 关联到不同的 Knative Service 。

导读:本文主要围绕 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 中,然后保存退出就完成了自定义主域名的配置。

c1

再来看一下 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 上面去。如果你是在阿里云(万网)上面购买的域名,你可以通过如下方式配置域名解析:

c2

现在直接通过浏览器访问 http://hello.helloworld.serverless.kuberun.com/ 就可以直接看到 helloworld 服务了:

c3

自定义服务域名

刚才我们给 Knative 指定了一个主域名,使得 Service  基于主域名生成自己的唯一域名。但自动生成的域名不是很友好,比如刚才部署的 helloworld 的域名 hello.helloworld.serverless.kuberun.com 对于普通用户来说意义不明显、不好记忆。

如果能通过 hello.kuberun.com 访问 hello world 服务那就完美了,接下来将会介绍实现方法:

  • 先在万网上面修改域名解析,把 hello.kuberun.com  的 A 记录指向  Istio Gateway 47.95.191.136;

c4

  • 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 服务了:

c5

基于路径的服务转发

真实线上服务的场景可能是一个路径后端对应着一个应用,现在我们对刚才的 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 就可以访问刚刚部署的服务了:

c6

这是默认域名,我们的需求是想要通过 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 ,如下所示:

c7

小结

本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理。通过本文的介绍,您应该了解到如下内容:

  • Knative Service 默认的主域名是 example.com, 所有 Knative Service 生成的独立域名都是这个主域名的子域名;
  • Knative Service 生成的域名规范;
  • 如何配置 Knative Service 使用自定义的主域名,以及如何配置公网域名解析;
  • 如何基于 Istio VirtualService 实现 Knative Service 的个性化 Ingress 配置,提供生产级别的服务路由。

欢迎加入 Knative 交流群

c8

相关文章
|
Kubernetes Serverless Perl
Knative ServerlessService 介绍
ServerlessService 简称: SKS, 全称:Serverless Kubernetes-style Service 社区文档: https://docs.google.com/document/d/1byHQL6kePDZq6Qt4MqB-g4BDfiaJsfDPGb5oJEK1Ldo/edit?ts=5c81373b# https://docs.
2763 0
|
域名解析 Kubernetes 负载均衡
Knative 化繁为简之道:应用部署与访问
Knative 是一款基于 Kubernetes 之上的开源 Serverless 框架,其目标之一是降低用户服务部署及使用门槛。在此基础上提还供了其它丰富的功能,如自动扩缩容,路由流量,金丝雀发布以及事件驱动等。在本文中,我们首先 Kubernetes 上部署应用并进行服务访问,然后在 Knative 中部署同样的服务并访问,以此对比来看Knative如何降低了服务部署及访问的门槛。
5989 0
Knative 化繁为简之道:应用部署与访问
|
存储 弹性计算 缓存
开源FaaS平台(四):Fission
Kubernetes中文社区对Fission的描述是:Fission是一款基于Kubernetes的FaaS框架。通过Fission可以轻而易举地将函数发布成HTTP服务。它通过读取用户的源代码,抽象出容器镜像并执行。同时它帮助开发者们减轻了Kubernetes的学习负担,开发者无需了解太多Kubernetes也可以搭建出实用的服务。Fission可以与HTTP路由、Kubernetes Events和其他的事件触发器结合,所有这些函数都只有在运行的时候才会消耗CPU和内存。
736 1
|
Kubernetes 搜索推荐 前端开发
containerd 镜像构建工具 -- nerdctl 和 buildkit
containerd 镜像构建工具 -- nerdctl 和 buildkit
3253 0
|
Serverless 容器 Kubernetes
从ABAP Netweaver的SICF到SAP Kyma的Lambda Function
ABAP Netweaver里的事务码SICF是Jerry做原型开发时非常喜欢使用的一个工具:但凡遇到需要把ABAP系统里的资源以服务的方式暴露出来的场景,Jerry都喜欢在SICF里创建一个服务节点然后把业务逻辑写进去。
2247 0
|
API
[LeetCode]--374. Guess Number Higher or Lower
We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to guess which number I picked. Every time you guess wrong, I’ll tell you whether the number i
1092 0
|
机器学习/深度学习
[LeetCode]--50. Pow(x, n)
Implement pow(x, n). 其实这个题递归和非递归应该都不难实现,就是边界值的问题。 public double myPow(double x, int n) { if (n == 0) return 1.0; double res = 1.0; if (n < 0) {
977 0
|
负载均衡 算法 Java
咱们从头到尾说一次 Java 的垃圾回收
之前上学的时候有一个梗,说在食堂里吃饭,吃完把餐盘端走清理的是 C++ 程序员,吃完直接就走的是 Java 程序员。确实,在 Java 的世界里,似乎我们不用对垃圾回收那么的关注。很多初学者不懂 GC,也能写出一个能用甚至还不错的程序或系统。
12971 0
|
算法 Perl 容器
Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
Knative Serving 默认情况下,提供了开箱即用的快速、基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA)。下面带你体验如何在 Knative 中玩转 Autoscaler。
|
机器学习/深度学习 监控 TensorFlow
利用阿里云容器服务打通TensorFlow持续训练链路
利用阿里云容器服务打通TensorFlow持续训练链路
20057 0

相关产品

  • 云消息队列 MQ
  • 云消息队列 Kafka 版
  • 微服务引擎