关于IngressNginx移除LB终结器及Hetzner下Service自动更新LB状态的问询
默认设置原因
service.kubernetes.io/load-balancer-cleanup是Kubernetes默认给LoadBalancer类型Service添加的终结器,作用是删除Service时自动清理关联的云厂商负载均衡资源,避免遗留资源浪费。但对于需要保留负载均衡(比如固定IP,避免重新配置DNS)的场景,这个逻辑确实不适用。
解决方法
方法1:安装Ingress-Nginx时通过Helm配置禁用
修改Helm的values.yaml文件,在控制器服务的注解中添加禁用清理的配置:
controller: service: annotations: service.kubernetes.io/load-balancer-cleanup-disabled: "true"
然后执行安装或升级命令:
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx -f values.yaml -n ingress-nginx --create-namespace
方法2:已安装后手动修改Service
执行命令编辑Service:
kubectl edit service ingress-nginx-controller -n ingress-nginx
在文件中找到finalizers字段,删除- service.kubernetes.io/load-balancer-cleanup这一行,同时建议在metadata.annotations中添加上述禁用注解,防止后续该终结器被重新添加。
Hetzner云控制器管理器健康检查注解中文说明
以下是Hetzner云控制器管理器核心健康检查相关注解的中文解释:
load-balancer.hetzner.cloud/health-check-interval: 健康检查的时间间隔,单位为秒,默认值为5load-balancer.hetzner.cloud/health-check-timeout: 健康检查的超时时间,单位为秒,默认值为2load-balancer.hetzner.cloud/health-check-retries: 健康检查失败后重试的次数,默认值为3load-balancer.hetzner.cloud/health-check-port: 健康检查使用的端口,默认使用Service的目标端口load-balancer.hetzner.cloud/health-check-protocol: 健康检查使用的协议,可选值为HTTP、HTTPS、TCP,默认值为TCPload-balancer.hetzner.cloud/health-check-http-path: 当协议为HTTP/HTTPS时,健康检查的请求路径,默认值为/
配置步骤及排查
确保Hetzner云控制器管理器已正确部署
检查Pod运行状态:kubectl get pods -n kube-system | grep hcloud-cloud-controller-manager若未部署,需先完成云控制器管理器的安装配置。
正确配置Service注解
注解必须添加在Ingress-Nginx的LoadBalancer类型Service上,示例配置:apiVersion: v1 kind: Service metadata: name: ingress-nginx-controller namespace: ingress-nginx annotations: load-balancer.hetzner.cloud/health-check-interval: "15" load-balancer.hetzner.cloud/health-check-protocol: "HTTP" load-balancer.hetzner.cloud/health-check-http-path: "/healthz" spec: type: LoadBalancer ports: - name: http port: 80 targetPort: http - name: https port: 443 targetPort: https selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller注解不生效的排查步骤
- 查看云控制器管理器的日志,检查是否有注解解析错误:
kubectl logs -n kube-system <hcloud-cloud-controller-manager-pod-name> - 登录Hetzner控制台,查看负载均衡的健康检查配置是否与注解一致,若不一致,尝试重启云控制器管理器Pod:
kubectl rollout restart deployment hcloud-cloud-controller-manager -n kube-system - 确认Service的
status.loadBalancer字段是否正常关联Hetzner负载均衡IP,若未关联,检查云控制器管理器的权限配置是否正确。
- 查看云控制器管理器的日志,检查是否有注解解析错误:
删除LB后Service状态更新
配置正确的健康检查后,Hetzner云控制器管理器会同步负载均衡的状态到Service的status字段。若手动删除了Hetzner控制台中的负载均衡,云控制器管理器会将Service的status.loadBalancer.ingress字段清空,标记Service未关联有效负载均衡。
内容的提问来源于stack exchange,提问作者JDev

