在AWS EKS中用Helm安装Grafana时设置Service注解报错,如何解决?
问题
Grafana Helm Chart默认创建的Service使用经典负载均衡(Classic Load Balancer),我已经安装了AWS负载均衡webhook,想要覆盖Grafana Service的注解,于是执行了以下helm安装命令:
helm install grafana grafana/grafana \ --namespace grafana \ --set persistence.storageClassName="gp2" \ --set persistence.enabled=true \ --set adminPassword='abc' \ --values grafana.yaml \ --set service.type=LoadBalancer \ --set nodeSelector.app=prometheus \ --set nodeSelector.k8s-app=metrics-server \ --set service.annotations."service\.beta.kubernetes\.io/aws-load-balancer-nlb-target-type"=ip \ --set service.annotations."service\.beta.kubernetes\.io/aws-load-balancer-type"=external
但多次调整后仍持续报错:
Error: INSTALLATION FAILED: YAML parse error on grafana/templates/service.yaml: error unmarshaling JSON: while decoding JSON: json: cannot unmarshal object into Go struct field .metadata.annotations of type string
正确配置方式
这个错误的核心原因是你通过--set传递的注解是对象格式,但grafana.yaml里已经把service.annotations定义成了字符串类型,两者类型不匹配导致解析失败。
你可以用以下两种方法解决:
方法一:通过--set强制覆盖注解对象
如果不需要保留grafana.yaml里的原有注解,先清空原有注解定义,再添加新的注解:
helm install grafana grafana/grafana \ --namespace grafana \ --set persistence.storageClassName="gp2" \ --set persistence.enabled=true \ --set adminPassword='abc' \ --values grafana.yaml \ --set service.type=LoadBalancer \ --set nodeSelector.app=prometheus \ --set nodeSelector.k8s-app=metrics-server \ --set service.annotations={} \ --set service.annotations."service\.beta.kubernetes\.io/aws-load-balancer-nlb-target-type"=ip \ --set service.annotations."service\.beta.kubernetes\.io/aws-load-balancer-type"=external
关键是--set service.annotations={}这一步,它会把原有字符串类型的注解替换为空对象,之后再添加的注解键值对就能正常解析成对象类型。
方法二:在values文件中配置注解(推荐)
直接修改你的grafana.yaml,在其中添加Service的注解配置,这种方式更直观且不易出现类型冲突:
service: type: LoadBalancer annotations: service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip service.beta.kubernetes.io/aws-load-balancer-type: external
然后执行安装命令时,去掉命令里的--set service.annotations相关参数即可:
helm install grafana grafana/grafana \ --namespace grafana \ --set persistence.storageClassName="gp2" \ --set persistence.enabled=true \ --set adminPassword='abc' \ --values grafana.yaml \ --set nodeSelector.app=prometheus \ --set nodeSelector.k8s-app=metrics-server
内容的提问来源于stack exchange,提问作者Parity Bit
相关产品推荐
相关产品推荐

