Kubernetes 1.22调用Client获取Ingress列表返回Forbidden错误如何解决
问题原因
- Kubernetes 1.22版本正式废弃并移除了
extensions/v1beta1、networking.k8s.io/v1beta1两个旧版本Ingress API,仅保留networking.k8s.io/v1版本Ingress API。低于5.0.0版本的Kubernetes C#客户端默认请求旧版本Ingress API,1.22+集群无法识别对应资源路径,会触发权限类报错。 - 现有RBAC权限配置未适配新版本Ingress的API组归属:1.22版本之后Ingress资源统一归属
networking.k8s.ioAPI组,旧权限规则如果未明确指定该API组,会导致权限校验不通过,返回Forbidden错误。 - 代码参数存在逻辑错误:
ListNamespacedIngressWithHttpMessagesAsync方法的第一个入参为命名空间名称,现有代码传入了Ingress名称,会导致请求无效的命名空间路径,同样会触发权限校验失败。
解决方案
- 升级Kubernetes C#客户端到5.0.0及以上稳定版本,新版本已默认适配
networking.k8s.io/v1版本Ingress API,兼容1.22+集群。 - 修正ClusterRole权限规则,明确指定Ingress资源的API组,参考配置如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ingress-operate-role rules: # 适配1.22+版本Ingress资源规则 - apiGroups: ["networking.k8s.io"] resources: ["ingresses", "ingressclasses"] verbs: ["create", "update", "patch", "delete", "get", "list", "watch", "deletecollection"] # 原有核心资源权限规则保留即可 - apiGroups: [""] resources: ["services", "endpoints", "pods"] verbs: ["create", "update", "patch", "delete", "get", "list", "watch", "deletecollection"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["create", "update", "patch", "delete", "get", "list", "watch", "deletecollection"]
- 优化Ingress查询逻辑,直接调用单资源查询接口避免参数错误,正确代码示例如下:
// 第一个参数为Ingress所在命名空间,第二个参数为Ingress名称 var objIngress = await client.ReadNamespacedIngressAsync("your-target-namespace", "MyIngress"); var patchSpec = objIngress.Spec;
- 若使用命名空间级别的RoleBinding绑定权限,需确认绑定的命名空间和Ingress实际所在的命名空间一致,避免跨命名空间权限不足。
内容的提问来源于stack exchange,提问作者Techie
相关产品推荐
相关产品推荐

