如何配置 Kubernetes 多 Pod 部署

How to configure a Kubernetes Multi-Pod Deployment

我想通过 k8s 部署对象管理我的部署来部署应用程序集群。文档让我非常困惑。我的基本布局具有以下独立缩放的组件:

  1. API 服务器
  2. UI 服务器
  3. Redis 缓存
  4. Timer/Scheduled任务服务器

从技术上讲,以上所有 4 个都属于单独的 pods,它们是独立缩放的。

我的问题是:

  1. 我是否需要创建 pod.yml 文件然后以某种方式在 deployment.yml 文件中引用它们,或者部署文件是否也可以嵌入 pod 定义?
  2. K8s 文档似乎暗示 Deploymentspec 部分等同于定义 one pod。那是对的吗?如果我想声明性地描述多 pod 部署怎么办?我需要多个 deployment.yml 文件吗?

您可以使用 Kubernetes API reference for the Deployment and you'll find that the spec->template field is of type PodTemplateSpec along with the related comment (Template describes the pods that will be created.) it answers you questions. A longer description can of course be found in the Deployment user guide

回答您的问题...

1) PodsDeployment 管理,单独定义它们没有意义,因为它们是由 Deployment 按需创建的。请记住,同一 pod 类型可能有更多副本。

2) 对于列表中的每个应用程序,您必须定义一个 Deployment - 这在涉及不同副本计数和应用程序推出时也很有意义。

3) 你没有问过,但它是相关的 - 除了单独的 Deployments 你的每个应用程序还需要一个专用的 Service 所以其他人可以访问它。

Pagids 的回答包含大部分基础知识。您应该为您的方案创建 4 Deployments。每个部署都将创建一个 ReplicaSet,用于安排和监督 DeploymentPODs 集合。

每个 Deployment 很可能还需要在其前面加上 Service 才能访问。我通常会创建一个包含 Deployment 和相应 Service 的 yaml 文件。这是我使用的 nginx.yaml 的示例:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    name: nginx
    targetPort: 80
    nodePort: 32756
  selector:
    app: nginx
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginxdeployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginxcontainer
        image: nginx:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 80

这里有一些额外的信息需要澄清:

  • A POD 不是可缩放单元。安排 PODs 的 Deployment 是。
  • Deployment 表示一组 PODs 一起实现一个目的。
  • 你可以有很多Deployments在集群的虚拟网络中一起工作。
  • 要访问可能由不同节点上的许多 PODs 运行 组成的 Deployment,您必须创建一个服务。
  • 部署旨在包含无状态服务。如果您需要存储状态,则需要创建 StatefulSet(例如,对于数据库服务)。

补充信息:
API 服务器使用部署
UI 服务器使用部署
Redis缓存使用statefulset
Timer/Scheduled 任务服务器可能使用有状态集(如果您的服务有一些状态)