Helm升级Keycloak时出现Service类型不匹配nodePort forbidden报错
直接触发报错的校验逻辑
K8s对Service资源的准入规则明确要求:当spec.type为ClusterIP时,不允许在spec.ports列表中配置nodePort字段。
当前集群内的keycloak-http为NodePort类型,每个端口都绑定了固定的nodePort值;本次Helm升级计算出的目标配置将Service类型设为了ClusterIP,执行patch操作时,K8s检测到类型变更后仍保留了原有配置中的nodePort字段,直接判定配置非法并拦截操作,抛出对应报错。
配置不匹配的根本原因
你使用的是codecentric/keycloak 10.1.0版本的Chart,这个版本相比早期迭代版本调整了Service配置的键路径:
- 你在values中写在顶层
service块下的type: NodePort,在当前版本中实际对应Chart内部无头Service(headless service)的类型配置,不会作用到对外暴露的keycloak-httpService上 - 对外提供流量接入的
keycloak-httpService,在10.1.0版本中是读取service.http.type路径下的配置值,该路径的内置默认值为ClusterIP
因为你没有将NodePort配置迁移到新版本对应的正确路径下,Helm渲染时自然读取到默认的ClusterIP值,最终导致渲染结果、你预期的values配置、集群现有资源状态三者不匹配。
修正values配置的键路径
按照10.1.0版本Chart的配置结构,调整Service相关的配置位置,正确结构参考:service: # 无头Service基础配置,保持默认即可 annotations: {} labels: {} # 无头Service类型配置,不影响对外的keycloak-http服务 type: ClusterIP # 对外暴露的HTTP Service配置,这是keycloak-http资源的配置入口 http: type: NodePort # 如需和集群现有nodePort保持一致,可在对应端口下固定配置值 http: nodePort: 31062 https: nodePort: 31258 httpManagement: nodePort: 32113配置时注意校验YAML缩进层级,避免因缩进错误导致键路径偏移,Helm无法读取到对应配置。
预校验渲染结果
配置调整完成后,先通过本地渲染命令检查keycloak-http的配置是否符合预期:helm template keycloak codecentric/keycloak --namespace keycloak -f k8s/sandbox/values.yaml -s templates/service-http.yaml确认渲染输出中Service类型为
NodePort,且端口、nodePort配置和集群现有状态一致后,再执行升级操作。处理残留状态冲突(如仍遇patch报错)
如果修正配置后仍因原有资源状态残留校验失败,可先手动删除集群内现有的keycloak-httpService资源(该操作不会影响运行中的Keycloak业务Pod),再重新执行Helm upgrade命令,让Helm按修正后的配置重新创建匹配的Service资源,避免原有配置残留引发的校验冲突。
内容的提问来源于stack exchange,提问作者globus68

