Helm:升级失败:无法通过更新字段图像修补...与种类作业

Hel*_*ova 9 kubernetes kubernetes-helm

我正在尝试部署更新。安装工作正常,但是当我更改作业的 yaml 文件中的图像字段并尝试滚动更新时,会发生错误。

\n\n
\n

错误:升级失败:无法使用种类作业修补“dev1-test-db-migrate-job”:Job.batch“dev1-test-db-migrate-job”无效:spec.template:无效值:core.PodTemplateSpec{ ObjectMeta:v1.ObjectMeta{名称:"",GenerateName:"",命名空间:"",SelfLink:"",UID:"",ResourceVersion:"",Generation:0,CreationTimestamp:v1.Time{时间:时间。时间{wall:0x0,ext:0,loc:(*time.Location)(nil)}},DeletionTimestamp:(*v1.Time)(nil),DeletionGracePeriodSeconds:(*int64)(nil),标签:map[ string]string{“controller-uid”:“e60854c6-9a57-413c-8f19-175a755c9852”,“作业名称”:“dev1-test-db-migrate-job”,“target-app”:“db-migrate ", "target-domain":"dev1...", "target-service":"test"}, 注解:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers: []string(nil), ClusterName:"", ManagedFields:[]v1.ManagedFieldsEntry(nil)}, Spec:core.PodSpec{Volumes:[]core.Volume(nil), InitContainers:[]core.Container(nil) ), 容器:[]core.Container{core.Container{名称:"app", 图片:"...:insurance-master-682", 命令:[]string{"/bin/sh", "-c "}, Args:[]string{"java -jar ./db/liquibase.jar --logLevel=debug --classpath=./db/mariadb-java-client-2.5.3.jar --driver=org. mariadb.jdbc.Driver --changeLogFile=./db/changelog-insurance.xml --url=$DB_HOST --username=$DB_USER --password=$DB_PASSWORD update"},工作目录:"",端口:[]core .ContainerPort(nil), EnvFrom:[]core.EnvFromSource{core.EnvFromSource{前缀:"", ConfigMapRef:(*core.ConfigMapEnvSource)(nil), SecretRef:(*core.SecretEnvSource)(0xc01a48c8a0)}}, Env :[]core.EnvVar(nil), 资源:core.ResourceRequirements{限制:core.ResourceList{"cpu":resource.Quantity{i:resource.int64Amount{value:200, scale:-3}, d:资源。 infDecAmount{Dec:(*inf.Dec)(nil)}, s:"200m", 格式:"DecimalSI"}, "内存":resource.Quantity{i:resource.int64Amount{值:268435456, 规模:0} , d:resource.infDecAmount{Dec:(*inf.Dec)(nil)}, s:"", 格式:"BinarySI"}}, 请求:core.ResourceList{"cpu":resource.Quantity{i:resource .int64Amount{值:100,比例:-3},d:resource.infDecAmount{Dec:(*inf.Dec)(nil)},s:“100m”,格式:“DecimalSI”},“内存”:资源.Quantity{i:resource.int64Amount{值:134217728,scale:0},d:resource.infDecAmount{Dec:(*inf.Dec)(nil)},s:"",格式:"BinarySI"}}} , VolumeMounts:[]core.VolumeMount(nil), VolumeDevices:[]core.VolumeDevice(nil), LivenessProbe:(*core.Probe)(nil), ReadinessProbe:(*core.Probe)(nil), StartupProbe:( *core.Probe)(nil)、Lifecycle:(*core.Lifecycle)(nil)、TerminationMessagePath:"/dev/termination-log"、TerminationMessagePolicy:"File"、ImagePullPolicy:"IfNotPresent"、SecurityContext:(*core. SecurityContext)(零),标准输入:假,StdinOnce:假,TTY:假}},EphemeralContainers:[] core.EphemeralContainer(nil),RestartPolicy:“从不”,TerminationGracePeriodSeconds:(* int64)(0xc014591f78),ActiveDeadlineSeconds:(* int64)(nil),DNSPolicy:“ ClusterFirst", NodeSelector:map[string]string(nil), ServiceAccountName:"", AutomountServiceAccountToken:(*bool)(nil), NodeName:"", SecurityContext:(*core.PodSecurityContext)(0xc010460000), ImagePullSecrets:[] core.LocalObjectReference{core.LocalObjectReference{Name:"artifactory-tradeplace-registry"}}, 主机名:"", 子域名:"", Affinity:(*core.Affinity)(nil), SchedulerName:"default-scheduler",容忍:[]core.Toleration(nil),HostAliases:[]core.HostAlias(nil),PriorityClassName:“”,优先级:(* int32)(nil),PreemptionPolicy:(* core.PreemptionPolicy)(nil),DNSConfig :(*core.PodDNSConfig)(nil)、ReadinessGates:[]core.PodReadinessGate(nil)、RuntimeClassName:(*string)(nil)、开销:core.ResourceList(nil)、EnableServiceLinks:(*bool)(nil) , TopologySpreadConstraints:[]core.TopologySpreadConstraint(nil)}}:字段是不可变的

\n
\n\n

我仍然不明白哪个字段应该是不可变的,可能是 Image,但是它很奇怪,我可以嵌入 Image 是有道理的。

\n\n

例如,当我将字段图像从 ...: Insurance-master-682 更改为 ...: Insurance-master-681 时,会发生错误

\n\n

我每次安装或更新时都会更改图表文件,并更改版本字段。\n那么,有人遇到过这种情况吗?\n虽然我看到唯一的出路是在更新之前应用“kubectl删除作业...”

\n\n

\'templetes\' 目录中的 yaml 的一部分:

\n\n
apiVersion: batch/v1\nkind: Job\nmetadata:\n  labels:\n    target-domain: dev1...\n    target-service: test\n  name: dev1-test-db-migrate-job\nspec:\n  backoffLimit: 0\n  template:\n    metadata:\n      labels:\n        target-app: db-migrate\n        target-domain: dev1...\n        target-service: test\n    spec:\n      containers:\n        - args:\n            - java -jar ./db/liquibase.jar --logLevel=debug --classpath=./db/mariadb-java-client-2.5.3.jar\n              --driver=org.mariadb.jdbc.Driver --changeLogFile=./db/changelog-insurance.xml\n              --url=$DB_HOST --username=$DB_USER --password=$DB_PASSWORD update\n          command:\n            - /bin/sh\n            - -c\n          envFrom:\n            - secretRef:\n                name: dev1-secret-config-deploy-for-app-gk5b59mb86\n          image: ...:insurance-master-682\n          imagePullPolicy: IfNotPresent\n          name: app\n          resources:\n            limits:\n              cpu: 200m\n              memory: 256Mi\n            requests:\n              cpu: 100m\n              memory: 128Mi\n      imagePullSecrets:\n        - name: artifactory-tradeplace-registry\n      restartPolicy: Never\n
Run Code Online (Sandbox Code Playgroud)\n\n

Chart.yaml 示例

\n\n
apiVersion: v2\nname: \ndescription: A Helm chart for Kubernetes\ntype: application\nversion: 0.1.20200505t154055\nappVersion: 1.16.0\n
Run Code Online (Sandbox Code Playgroud)\n

小智 13

需要删除现有作业,因为作业中的模板部分是不可变或不可更新的。所以你有以下两个选择。

  1. 始终创建一个具有唯一名称的新作业,因此它会保留旧作业并创建一个新作业 - 每次如果包含图像版本都是明智的。
  2. 自动清理作业(更多信息请查看此处)-作业属性ttlSecondsAfterFinished允许帮助在指定时间段后自动删除作业。例如:
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi-with-ttl
    spec:
      ttlSecondsAfterFinished: 100
      template:
        spec:
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
Run Code Online (Sandbox Code Playgroud)


小智 7

您需要删除现有作业并重新运行。可能无法重新运行相同的作业。问题似乎出在工作名称上。当我尝试使用相同的名称升级时,我确实看到了类似的情况,例如:“dev1-test-db-migrate-job”。