技术教程

Knative 云原生应用开发指南 Version 0.11

服务路由管理

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

Knative Serving 的默认域名 example.com

首先需要部署一个 Knative Service。如果你已经有了一个 Knative 集群,那么直接把下面的内容保存到 login-service.yaml 文件中。然后执行一下 kubectl apply -f login-service.yaml 即可把 login-service 服务部署到 default namespace 中。

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: login-service
spec:
  template:
    metadata:
      labels:
        app: login-service
      annotations:
        autoscaling.knative.dev/target: "10"
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
          env:
            - name: TARGET
              value: "Login Service"

现在我们来看一下 Knative Service 自动生成的域名配置:

└─# kubectl -n default get ksvc
NAME    URL                                   LATESTCREATED   LATESTREADY   READY   REASON
login-service   http://login-service.default.example.com   login-service-wsnvc     login-service-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
  • 访问 login-service 服务
└─# curl -H "Host: login-service.default.example.com" http://47.95.191.136/
Hello Login Service

如果想要在浏览器中访问 login-service 服务需要先做 host 绑定,把域名 login-service.default.example.com 指向 47.95.191.136 才行。这种方式还不能对外提供服务。下面接着介绍一下如何把默认的 example.com 改成我们自己的域名。

使用自定义主域名

在阿里云 Knative 用户可以通过控制台配置自定义域名,并基于Path和Header进行路由转发设置。如图所示: undefined 假设我们自己的域名是:knative.kuberun.com,现在执行 kubectl edit cm config-domain --namespace knative-serving 如下图所示,添加 knative.kuberun.com 到 ConfigMap 中,然后保存退出就完成了自定义主域名的配置。

undefined 再来看一下 Knative Service 的域名, 如下所示已经生效了。

└─# kubectl -n default get ksvc
NAME    URL                                              LATESTCREATED   LATESTREADY   READY   REASON
login-service   http://login-service.default.knative.kuberun.com   login-service-wsnvc     login-service-wsnvc   True

泛域名解析 Knative Service 默认生成域名的规则是 servicename.namespace.use-domain 。所以不同的 namespace 会生成不同的子域名,每一个 Knative Service 也会生成一个唯一的子域名。为了保证所有的 Service 服务都能在公网上面访问到,需要做一个泛域名解析。把 *.knative.kuberun.com 解析到 Istio Gateway 47.95.191.136 上面去。如果你是在阿里云(万网)上面购买的域名,你可以通过如下方式配置域名解析: undefined

现在直接通过浏览器访问 http://login-service.default.knative.kuberun.com/ 就可以直接看到 login-service 服务了: undefined

自定义域名

登录阿里云容器服务控制台,进入【Knative】-【组件管理】,点击 Serving 组件【详情】。 undefined 进入详情之后,选择域名配置,添加自定义域名:test.knative.kuberun.com。点击 【确定】进行保存。 undefined

配置路由转发

进入【Knative】-【服务管理】控制台,选择对应的服务。这里我们对 Login-Service 服务 以及 Search-Service 服务分别设置不同的 Path 进行访问。

Login-Service 服务路由转发配置

选择 Login-Service 服务, 选择 路由转发 页签,点击 配置, 选择test.knative.kuberun.com域名,配置路径:/login。点击 确定 进行保存。 undefined

接下了继续配置Search-Service 服务路由规则。

Search-Service 服务路由转发配置

选择 Search-Service 服务, 选择 路由转发 页签,点击 配置, 选择test.knative.kuberun.com域名,配置路径:/search。点击 确定 进行保存。 undefined

服务访问

以上路由转发配置完成之后,我们开始测试一下服务访问: 在浏览器中输入:http://test.knative.kuberun.com/login 可以看到输出:Hello Login Service! undefined

在浏览器中输入:http://test.knative.kuberun.com/search 可以看到输出:Hello Search Service! undefined

基于 Path + Header 进行路由转发

选择 Login-Service 服务, 选择 路由转发 页签,点击 配置,这里我们加上Header 配置:foo=bar。点击 确定 进行保存。 undefined

访问 http://test.knative.kuberun.com/login 发现服务 404 不可访问。 undefined

说明基于Header是生效的,下面我们在访问请求中通过 ModHeader 插件配置上Header:foo=bar. undefined 配置完成之后,我们再一次访问服务:http://test.knative.kuberun.com/login。 undefined 服务访问 OK。这样我们就完成了基于 Path + Header 路由转发配置

总结

以上主要围绕 Knative Service 域名配置展开介绍了 Knative Serving 的路由管理,并且通过阿里云 Knative 控制台让你更轻松、快捷的实现自定义域名及路由规则,以打造生产可用的服务访问。