如何在单一部署中将 .NET Core Web 和 Worker 项目部署到 Kubernetes?

How to deploy .NET core web and worker projects to Kubernetes in single deployment?

我对 Docker 和 Kubernetes 技术比较陌生。我的要求是在一次部署中部署一个 web 和一个 worker(.Net 后台服务)项目。

这是我的 deployment.yml 文件的样子:

apiVersion : apps/v1
kind: Deployment
metadata:
  name: worker
spec:
  progressDeadlineSeconds: 3600
  replicas: 1
  selector:
    matchLabels:
      app: worker
  template:
    metadata:
      labels:
        app: worker
    spec:
      containers:
        - name: worker
          image: xxxxx.azurecr.io/worker:#{Build.BuildId}#
          #image: xxxxx.azurecr.io/web
          imagePullPolicy: Always
          #ports:
          #- containerPort: 80

apiVersion : apps/v1
kind: Deployment
metadata:
  name: web
spec:
  progressDeadlineSeconds: 3600
  replicas: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: xxxxx.azurecr.io/web:#{Build.BuildId}#
          #image: xxxxx.azurecr.io/web
          imagePullPolicy: Always
          ports:
          - containerPort: 80

这是我的 service.yml 文件的样子:

apiVersion: v1
kind: Service
metadata:
    name: worker
spec:
    type: LoadBalancer
    ports:
    - port: 80 
    selector:
        app: worker
---
apiVersion: v1
kind: Service
metadata:
    name: web
spec:
    type: LoadBalancer
    ports:
    - port: 80 
    selector:
        app: web

我发现,如果我将两者都保存在 service.yml 文件中,那么它只会在 Kubernetes 中部署一个,如果我评论一个并一个一个执行,那么它就会部署到 Kubernetes。

是否有任何规则不能将两者都放在一个文件中?为什么它不是一起工作而是单独工作?

还有一个问题是我们可以通过任何方式查看 worker service pod,比如远程访问它,看看那里到底发生了什么......即使它是一个控制台应用程序,无论如何也要阅读它打印的内容部署后的控制台。?

此问题已在评论部分得到解决,我决定提供社区 Wiki 答案只是为了让其他社区成员更好地了解。

可以将多个 Kubernetes 资源分组在同一个文件中,但使用三个破折号(“---”)将它们分开很重要。 还值得一提的是,资源将按照它们在文件中出现的顺序创建。

有关详细信息,请参阅 Organizing resource configurations 文档。


我创建了一个示例来演示我们如何使用单个清单文件创建一个简单的 app-1 应用程序 (Deployment + Service):

$ cat app-1.yml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: app-1
  name: app-1
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: app-1
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: app-1
  name: app-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-1
  template:
    metadata:
      labels:
        app: app-1
    spec:
      containers:
      - image: nginx
        name: nginx

注意: 资源按照它们在文件中出现的顺序创建:

$ kubectl apply -f app-1.yml
service/app-1 created
deployment.apps/app-1 created

$ kubectl get deploy,svc
NAME                    READY   UP-TO-DATE   
deployment.apps/app-1   1/1     1            

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   
service/app-1        ClusterIP   10.8.14.179   <none>        80/TCP