2017-04-04 155 views
8

我想通过部署对象通过管理我的部署来部署应用程序集群。该文件让我非常困惑。我的基本布局具有独立扩展以下组件:Kubernetes多pod部署

  1. API服务器
  2. UI服务器
  3. Redis的缓存
  4. 定时器/计划任务服务器

从技术上讲,所有4个以上属于中单独的豆荚可以独立缩放。

我的问题是:

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

回答

12

Pagids答案有大部分的基础知识。您应该为您的场景创建4 Deployments。每个部署将创建一个ReplicaSet,该表计划和监督DeploymentPODs的集合。

每个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不是可伸缩的单元。一个Deployment,安排POD是。
  • A Deployment意在代表一起实现单一目的的单组POD。
  • 您可以有许多Deployments在群集的虚拟网络中一起工作。
  • 要访问可能由多个PODs运行在不同节点上的Deployment,您必须创建一个服务。
  • 部署旨在包含无状态服务。如果需要存储状态,则需要创建StatefulSet(例如,用于数据库服务)。
+0

谢谢Oswin。您的语法示例将'Deployment'和'Service'合并为一个非常有用! – Raj

+1

我很困惑在同一个服务中使用'port:80'和'nodePort:32756'。你能解释为什么他们都需要? – AIon

+4

'port:80'表示如果你将服务作为一个实体来处理,例如通过其名称或服务IP的DNS条目,端口80将转发给提供实际服务的PODS。 'nodePort:32xxx'表示如果你对群集节点进行寻址,例如从外部通过负载均衡器或节点IP,端口32xxx将转发到提供实际服务的PODS。 –

6

可以使用Kubernetes API referenceDeployment,你会发现spec - >templatePodTemplateSpec类型与相关注释沿(模板描述了将要创建的豆荚)它回答你的问题。当然可以在Deployment user guide中找到更长的描述。

回答您的问题...

1)PodsDeployment管理,并分别定义它们,因为它们是由部署创建的需求就没有意义了。请记住,可能会有更多相同的Pod类型的副本。

2)对于列表中的每个应用程序,您必须定义一个Deployment--这对于差异副本计数和应用程序部署也很有意义。

3)你还没有问,但它的相关 - 有独立Deployments沿每个应用程序也将需要一个专门的Service所以其他人可以访问它。

+0

谢谢@pagid。清楚的是,'spec' - >'template'实际上是一个'PodTemplateSpec',它仍然是一个* single * pod的规范。是对的吗? – Raj

+0

此外,关于#1,我感觉有两种选择:1)内联pod规范或2)通过标签的外部参考。对于我最初的项目,为了我的理智,我会坚持使用内联pod规范。 – Raj

+0

我们将部署一个'replica'定义 - 因此PodTemplateSpec占一组Pod和'replica'配置,定义了该组的大小。 当使用API​​定义时,外部定义是我无法“看到”的选项。 – pagid