使用Helm Chart部署.NET 6 Worker Service失败求助
问题背景
我有一个.NET 6 MVC程序和Worker Service程序,单独通过Deployment YAML部署时,本地环境和AKS集群都能正常运行,但使用Helm Chart部署时,只有MVC程序正常启动,Worker Service完全无法运行。执行helm upgrade --install my-release . --dry-run预演时,仅生成MVC的Deployment和Service资源,完全没有Worker Service的相关配置。
我的values.yaml配置
# MVC程序配置 corewebmvc: replicaCount: 1 image: repository: t3odeqiclinkacr01.azurecr.io/corewebmvc pullPolicy: IfNotPresent tag: "v1.0.0" nodeSelector: "kubernetes.io/os": linux service: type: LoadBalancer port: 80 ingress: enabled: false serviceAccount: create: false autoscaling: enabled: false # Worker Service配置 corewkrsvc: replicaCount: 1 image: repository: t3odeqiclinkacr01.azurecr.io/corewkrsvc pullPolicy: IfNotPresent tag: "v1.0.0" nodeSelector: "kubernetes.io/os": linux service: QLWkrSvc ingress: enabled: false serviceAccount: create: false autoscaling: enabled: false
补充信息(更新)
我按照教程创建了Helm Chart,文件夹结构如下:
Worker Service的templates/deployment.yaml内容:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "corewkrsvc.fullname" . }} labels: {{- include "corewkrsvc.labels" . | nindent 4 }} spec: {{- if not .Values.autoscaling.enabled }} replicas: {{ .Values.replicaCount }} {{- end }} selector: matchLabels: {{- include "corewkrsvc.selectorLabels" . | nindent 6 }} template: metadata: {{- with .Values.podAnnotations }} annotations: {{- toYaml . | nindent 8 }} {{- end }} labels: {{- include "corewkrsvc.selectorLabels" . | nindent 8 }} spec: {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} {{- end }} serviceAccountName: {{ include "corewkrsvc.serviceAccountName" . }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} containers: - name: {{ .Chart.Name }} securityContext: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http containerPort: 80 protocol: TCP livenessProbe: httpGet: path: / port: http readinessProbe: httpGet: path: / port: http resources: {{- toYaml .Values.resources | nindent 12 }} {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.affinity }} affinity: {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{- toYaml . | nindent 8 }} {{- end }}
错误定位(更新1)
进一步测试发现问题出在values.yaml中Worker Service的service配置项:
service: QLWkrSvc
执行部署时会报错:Error: UPGRADE FAILED: template: tpa-poc/charts/corewkrsvc/templates/service.yaml:8:18: executing "tpa-poc/charts/corewkrsvc/templates/service.yaml" at <.Values.service.type>: can't evaluate field type in type interface {}
如果删除这一行,错误变成:Error: UPGRADE FAILED: template: tpa-poc/charts/corewkrsvc/templates/service.yaml:8:18: executing "tpa-poc/charts/corewkrsvc/templates/service.yaml" at <.Values.service.type>: nil pointer evaluating interface {}.type
现在困惑的是,Worker Service不需要对外暴露服务,这个service配置到底该怎么填?
解决方案
方案1:禁用Worker Service的Service资源生成
Worker Service作为后台任务,通常不需要对外提供服务,可直接让Helm不生成Service资源:
- 修改Worker Service Chart的
templates/service.yaml,添加条件判断,仅当.Values.service.enabled为true时才生成资源:
{{- if .Values.service.enabled }} apiVersion: v1 kind: Service metadata: name: {{ include "corewkrsvc.fullname" . }} labels: {{- include "corewkrsvc.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "corewkrsvc.selectorLabels" . | nindent 4 }} {{- end }}
- 在values.yaml中给Worker Service的service配置添加enabled字段并设为false:
corewkrsvc: # 其他配置保持不变 service: enabled: false
方案2:正确配置service结构(若确实需要Service)
如果Worker Service需要和集群内其他服务通信,需按照MVC的service格式配置(不能直接写字符串):
corewkrsvc: # 其他配置保持不变 service: type: ClusterIP # 后台服务用ClusterIP足够,无需LoadBalancer port: 80
这样就能匹配service.yaml模板中对.Values.service.type和.Values.service.port的引用。
额外注意:Worker Service的探针配置
Worker Service通常没有HTTP接口,原Deployment模板中的livenessProbe和readinessProbe用httpGet会导致容器启动失败,需修改为其他类型,比如执行简单命令:
# 修改Deployment中的探针部分 livenessProbe: exec: command: - echo - ok initialDelaySeconds: 10 periodSeconds: 30 readinessProbe: exec: command: - echo - ok initialDelaySeconds: 5 periodSeconds: 10
完成上述修改后,执行helm upgrade --install my-release . --dry-run预演,即可看到Worker Service的Deployment资源正常生成。
内容的提问来源于stack exchange,提问作者Alexu

