用 client-go 创建 Ingress 必须显式声明 apiVersion: networking.k8s.io/v1 和 kind: Ingress,漏写会导致“the server could not find the requested resource”等错误;还需严格匹配 pathType、service.name 大小写、TLS Secret 格式及 hosts 一致性。

用 client-go 创建 Ingress 必须显式声明 apiVersion 和 kind
直接构造 networkingv1.Ingress 结构体却漏掉 apiVersion: networking.k8s.io/v1 和 kind: Ingress,会导致 the server could not find the requested resource 或 unknown object type "nil"。client-go 不会自动补全这些字段,必须手动设置。
常见错误写法:
- 用错旧版本 API(如 extensions/v1beta1),该版本已在 Kubernetes ≥1.22 中彻底移除
- 字段名大小写不匹配:比如把 Spec 写成 spec,Go struct tag 要求首字母大写,否则序列化为空
- 务必使用
networkingv1.Ingress(K8s ≥1.19 稳定版) - 初始化对象时显式赋值
ObjectMeta.APIVersion = "networking.k8s.io/v1"和ObjectMeta.Kind = "Ingress"(或通过SetGroupVersionKind设置) - 若用
unstructured.Unstructured动态构造,必须调用unstructured.SetGroupVersionKind,否则 API Server 拒绝解析
Ingress rules.host 和 paths.backend.service.name 大小写敏感且严格匹配
Ingress Controller(如 nginx-ingress)在路由时对 host 和 service.name 做精确字符串比对,一个字母大小写错误或空格就会导致 404 或 no endpoints available。
典型问题场景:
- Ingress YAML 里写 service.name: my-go-service,但实际 Service 名是 my-go-SERVICE
- host: MyApp.example.com(含大写),而 DNS 解析和浏览器 Host header 都是小写,Ingress 规则不命中
-
spec.rules[0].host必须全小写,且与 DNS 记录完全一致(app.example.com≠APP.EXAMPLE.COM) -
spec.rules[0].http.paths[0].backend.service.name必须和Service.metadata.name完全相同,包括命名空间内可见性(跨 namespace 需用externalName或 service reference 扩展) -
backend.service.port.number必须填 Service 中定义的port(不是容器containerPort),例如 Service 暴露port: 80→ 这里填80
pathType 是 v1 Ingress 的硬性要求,不能省略
Kubernetes networking.k8s.io/v1 要求每个 path 显式指定 pathType,否则创建失败并报错 pathType field is required。旧版默认行为(如 Prefix)不再隐式生效。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
三种可选值:
- Exact:路径完全相等才匹配(/api 不匹配 /api/)
- Prefix:前缀匹配(/api 匹配 /api、/api/、/api/users)
- ImplementationSpecific:由 Ingress Controller 自行解释(不推荐,可移植性差)
- 生产环境优先用
Prefix,配合nginx.ingress.kubernetes.io/rewrite-target: /实现路径剥离 - 若需精确控制,比如只允许
/healthz,必须设为Exact并确保 path 以/开头 - 多个 path 不能重叠(如
/api和/api/users同时存在),否则 nginx-ingress 按最长前缀匹配,行为可能不符合预期
TLS Secret 名称和字段名必须符合 kubernetes.io/tls 类型规范
Ingress 引用 TLS 时,Secret 必须是 type: kubernetes.io/tls,且键名固定为 tls.crt 和 tls.key。写成 certificate 或 privateKey 会导致 Ingress 无法加载证书,Controller 日志出现 failed to load SSL certificate。
立即学习“go语言免费学习笔记(深入)”;
- 创建 Secret 最稳妥方式:
kubectl create secret tls my-tls-secret --cert=tls.crt --key=tls.key -n default - 手动写 YAML 时,
data.tls.crt和data.tls.key的 base64 值必须无换行(Linux/macOS 用base64 -w 0,Windows 注意去除 CR/LF) -
spec.tls.hosts列表必须和spec.rules.host完全一致,通配符证书(*.example.com)只能匹配一级子域,且 Secret 中证书必须是 wildcard 类型
Ingress 的规则解析发生在 Controller 层,不是 Go 应用自身逻辑;最容易被忽略的是 pathType 的强制要求和 service.name 的大小写敏感性——这两处出错不会报编译错误,而是静默导致流量不转发。

















