主题
Knative Serving 操作文档(uat1)
日常运维速查:发布/回滚、伸缩调参、域名、监控、排障。
bash
export KUBECONFIG=~/.kube/config-122.311. 应用发布与回滚
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.cn1.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 后缀):用
DomainMappingCR,并在 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_desiredvskn_revision_pods_count、kn_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=False | kubectl 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 upstream | Revision 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.yaml后kubectl apply -f config-knative.yaml,不要裸 edit(本目录为单一事实源)。 - 组件版本升级:按
rancher/knative-1.23.0-images-offline-sync.md流程同步新版本镜像,按序kubectl apply新版 CRDs/core/kourier 离线 YAML(不可跨 2 个以上小版本)。