如何配置Kubernetes的多容器部署

87
我想通过使用k8s Deployment对象来管理部署,从而部署一个应用程序集群。文档使我非常困惑。我的基本架构有以下独立扩展的组件:
  1. API服务器
  2. UI服务器
  3. Redis缓存
  4. 定时器/计划任务服务器
技术上来讲,以上4个组件都属于独立的Pod。
我的问题是:
  1. 我需要创建pod.yml文件,然后在deployment.yml文件中引用它们,还是deployment文件也可以嵌入pod定义?
  2. k8s文档似乎暗示着Deployment的spec部分相当于定义一个Pod。 这是正确的吗? 如果我想声明性地描述多个Pod的部署,我需要多个deployment.yml文件吗?

据我所知,您不能在同一部署中拥有不同的Pod。我想知道如何将2个不同的Pod(每个Pod只有1个容器)添加到同一部署中。我认为这是不可能的。 - Ben Butterworth
3个回答

78
Pagid的回答已经包含了大部分基本内容。你应该为你的场景创建4个`Deployment`。每个`Deployment`将创建一个用于调度和监督`Pod`集合的`ReplicaSet`。
每个`Deployment`很可能还需要一个位于其前面的`Service`以进行访问。我通常会创建一个单独的yaml文件,其中包含一个`Deployment`和相应的`Service`。这是我使用的一个`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

这里有一些额外的信息以便澄清:
- 一个 "Pod" 不是一个可扩展的单元,而是一个调度 Pod 的 "Deployment"。 - "Deployment" 的目的是表示一组共同完成单一任务的 Pod。 - 在集群的虚拟网络中,可以有多个 "Deployments" 协同工作。 - 要访问由许多运行在不同节点上的 "Pod" 组成的 "Deployment",您需要创建一个服务。 - "Deployments" 用于包含无状态服务。如果您需要存储状态,您需要创建一个 "StatefulSet"(例如数据库服务)。

1
谢谢Oswin。你将DeploymentService结合在一起的语法示例非常有帮助! - Raj
2
我对在同一服务中使用 port: 80nodePort: 32756Feeling困惑。您能否解释一下为什么它们都是必需的? - AIon
5
“端口:80” 表示如果您通过服务的名称或服务 IP 地址访问该服务,端口 80 将转发到提供实际服务的 PODS。而“nodePort:32xxx”表示如果您通过集群节点(例如通过负载均衡器或节点 IP 外部访问),端口 32xxx 将转发到提供实际服务的 PODS。 - Oswin Noetzelmann
2
我认为部署的目的是监视一组Pod,为什么我需要为每个Pod创建一个部署,我不理解。 - Matt Corby
1
如何将不同的部署连接起来?例如,如果我有两个部署,一个用于Node,一个用于Postgres,我该如何让Node知道如何连接到Postgres?在docker-compose中,名称成为DNS主机名,但我不理解如何在不同的部署之间完成这一点。 - Fmstrat
显示剩余6条评论

21
您可以使用 Kubernetes API 参考文档 来查找 部署,您会发现 spec->template 字段的类型为 PodTemplateSpec,并有相关注释(模板描述将要创建的 pod。)。当然,您也可以在部署用户指南中找到更详细的说明。
回答您的问题:
1)PodsDeployment 管理,单独定义它们没有意义,因为它们是按需由 Deployment 创建的。请注意,同一种 pod 类型可能有多个副本。

2) 对于您列表中的每个应用程序,您需要定义一个Deployment - 当涉及到不同的副本计数和应用程序发布时,这也是有意义的。

3) 虽然您没有问,但它与此相关 - 除了单独的Deployments外,您的每个应用程序还将需要一个专用的Service,以便其他人可以使用它。


2
感谢@pagid。明确一下,虽然spec -> template确实是一个PodTemplateSpec,但它仍然是单个 pod 的规范。这样对吗? - Raj
另外,关于#1,我感觉有两个选项:1)内联Pod规范或2)通过标签的外部引用。对于我的初始项目,为了保持理智,我将坚持使用内联Pod规范。 - Raj
我们的部署可以有一个“副本”定义 - 因此,PodTemplateSpec 负责一组 Pod,而 replica 配置则定义了该组的大小。当单独使用 API 定义时,我无法“看到”外部定义作为选项。 - pagid
2
这仍然是单个 Pod 的规范,对吗?是的,一个单独的 Pod 模板规范可能会导致多个 Pod 实例化。 - lucid_dreamer
你是否建议为不同的部署使用单独的服务?我想,使用相同的服务并具有不同的端口将更容易维护,因为服务数量很少,这只是我的假设,请告诉我您对此有不同的看法。 - Tushar Seth
一个服务用于多个部署,这是当今最常用的方式。 - pagid

0

附加信息:
API服务器使用部署
UI服务器使用部署
Redis缓存使用有状态集
定时器/计划任务服务器可能使用有状态集(如果您的服务具有某些状态)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接