无法将.netcore应用程序作为kubernetes cronjob运行

qzwqbdag  于 2023-06-21  发布在  Kubernetes
关注(0)|答案(2)|浏览(133)

我想创建一个kubernetes CronJob调度器,它可以每分钟调用.netcore控制台应用程序。

CronJob Spec [cronjob-poc.yml]:

kind: CronJob

metadata:

  name: cronjob-poc

spec:

  schedule: "*/1 * * * *" #Every Minute

  jobTemplate:

    spec:

      template:

        spec:

          containers:

          - name: cronjob-poc

            image: cronjobpoc:dev

            command: ["/usr/local/bin/dotnet", "/app/CronJobPoc.dll"]

          restartPolicy: OnFailure

类命令:

kind create cluster --name=cronjob-poc

kind load docker-image cronjobpoc:dev --name=cronjob-poc

kubectl apply -f .\cronjob-poc.yml

.netcore是一个非常简单的应用程序,它只是打印你好

using System;

namespace CronJobPoc{

    class Program{

        static void Main(string[] args)
        {
            Console.WriteLine($"{DateTime.Now} - Hello World!");
        }
    }
}

Docker文件:

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base    
WORKDIR /app    
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build    
WORKDIR /src    
COPY ["CronJobPoc/CronJobPoc.csproj", "CronJobPoc/"]    
RUN dotnet restore "CronJobPoc/CronJobPoc.csproj"    
COPY . .    
WORKDIR "/src/CronJobPoc"    
RUN dotnet build "CronJobPoc.csproj" -c Release -o /app/build    
FROM build AS publish    
RUN dotnet publish "CronJobPoc.csproj" -c Release -o /app/publish    
FROM base AS final    
WORKDIR /app    
COPY --from=publish /app/publish .    
ENTRYPOINT ["dotnet", "CronJobPoc.dll"]

当我执行kubectl get pods时,我看到下面的信息。

NAME                           READY   STATUS             RESTARTS   AGE

cronjob-poc-1589463060-9dp8p   0/1     CrashLoopBackOff   4          2m51s

当我尝试使用kubectl logs cronjob-poc-1589463060-9dp8p查看日志时,我什么也看不到。命令返回空。
不知道如何查看日志。有什么不对,但不确定是什么?
我期待看到输出“- Hello World!“在日志的某个地方。不知道如何检查出了什么问题,在哪里可以看到带有适当错误消息的日志。
任何快速的帮助,这将是高度赞赏。
我还尝试使用命令参数,如下所示cronjob-poc. yml。我获得Pod的CrashLoopBackOff状态

command:
- /bin/sh
- -c
- echo Invoking CronJobPoc.dll ...; /usr/local/bin/dotnet CronJobPoc.dll

当我尝试使用kubectl logs检查日志时,我会看到/bin/sh:1:/usr/local/bin/dotnet:未找到

tvz2xvvm

tvz2xvvm1#

你可以稍微简化一下Dockerfile。以下是我在我的cron job netcore应用程序中使用的一个示例:

# Copy csproj and restore as layer 1
FROM microsoft/dotnet:2.1-sdk-alpine AS build
ARG NUGET=https://api.nuget.org/v3/index.json
WORKDIR /app
COPY *.csproj ./
RUN dotnet restore --source $NUGET

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:2.1-runtime-alpine AS final
WORKDIR /app
COPY --from=build /app/out .
CMD ["dotnet", "Custom.MetricScraper.dll"]

这是三个步骤,稍微容易阅读。你会注意到不同的是,我在最后使用的是CMD而不是ENTRYPOINT。您可以修改它以适合您的项目名称和netcore3.1。
下面是相应的YAML:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: metric-scraper-job
  labels:
    app: metric-scraper
spec: # Cron job wrapper around a job
  schedule: "* * * * *"
  jobTemplate:
    spec: # Job definition
      template:
        metadata:
          labels:
            app: metric-scraper
            is-cron: "true"
        spec: # Pod definition
          containers:
          - name: metric-scraper
            image: metricscraper:latest
            imagePullPolicy: IfNotPresent
            env:
              - name: ASPNETCORE_ENVIRONMENT
              value: Production
          restartPolicy: Never
      backoffLimit: 2

此YAML定义将每分钟运行图像metricscraper:latest。
关于k8s中的cron作业,我注意到的一件事是,pod没有得到清理(至少在我的1.14集群上)。一个解决方法是通过resourceequotas在命名空间上设置pod限制,并将cron作业放在那里。希望这有帮助!

doinxwow

doinxwow2#

我试图使用Visual Studio对dotnetcore应用程序进行dockerize,但没有安装sdk。当我使用命令docker build -t cronjobpoc .手动将其停靠时,它工作了。
同样在shell命令中,我简单地使用了dotnet CronJobPoc.dll,因为dotnet已经在路径中
命令:

/bin/sh -c echo Invoking CronJobPoc.dll ...; dotnet CronJobPoc.dll

相关问题