Knative常见问题及解决方案

本文介绍在ACK集群中使用Knative时可能遇到的常见问题及对应的解决方案。

索引

阿里云Knative和社区开源Knative有什么差异

阿里云Knative在兼容开源Knative的基础上进行了一系列产品能力的增强,包括运维、易用性、弹性、网关、事件驱动、监控告警等维度。具体信息,请参见阿里云Knative和开源Knative对比

安装Knative时,应该选择哪种网关

阿里云Knative支持ALB、MSE、ASM和Kourier四种网关。ALB专注于应用层负载均衡场景;云原生网关MSE专注于微服务场景;ASM提供服务网络(Istio)的能力。如果仅需要基础的网关能力,可以选择Kourier。更多信息,请参见Knative网关选型建议

通过RAM用户或角色使用Knative时,需要有什么权限

需要有访问集群所有命名空间的权限。您可以按照以下流程完成授权。

  1. 登录容器服务管理控制台,在左侧导航栏选择授权管理

  2. 单击RAM 用户页签,在RAM用户列表,单击目标RAM用户对应的管理权限

  3. 添加权限区域,选择待授权的集群,然后选择命名空间为所有的命名空间,按照页面提示完成授权。

Knative中的Pod需要多长时间会缩容至0

Pod开始缩容至0的时间主要取决于3个参数:

  • stable-window:稳定窗口期。Pod真正缩容前会对此期间内的指标进行观察和评估,而不会立即执行操作。

  • scale-to-zero-grace-period:缩容至0的超时时间。在此期间内,即使没有新的请求,系统也不会立即停止或删除最后一个Pod,以防突发流量请求。

  • scale-to-zero-pod-retention-period:缩容至0前最后一个Pod的保留时间,以便快速响应突发流量请求,无需从零启动一个新的Pod。

Pod缩容至0需要满足以下三个条件:

  1. 首先,在stable-window内没有收到任何请求。

  2. 其次,超过scale-to-zero-pod-retention-period设定的保留时间。

  3. 最后,SKS(Serverless Kubernetes Service)切换到proxy模式的时间超过scale-to-zero-grace-period设定的时间,Pod开始缩容。

Pod缩容至0的保留时间不会超过stable-window + Max["scale-to-zero-grace-period", "scale-to-zero-pod-retention-period" ]。如果需要强制为Pod设置一个缩容至0的保留时间,建议使用scale-to-zero-pod-retention-period参数进行配置。

在Knative中,如何使用GPU资源

您可以通过在Knative Service中添加spec.template.metadata.annotation下的k8s.aliyun.com/eci-use-specs字段指定GPU规格,然后通过spec.containers.resources.limits下的nvidia.com/gpu字段声明GPU资源。

详细信息,请参见使用GPU

在Knative中,如何使用共享GPU

您可以参见运行共享GPU调度示例为节点开启共享GPU调度能力,然后在Knative Service中通过aliyun.com/gpu-mem字段配置资源上限(Resource Limits)。详细信息,请参见开启共享GPU调度能力

应用没有流量时Knative默认会将实例数缩容至零,如何解决冷启动延时的问题

在应用没有请求时,社区Knative默认将应用实例数缩容至零个,以降低常驻实例的运行成本。等待请求到来时,应用会被重新分配一个实例,需要经历IaaS资源的分配与调度、应用镜像的拉取、应用启动等环节。这种做法虽然降低了成本,但会让应用在启动时会经历一个冷启动过程,有较长的延时。

如果您的业务对冷启动延时比较敏感,推荐您两种解决方案。

  • 配置保留实例:保留一个低规格、低成本的突发性能实例概述,平衡Knative的使用成本和应用冷启动时延。当第一个请求到来时,保留实例将提供服务,并同时触发默认规格实例的扩容。当默认规格实例扩容完成后,后续新请求将全部转发至默认规格实例,保留实例等待接收到的请求处理完成后自动下线。详细信息,请参见配置保留实例

  • 使用ECI提供的镜像缓存功能,预先将需要使用的镜像制作成缓存快照,然后基于该快照来创建ECI实例(Pod),避免或者减少镜像层的下载,从而提升实例创建速度。详细信息,请参见使用镜像加速

ACK Knative组件的Activator组件是否计费

计费。Activator组件为数据面组件,以Pod的形式运行,会占用您的实例资源。

Knative服务的监听端口怎么配置

应用的监听端口需要和Knative Service中containerPort的端口一致,默认为8080。如需自定义监听端口,请参见配置自定义监听端口