写点什么

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

2019 年 8 月 20 日

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: v1kind: Namespacemetadata:  name: helloworld
---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: hello namespace: helloworldspec: 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 ksvcNAME    URL                                   LATESTCREATED   LATESTREADY   READY   REASONhello   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 ksvcNAME    URL                                              LATESTCREATED   LATESTREADY   READY   REASONhello   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/v1alpha3kind: VirtualServicemetadata: name: hello-ingress-route namespace: knative-servingspec: 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: v1kind: Namespacemetadata:  name: blog
---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: hello-blog namespace: blogspec: 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 ksvcNAME    URL                                        LATESTCREATED   LATESTREADY   READY   REASONhello   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/v1alpha3kind: VirtualServicemetadata:  name: hello-ingress-route  namespace: knative-servingspec:  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 钉钉群(群号 : 23302777)进行深入交流


相关文章:


《初识 Knative:跨平台的 Serverless 编排框架》


《Knative 初体验:Serving Hello World》


《Knative 初体验:Eventing Hello World》


《Knative 初体验:Build Hello World》


《Knative 初体验:CI/CD 极速入门》


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


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


2019 年 8 月 20 日 08:3814008
用户头像
阿里云容器平台 ACK,企业云原生转型最佳搭档

发布了 43 篇内容, 共 17.3 次阅读, 收获喜欢 69 次。

关注

评论

发布
暂无评论
发现更多内容

Hadoop集群搭建-01前期准备

虚拟世界的懒猫

hadoop hdfs mapreduce zookeeper centos

【终于解决】ubuntu19安装nvidia驱动后屏幕亮度默认最亮不可调节

虚拟世界的懒猫

ubuntu 英伟达

当 Redis 发生高延迟时,到底发生了什么

程序员历小冰

redis Linux 延迟

做好仓储控制系统(WCS)的关键

阿喜伯

仓储控制系统 WCS

程序员,你最重要的选择是和谁结婚,你最重要的能力是赚钱,钱和女友两手抓

陆陆通通

程序员 赚钱 女朋友 找对象

Hadoop集群搭建-03编译安装hadoop

虚拟世界的懒猫

hadoop centos7

程序员陪娃漫画系列——喂药

孙苏勇

程序员 生活 程序员人生 陪伴 漫画

让你写出来的代码像诗一样优美!《Java开发手册》PDF下载

Kareza

Java 阿里巴巴 Java规范 Java开发手册

如何无缝的将Flutter引入现有应用?

稻子

flutter ios android 开源 移动应用

安装VMware16兼容Hyper-v+WSL2+Docker+解决0x80370102报错

虚拟世界的懒猫

Docker vmware vm hyper-v WSL2

为什么开源是基础软件的未来

顾钧

开源 基础软件

管理信息系统课程基础知识

Sicolas Flamel

机器学习中常用的处理手段

子夜

学习

利用Translate ToolKit 2.5.0 API构建Flask web app

虚拟世界的懒猫

Python nginx flask uwgsi translate

跬步贴|5分钟搞定缓存击穿问题

架构师跬步营

思考如何节省时间,节省出时间进行思考

伯薇

思考 时间管理 思考力 工作效率 提升效率

Zookeeper选举机制

tunsuy

zookeeper 开源 源码分析 分布式协同

idea+spring4+springmvc+mybatis+maven实现简单增删改查CRUD

虚拟世界的懒猫

spring mybatis ssm springmvc java8

Hadoop集群搭建-04安装配置HDFS

虚拟世界的懒猫

hadoop

你真的理解 Java 的基础数据类型吗

Rayjun

Java

张小龙 的 22 年和微信的 8 年

池建强

微信 张小龙

Hadoop集群搭建-02安装配置Zookeeper

虚拟世界的懒猫

hadoop zookeeper centos7

选赵敏还是选小昭,这可真是个问题 | Decision Tree

张利东

Python 学习 算法 决策树

向 "忙忙碌碌泯然众人" say no

Sicolas Flamel

时间分配 时间管理

Hadoop集群搭建-05安装配置YARN

虚拟世界的懒猫

hadoop

配置微软Azure大数据HDInsight云集群

虚拟世界的懒猫

microsoft 大数据 微软 azure hdinsght

容器日志采集利器:Filebeat深度剖析与实践

傅轶

Kubernetes 容器 云原生 日志 Filebeat

消息队列Kafka - Kafka中的选举

Java收录阁

kafka

从“成为作者”到“立即创作”:开启你的“写作极客”生活

岛乾坤

写作

centos6搭建NEXUSphp pt私人种子站

虚拟世界的懒猫

centos nexusphp pt bt

万字破解云原生可观测性

谭建

云原生 APM 可观测性 链路追踪 Skywalking

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