Knative Serving 之路由管理和 Ingress
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相关推荐
- Knative 基本功能深入剖析:Knative Serving 之服务路由管理
导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理.文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 ...
- Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
Knative Serving 默认情况下,提供了开箱即用的快速.基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA).下面带你体验如何在 Knative 中玩转 Au ...
- 从HelloWorld看Knative Serving代码实现
为什么80%的码农都做不了架构师?>>> 摘要: Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和函数的部署并提供服务.我们从部署 ...
- Knative Serving 健康检查机制分析
作者| 阿里云智能事业群技术专家牛秋霖(冬岛) 导读:从头开发一个Serverless引擎并不是一件容易的事情,今天咱们就从Knative的健康检查说起.通过健康检查这一个点来看看Serverles ...
- Knative 基本功能深入剖析:Knative Serving 的流量灰度和版本管理
作者|冬岛 阿里云技术专家 本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision.如何在不同的 Revision 之间按照流 ...
- OpenShift 4 - Knative教程 (3) 了解Knative Serving的核心对象
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 Knative Serving的核心对象 创建Knative Servin ...
- Serverless Knative Serving弹性扩缩容实践整理
文章目录 (一)基础 (1)认识 (2)Knative Serving对象模型 (3)knative-serving (4)Knative的扩缩容流程原理 (二)弹性扩缩容实践 (1)自动扩缩容类型选 ...
- Knative Serving 进阶: Knative Serving SDK
作者 | 阿里云智能事业群技术专家 牛秋霖(冬岛) 导读:通过前面的一系列文章你已经知道如何基于 kubectl 来操作 Knative 的各种资源.但是如果想要在项目中集成 Knative 仅仅使用 ...
- Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件
为什么80%的码农都做不了架构师?>>> 作者| 阿里云智能事业群高级开发工程师 元毅 Knative 主要由 Build.Serving 和 Eventing 三大核心组件构 ...
最新文章
- 某程序员吐槽:回老家被乡镇公务员表哥怼,催他赶紧上岸!表哥月薪3800,而他年包90w!...
- 大专生如何报考MBA
- SPARK安装一:Windows下VirtualBox安装CentOS
- 《零基础看得懂的C语言入门教程 》——(十)C语言的指针原来是这样
- SAP License:SAP打油诗
- linux 删除文件 例外,linux 删除文件,某个文件例外
- java 重定向和转发的区别
- 数字电路实验怎么接线视频讲解_铆钉是怎么被铆接的,多种铆钉动画演示(内附视频讲解)...
- 模2除法与二进制除法
- php实时聊天源码 仿手机QQ,php加swoole加mysql 仿webqq及时聊天
- pyhon实现excel的转置
- win10设置HTML桌面背景,win10系统分屏设置不同壁纸教程
- 核磁共振谱仪定义、发展及基本原理
- 李沐论文精读系列五:DALL·E2(生成模型串讲,从GANs、VE/VAE/VQ-VAE/DALL·E到扩散模型DDPM/ADM)
- IDEA坑: log.info爆红和Mapper没有跳转箭头(插件安装)
- 用Python爬取并分析Box Office Mojo网站2019年每日票房数据
- 【Java】 # 使用java调用MySQL的函数、存储过程
- 基于ORA-12170 TNS 连接超时解决办法详解
- 餐厅到店点餐系统(APP)
- 论文写作 10: 文献综述不可进行简单的罗列
热门文章
- java造型_java造型_java向上造型有什么作用为什么要造型有什么效果_彩妆阁
- 腾讯云服务器性能测试心得经验总结
- java sha1加密ascii码_如何使用加密芯片完成SHA1摘要运算
- cups共享linux打印机_linux入门-映射网络驱动器
- 如何避免_如何避免变频器受负载冲击
- xadmin的html文件,django xadmin(2) 在xadmin基础上完成自定义页面
- python 切片器_PowerBI-将日期显示为星期作为切片器
- python json解析 超过对象_json序列化数据超出最大值(maxJsonLength)
- ssm java上传图片预览_ssm文件上传_上传图片
- 计算机网络 --- 数据链路层CSMA/CD协议