Skip to content

Knative Serving 操作文档(uat1)

日常运维速查:发布/回滚、伸缩调参、域名、监控、排障。

bash
export KUBECONFIG=~/.kube/config-122.31

1. 应用发布与回滚

1.1 发布新服务

yaml
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/min-scale: "0"      # 低延迟敏感改 "1"
        autoscaling.knative.dev/max-scale: "10"
        autoscaling.knative.dev/target: "100"        # 每 Pod 目标并发
    spec:
      containers:
        - image: 192.168.122.156:30000/<项目>/<镜像>:<tag>   # 必须用内网 Harbor
          resources:
            requests: {cpu: 100m, memory: 128Mi}
            limits:   {cpu: 500m, memory: 256Mi}
bash
kubectl apply -f myapp.yaml
kubectl get ksvc myapp          # READY=True 后访问
curl -H 'Host: myapp-default.knative.ai-ear.cn' http://192.168.122.31/

镜像必须推送到内网 Harbor;config-deployment 已对 192.168.122.156:30000 跳过 tag→digest 解析,HTTP 仓库直接用 tag 即可。

1.2 灰度/流量切分

bash
# 改镜像产生新 Revision 后,按百分比切流
kubectl patch ksvc myapp --type=json -p='[
  {"op":"replace","path":"/spec/traffic","value":[
    {"revisionName":"myapp-00001","percent":90},
    {"revisionName":"myapp-00002","percent":10,"tag":"canary"}
  ]}]'
# canary 版本独立 URL:http://canary-myapp-default.knative.ai-ear.cn

1.3 回滚

bash
kubectl get revisions -l serving.knative.dev/service=myapp
kubectl patch ksvc myapp --type=json -p='[
  {"op":"replace","path":"/spec/traffic","value":[{"revisionName":"myapp-00001","percent":100}]}]'
# 或直接:回滚到上一个 READY 的 Revision(名称以实际为准)

非活跃 Revision 由 config-gc 保留最近 10 个(48h/24h 窗口),窗口内可随时切回。

2. 伸缩调参

场景做法
禁用缩零(保活)注解 autoscaling.knative.dev/min-scale: "1"
突发流量防穿透注解 autoscaling.knative.dev/target-burst-capacity: "200";-1 则流量总过 activator
按 CPU 伸缩(HPA)注解 autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev" + autoscaling.knative.dev/metric: "cpu"
全局窗口调整kubectl -n knative-serving edit cm config-autoscaler(stable-window、panic-threshold-percentage 等)

观察伸缩过程:

bash
kubectl get pods -l serving.knative.dev/service=myapp -w
kubectl get kpa -n default        # PodAutoscaler 状态(DESIREDSCALE/SKIP)
# Grafana:kn_revision_pods_desired / kn_revision_concurrency_stable{revision_name="myapp-00001"}

3. 域名管理

  • 默认域名:knative.ai-ear.cn,URL 格式 <svc>-<ns>.knative.ai-ear.cn(config-network.domain-template)。
  • 给单个命名空间换域名:kubectl -n knative-serving edit cm config-domain,加 apps.example.com: "selector: {team: a}" 形式(变更影响全局,需评审)。
  • 自定义域名(不带 knative 后缀):用 DomainMapping CR,并在 Traefik 加对应 IngressRoute。
  • DNS 变更:内网 DNS *.knative.ai-ear.cn → 节点 IP;新增域名同理。

4. 监控与告警

  • Prometheus target 检查:kubectl get servicemonitor -n knative-serving;Prometheus UI → Targets 搜 knative-serving(应 8 个 up)。
  • 核心指标:
    • 控制面:kn_workqueue_depth(controller 积压)、kn_webhook_...
    • 伸缩:kn_revision_pods_desired vs kn_revision_pods_countkn_revision_panic_mode(1=panic)
    • 入口:kn_activator_request_count、Traefik 自身指标(traefik_service_requests_total)
  • 建议告警(待接入 alertmanager 规则):
    • kn_revision_pods_desired > 0 且 kn_revision_pods_count == 0 持续 5m(扩容失败)
    • activator 5xx 比例 > 1%
    • webhook/controller Pod 不可用(PDB 被击穿)

5. 排障速查

现象排查
ksvc READY=Falsekubectl describe ksvc <name>;看 Configuration/Route 状态;常见:镜像拉不到(必须 Harbor)、配额不足
访问 404① Traefik 未匹配:确认 IngressRoute 存在且带 ingress.class 注解;② ksvc 域名是否 *.knative.ai-ear.cn;③ curl -s http://<节点IP>/api/http/routers 查 Traefik 路由表(dashboard 路由暴露了 /api,无 Host 限制)
访问 503/no healthy upstreamRevision Pod 未就绪;activator 日志:kubectl -n knative-serving logs deploy/activator
首请求超时(冷启动)正常,约 10s;超时排查 queue-proxy 探针:kubectl logs <pod> -c queue-proxy
不缩容kubectl get kpa -n <ns>;min-scale 注解;stable-window 内流量残留
不扩容/扩容慢kubectl -n knative-serving logs deploy/autoscaler;节点资源是否不足(kubectl describe pod 看 Pending 原因)
业务 Pod ImagePullBackOff① 镜像是否在 Harbor;② queue-proxy sidecar 是否 Harbor 地址(config-deployment.queue-sidecar-image)
全部 ksvc 新建即失败webhook 是否健康:kubectl -n knative-serving get deploy webhook(webhook 挂了所有 CR 写操作失败)

常用命令:

bash
kubectl get ksvc -A                     # 全部服务
kubectl get revisions -A                # 全部版本
kubectl get king -A                     # KIngress(Kourier 路由)
kubectl -n knative-serving logs deploy/controller --tail=100
kubectl -n kourier-system logs deploy/3scale-kourier-gateway --tail=100   # envoy 访问日志

6. 变更与升级

  • 配置变更统一改本目录 config-knative.yamlkubectl apply -f config-knative.yaml,不要裸 edit(本目录为单一事实源)。
  • 组件版本升级:按 rancher/knative-1.23.0-images-offline-sync.md 流程同步新版本镜像,按序 kubectl apply 新版 CRDs/core/kourier 离线 YAML(不可跨 2 个以上小版本)。