You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Helm Chart部署.NET 6 Worker Service失败求助

问题:Helm部署Worker Service失败,仅MVC程序正常运行

问题背景

我有一个.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,文件夹结构如下:
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资源:

  1. 修改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 }}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:10:27