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

简介: 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

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
11月前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
4188 166
|
11月前
|
机器学习/深度学习 人工智能 Serverless
吉利汽车携手阿里云函数计算,打造新一代 AI 座舱推理引擎
当前吉利汽车研究院人工智能团队承担了吉利汽车座舱 AI 智能化的方案建设,在和阿里云的合作中,基于星睿智算中心 2.0 的 23.5EFLOPS 强大算力,构建 AI 混合云架构,面向百万级用户的实时推理计算引入阿里云函数计算的 Serverless GPU 算力集群,共同为智能座舱的交互和娱乐功能提供大模型推理业务服务,涵盖的场景如针对模糊指令的复杂意图解析、文生图、情感 TTS 等。
|
人工智能 运维 Cloud Native
阿里云Serverless计算产品入选Gartner®报告「领导者」象限!
近日,Gartner® 发布了 2025 年度全球《云原生应用平台魔力象限》报告,阿里云凭借 Serverless 应用引擎 SAE(以下简称 SAE)和函数计算 FC,成为亚太地区唯一入选「领导者象限」的科技公司。
994 18
|
人工智能 运维 Serverless
活动邀请 | 阿里云AI原生应用开发实战营—Serverless AI 专场(北京站)开启报名!
阿里云 AI 原生应用开发实战营——Serverless AI 专场将于 2025 年 8 月 1 日在北京举办。活动聚焦 Serverless 架构如何助力 AI 应用解决算力成本高、资源弹性需求高、运维复杂等难题,提供分钟级构建生产级 AI 应用的实战体验。
|
运维 监控 Cloud Native
阿里云 Serverless 重塑创蓝云智通信底座,引领行业变革
创蓝云智通过采用阿里云云原生产品矩阵,成功实现从传统架构向云原生弹性架构转型。利用Serverless应用引擎(SAE)、云原生API网关、微服务引擎(MSE)等产品,解决了资源利用率低、运维压力大等问题,显著提升系统稳定性与业务连续性,助力企业降本增效,成为云原生领域的标杆案例。
439 0
|
12月前
|
消息中间件 运维 监控
爆款游戏背后:尚娱如何借助阿里云 Kafka Serverless 轻松驾驭“潮汐流量”?
阿里云 Kafka 不仅为尚娱提供了高可靠、低延迟的消息通道,更通过 Serverless 弹性架构实现了资源利用率和成本效益的双重优化,助力尚娱在快速迭代的游戏市场中实现敏捷运营、稳定交付与可持续增长。
525 83
|
12月前
|
消息中间件 存储 运维
嘉银科技基于阿里云 Kafka Serverless 提升业务弹性能力,节省成本超过 20%
云消息队列 Kafka 版 Serverless 系列凭借其秒级弹性扩展、按需付费、轻运维的优势,助力嘉银科技业务系统实现灵活扩缩容,在业务效率和成本优化上持续取得突破,保证服务的敏捷性和稳定性,并节省超过 20% 的成本。
929 76
|
弹性计算 运维 安全
云迁移最佳实践:HyperMotion助中小企业高效上云,阿里云工具集深度集成三方迁移工具
中小企业上云需求强烈,但面临缺乏了解、无合适方案及成本过高等挑战。为解决这些问题,推出“云迁移HyperMotion阿里云集成版”,提供三步上云、自助迁移、自动适配等能力,助力企业高效、低成本完成迁移。
387 0

热门文章

最新文章

相关产品

  • 函数计算