Serverless 网关增强:阿里云 Knative 与云产品 ALB 集成

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: Knative 是基于Kubernetes之上提供的一款开源Serverless应用框架,帮助您部署和管理现代化的Serverless工作负载,打造企业级Serverless平台。阿里云容器服务 Knative 集成云产品ALB, 提供超强弹性及大规模七层流量处理能力,同时支持Header、Cookie灰度发布。

Knative 是基于Kubernetes之上提供的一款开源Serverless应用框架,帮助您部署和管理现代化的Serverless工作负载,打造企业级Serverless平台,当前阿里云容器服务已经集成 Knative。

ALB 是专门面向HTTP、HTTPS和QUIC等应用层负载场景的负载均衡服务,具备超强弹性及大规模七层流量处理能力,支持Header、Cookie灰度发布。

本文介绍如何在阿里云容器服务 Knative 集成 ALB。

容器服务 Knative 中网关使用现状

当前在容器服务 Knative 中已经支持社区的 Kourier 网关以及与SLB网关集成,但这 2 种网关在使用中还存在如下问题:

  • Knative 社区提供的 Kourier 网关,但使用原生网关存在如下问题:
  • 社区原生Kourier 网关,部署在用户集群,需要客户自行负责 Kourier 网关的运维,承担资源成本以及运维成本
  • 不支持Cookie灰度发布
  • Knative 已经集成了 SLB 网关,但该网关不支持Header、Cookie 灰度发布。

目标与收益

目标:在 Serverless Framework(Knative)中提供云产品 ALB 网关能力

收益:既带来 Serverless Framework 网关能力增强,又拓展了 ALB Ingress 应用场景。

对接 ALB 方案

基本思路:将 Knative Ingress 转换成 K8s Ingress, 然后通过 ALB Ingress Controller 创建ALB以及转发规则。架构图如下:

关键设计

  • Knative Service、Knative Ingress与K8s Ingress对应关系
  • 一个 Knative Service 对应一个 Knative Ingress ,对应一个 K8s Ingress
  • vswitch 虚拟交换机配置

由于创建ALB需要指定vswitch,因此需要用户在 Knative 中配置vswitch id信息。

knative-serving 命名空间 config-network configmap中配置参数:

apiVersion: v1
kind: ConfigMap
metadata:
data:
  ingress.class: alb.ingress.networking.knative.dev
  vswitch-ids: vsw-2zeqgkyib34gw1fxxx,vsw-2zefv5qwao4prxxx
  ...
  • 公网/内网访问
  • 当创建 Knative Service 时, 开始创建ALB
  • 根据 Ingress 判断是否公网。默认创建公网ALB。如果只有内网访问的Ingress, 则创建内网ALB
  • 公网访问
  • 创建 Albconfig: knative-internet
  • 内网访问
  • 创建 Albconfig: knative-intranet
  • 灰度发布
  • 基于流量比例的灰度发布
  • Knative Ingress会将revision service的权重转换成 K8s Ingress 灰度权重
  • 基于Header和 Cookie灰度发布
  • Header:
  • Knative当前支持Header方式进行灰度,通过Knative-Serving-Tag: {revision-tag}实现。
  • 在Knative Service中通过注解方式指定 header 对应的 traffic revision
  • Cookie:在Knative Service中通过注解方式指定 cookie 对应的 traffic revision

关键实现

Knative 对接 ALB 实现,关键在于:基于Cookie、Header、权重比例的灰度发布。这里主要对灰度发布实现进行介绍。

基于流量比例的灰度发布

Knative Ingress会将 revision service 的权重转换成 K8s Ingress 灰度权重。

Knative Service 示例如下:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "100"
        autoscaling.knative.dev/minScale: "0"
    spec:
      containers:
      - env:
        - name: TARGET
          value: Knative11
        image: registry-vpc.cn-beijing.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
        name: user-container
        ports:
        - containerPort: 8080
          name: http1
          protocol: TCP
  traffic:
  - latestRevision: false
    percent: 50
    revisionName: helloworld-go-00002
  - latestRevision: false
    percent: 50
    revisionName: helloworld-go-00001

