Knative 默认会为每一个 Service 生成一个域名,并且 Istio Gateway 要根据域名判断当前的请求应该转发给哪个 Knative Service。Knative 默认使用的主域名是 example.com,这个域名是不能作为线上服务的。本文我首先介绍一下如何修改 默认主域名,然后再深入一层介绍如何添加自定义域名以及如何根据 path 关联到不同的 Knative Service。

Knative Serving 的默认域名 example.com

首先需要部署一个 Knative Service。如果你已经有了一个 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: hellonamespace: helloworld
spec:template:metadata:labels:app: helloannotations:autoscaling.knative.dev/target: "10"spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/simple-app:132e07c14c49env:- name: TARGETvalue: "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.localretries:attempts: 3perTryTimeout: 10m0sroute:- destination:host: istio-ingressgateway.istio-system.svc.cluster.localport:number: 80weight: 100timeout: 10m0swebsocketUpgrade: 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-blognamespace: blog
spec:template:metadata:labels:app: helloannotations:autoscaling.knative.dev/target: "10"spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/simple-app:132e07c14c49env:- name: TARGETvalue: "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-routenamespace: knative-serving
spec:gateways:- knative-ingress-gatewayhosts:- hello.helloworld.serverless.kuberun.com- hello.kuberun.comhttp:- match:- uri:prefix: "/blog"rewrite:authority: hello-blog.blog.svc.cluster.localretries:attempts: 3perTryTimeout: 10m0sroute:- destination:host: istio-ingressgateway.istio-system.svc.cluster.localport:number: 80weight: 100- match:- uri:prefix: "/"rewrite:authority: hello.helloworld.svc.cluster.localretries:attempts: 3perTryTimeout: 10m0sroute:- destination:host: istio-ingressgateway.istio-system.svc.cluster.localport:number: 80weight: 100timeout: 10m0swebsocketUpgrade: 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 Serving 之路由管理和 Ingress相关推荐

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

    导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理.文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 ...

  2. Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler

    Knative Serving 默认情况下,提供了开箱即用的快速.基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA).下面带你体验如何在 Knative 中玩转 Au ...

  3. 从HelloWorld看Knative Serving代码实现

    为什么80%的码农都做不了架构师?>>>    摘要: Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和函数的部署并提供服务.我们从部署 ...

  4. Knative Serving 健康检查机制分析

    作者|  阿里云智能事业群技术专家牛秋霖(冬岛) 导读:从头开发一个Serverless引擎并不是一件容易的事情,今天咱们就从Knative的健康检查说起.通过健康检查这一个点来看看Serverles ...

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

    作者|冬岛 阿里云技术专家 本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision.如何在不同的 Revision 之间按照流 ...

  6. OpenShift 4 - Knative教程 (3) 了解Knative Serving的核心对象

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 Knative Serving的核心对象 创建Knative Servin ...

  7. Serverless Knative Serving弹性扩缩容实践整理

    文章目录 (一)基础 (1)认识 (2)Knative Serving对象模型 (3)knative-serving (4)Knative的扩缩容流程原理 (二)弹性扩缩容实践 (1)自动扩缩容类型选 ...

  8. Knative Serving 进阶: Knative Serving SDK

    作者 | 阿里云智能事业群技术专家 牛秋霖(冬岛) 导读:通过前面的一系列文章你已经知道如何基于 kubectl 来操作 Knative 的各种资源.但是如果想要在项目中集成 Knative 仅仅使用 ...

  9. Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件

    为什么80%的码农都做不了架构师?>>>    作者| 阿里云智能事业群高级开发工程师 元毅 Knative 主要由 Build.Serving 和 Eventing 三大核心组件构 ...

最新文章

  1. 某程序员吐槽:回老家被乡镇公务员表哥怼,催他赶紧上岸!表哥月薪3800,而他年包90w!...
  2. 大专生如何报考MBA
  3. SPARK安装一:Windows下VirtualBox安装CentOS
  4. 《零基础看得懂的C语言入门教程 》——(十)C语言的指针原来是这样
  5. SAP License:SAP打油诗
  6. linux 删除文件 例外,linux 删除文件,某个文件例外
  7. java 重定向和转发的区别
  8. 数字电路实验怎么接线视频讲解_铆钉是怎么被铆接的,多种铆钉动画演示(内附视频讲解)...
  9. 模2除法与二进制除法
  10. php实时聊天源码 仿手机QQ,php加swoole加mysql 仿webqq及时聊天
  11. pyhon实现excel的转置
  12. win10设置HTML桌面背景,win10系统分屏设置不同壁纸教程
  13. 核磁共振谱仪定义、发展及基本原理
  14. 李沐论文精读系列五:DALL·E2(生成模型串讲,从GANs、VE/VAE/VQ-VAE/DALL·E到扩散模型DDPM/ADM)
  15. IDEA坑: log.info爆红和Mapper没有跳转箭头(插件安装)
  16. 用Python爬取并分析Box Office Mojo网站2019年每日票房数据
  17. 【Java】 # 使用java调用MySQL的函数、存储过程
  18. 基于ORA-12170 TNS 连接超时解决办法详解
  19. 餐厅到店点餐系统(APP)
  20. 论文写作 10: 文献综述不可进行简单的罗列

热门文章

  1. java造型_java造型_java向上造型有什么作用为什么要造型有什么效果_彩妆阁
  2. 腾讯云服务器性能测试心得经验总结
  3. java sha1加密ascii码_如何使用加密芯片完成SHA1摘要运算
  4. cups共享linux打印机_linux入门-映射网络驱动器
  5. 如何避免_如何避免变频器受负载冲击
  6. xadmin的html文件,django xadmin(2) 在xadmin基础上完成自定义页面
  7. python 切片器_PowerBI-将日期显示为星期作为切片器
  8. python json解析 超过对象_json序列化数据超出最大值(maxJsonLength)
  9. ssm java上传图片预览_ssm文件上传_上传图片
  10. 计算机网络 --- 数据链路层CSMA/CD协议