内部转换成 K8s Ingress 如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/actions.forward-default: '{"type":"ForwardGroup","forwardConfig":{"targetGroups":[{"serviceName":"helloworld-go-00002","servicePort":80,"weight":50},{"serviceName":"helloworld-go-00001","servicePort":80,"weight":50}]}}'
  labels:
    knative.aliyun.com/ingress: helloworld-go
  name: helloworld-go
  namespace: default
spec:
  ingressClassName: knative-alb-ingress-internet
  rules:
  - host: helloworld-go.default.example.com
    http:
      paths:
      - backend:
          service:
            name: forward-default
            port:
              name: use-annotation
        path: /
        pathType: Prefix
  - host: helloworld-go.default.svc.cluster.local
    http:
      paths:
      - backend:
          service:
            name: forward-default
            port:
              name: use-annotation
        path: /
        pathType: Prefix

服务访问:

$ curl ${INGRESS_DNS} -H "Host:helloworld-go.default.example.com"
Hello Knative!
Hello Knative 2!

基于 Cookie、Header 灰度发布

  • 社区基于 Header 灰度发布

当前通过Knative Service 配置 tag-header-based-routing 方式实现header灰度发布

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "100"
        autoscaling.knative.dev/minScale: "0"
    spec:
      containers:
      - env:
        - name: TARGET
          value: Knative11
        image: registry-vpc.cn-beijing.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
        name: user-container
        ports:
        - containerPort: 8080
          name: http1
          protocol: TCP
  traffic:
  - latestRevision: false
    percent: 0
    revisionName: helloworld-go-00002
    tag: rev1
  - latestRevision: false
    percent: 100
    revisionName: helloworld-go-00001

内部转换成K8s Ingress 如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/actions.forward-default: '{"type":"forward","forwardConfig":{"serverGroups":[{"serviceName":"helloworld-go-00002","servicePort":80,"weight":50},{"serviceName":"helloworld-go-00001","servicePort":80,"weight":50}]}}'
    alb.ingress.kubernetes.io/actions.forward-tag: '{"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"helloworld-go-00002","servicePort":80,"weight":100}]}}'
    alb.ingress.kubernetes.io/conditions.forward-tag: '[{"Type":"Header","CookieConfig":{"Values":null},"HeaderConfig":{"Key":"Knative-Serving-Tag","Values":["rev1"]}}]'
  labels:
    knative.aliyun.com/ingress: helloworld-go
  name: helloworld-go
  namespace: default
spec:
  ingressClassName: knative-alb-ingress-internet
  rules:
  - host: helloworld-go.default.a97e861255a18699.app.alicontainer.com
    http:
      paths:
      - backend:
          service:
            name: forward-default
            port:
              name: use-annotation
        path: /
        pathType: Prefix
  - host: helloworld-go.default.svc.cluster.local
    http:
      paths:
      - backend:
          service:
            name: forward-default
            port:
              name: use-annotation
        path: /
        pathType: Prefix
  - host: helloworld-go.default.a97e861255a18699.app.alicontainer.com
    http:
      paths:
      - backend:
          service:
            name: forward-tag
            port:
              name: use-annotation
        path: /
        pathType: Prefix
  - host: helloworld-go.default.svc.cluster.local
    http:
      paths:
      - backend:
          service:
            name: forward-tag
            port:
              name: use-annotation
        path: /
        pathType: Prefix
  - host: rev1-helloworld-go.default.svc.cluster.local
    http:
      paths:
      - backend:
          service:
            name: forward-tag
            port:
              name: use-annotation
        path: /
        pathType: Prefix

访问方式:

curl ${INGRESS_DNS} -H "Host:helloworld-go.default.example.com"  -H "Knative-Serving-Tag:rev1"
  • 基于 Header 灰度发布

在Knative Service中支持通过注解方式指定 header 对应的 traffic revision

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
    alicloud.serving.knative.dev/headers: [{revision:helloworld-go-00002,headers:{demo:test}}]
  name: helloworld-go
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "100"
        autoscaling.knative.dev/minScale: "0"
    spec:
      containers:
      - env:
        - name: TARGET
          value: Knative11
        image: registry-vpc.cn-beijing.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
        name: user-container
        ports:
        - containerPort: 8080
          name: http1
          protocol: TCP
  traffic:
  - latestRevision: false
    percent: 0
    revisionName: helloworld-go-00002
  - latestRevision: false
    percent: 100
    revisionName: helloworld-go-00001

访问方式:

curl ${INGRESS_IP} -H "Host:helloworld-go.default.example.com" --header "demo=always" --header "header2=v2"
  • 基于Cookie 灰度发布

在Knative Service中通过注解方式指定 cookie 对应的 traffic revision

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
    alicloud.serving.knative.dev/cookies: [{revision:helloworld-go-00002,cookies:{demo:always,cookie2:v2}}]
  name: helloworld-go
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: "100"
        autoscaling.knative.dev/minScale: "0"
    spec:
      containers:
      - env:
        - name: TARGET
          value: Knative11
        image: registry-vpc.cn-beijing.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
        name: user-container
        ports:
        - containerPort: 8080
          name: http1
          protocol: TCP
  traffic:
  - latestRevision: false
    percent: 0
    revisionName: helloworld-go-00002
  - latestRevision: false
    percent: 100
    revisionName: helloworld-go-00001

访问方式:

curl ${INGRESS_DNS} -H "Host:helloworld-go.default.example.com" --cookie "demo=always" --cookie "cookie2=v2"

结论

将 Knative 与 ALB 集成,进一步提升 Knative Serverless 应用产品化能力,同时拓展了 ALB Ingress 产品使用场景。欢迎大家试用。

点击下方链接了解更多产品相关信息:

https://help.aliyun.com/document_detail/412227.html

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
24天前
|
人工智能 Java Serverless
阿里云函数计算助力AI大模型快速部署
随着人工智能技术的快速发展,AI大模型已经成为企业数字化转型的重要工具。然而,对于许多业务人员、开发者以及企业来说,探索和利用AI大模型仍然面临诸多挑战。业务人员可能缺乏编程技能,难以快速上手AI模型;开发者可能受限于GPU资源,无法高效构建和部署AI应用;企业则希望简化技术门槛,以更低的成本和更高的效率利用AI大模型。
107 12
|
2月前
|
安全 Java API
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
阿里云短信服务提供API/SDK和控制台调用方式,支持验证码、通知、推广等短信类型。需先注册阿里云账号并实名认证,然后在短信服务控制台申请资质、签名和模板,并创建AccessKey。最后通过Maven引入依赖,使用工具类发送短信验证码。
【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
|
2月前
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
46 3
|
16天前
|
弹性计算 Cloud Native Serverless
阿里云 SAE 邀您参加 Serverless 高可用架构挑战赛,赢取精美礼品
阿里云 SAE 邀您参加 Serverless 高可用架构挑战赛,赢取精美礼品。
|
2月前
|
弹性计算 运维 负载均衡
阿里云SLB的性能优势
【11月更文挑战第3天】
48 3
|
3月前
|
IDE API 开发工具
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
Alibaba Cloud API Toolkit for VSCode 是集成了 OpenAPI 开发者门户多项功能的 VSCode 插件,开发者可以通过这个插件方便地查找API文档、进行API调试、插入SDK代码,并配置基础环境设置。我们的目标是缩短开发者在门户和IDE之间的频繁切换,实现API信息和开发流程的无缝结合,让开发者的工作变得更加高效和紧密。
沉浸式集成阿里云 OpenAPI|Alibaba Cloud API Toolkit for VS Code
|
2月前
|
负载均衡 算法 网络协议
阿里云slb中的lvs介绍
【10月更文挑战第17天】
138 2
|
2月前
|
弹性计算 负载均衡 监控
阿里云slb的slb-backend介绍
【10月更文挑战第17天】
94 2
|
2月前
|
弹性计算 负载均衡 监控
阿里云slb的slb-api介绍
【10月更文挑战第17天】
122 1
|
3月前
|
人工智能 弹性计算 运维
触手可及:阿里云函数计算助力AI大模型的评测
阿里云推出的面向AI服务器的功能计算(Functional Computing, FC),专为AI应用提供弹性计算资源。该服务支持无服务器部署、自动资源管理和多语言支持,极大简化了AI应用的开发和维护。本文全面评测了FC for AI Server的功能特性、使用体验和成本效益,展示了其在高效部署、成本控制和安全性方面的优势,并通过具体应用案例和改进建议,展望了其未来发展方向。
199 4

相关产品

  • 函数计算