kubernetes如何只为副本编写部署Yaml

时间:2018-06-20 08:30:31

标签: kubernetes

我有一个pod yaml文件(请参见下文)。它具有我想要的所有属性,但副本属性除外。这样我就必须编写部署yaml。

apiVersion: v1
kind: Pod
metadata:
  name: app-ykt
  labels:
    app: app-ykt
    purpose: ykt_production
spec:
  containers:
  - name: app-ykt
    image: app
    imagePullPolicy: IfNotPresent
    ports:
      - containerPort: 80
    volumeMounts:
      - name: volume-app-ykt
        mountPath: /usr/application
    env:
      - name: spring.config.location
        value: application.properties
  volumes:
      - name: volume-app-ykt
        hostPath:
          path: /opt/docker/datalook-pre-core
          type: Directory

在编写部署文件时,我必须提及不需要的映像和其他属性。此外,它会创建另一个Pod,并缺少一些我必须具有的属性,例如音量。我的目标只是这个副本,这样我就可以使吊舱具有高可用性。有解决办法吗?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-ykt
  labels:
    app: app-ykt
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-ykt
  template:
    metadata:
      labels:
        app: app-ykt
    spec:
      containers:
      - name: app-ykt
        image: app
        ports:
        - containerPort: 80

2 个答案:

答案 0 :(得分:2)

首先,我认为hostPath卷不是HA解决方案,因此您应该考虑在整个kubernetes群集中共享一个作为ReadWriteMany Persistent Volume的卷。 然后,您还需要在已复制的Pod(例如Services [0])之间使用内部负载平衡器。

希望对您有帮助。

[0] [https://kubernetes.io/docs/concepts/services-networking/service/]

答案 1 :(得分:1)

每个Kubernetes对象都有其自己的要求。如果要创建Deployment,则必须指定此属性。 Deployment对象是ReplicaSet创建和管理它的“抽象”层。没有容器属性描述(图像,卷等),您将无法创建任何Deployment(RelicaSet)

如果要使用Kubernetes,则需要通过“ Kubernetes方式”部署应用程序。您可以使用应用说明创建Deployment .yml文件,然后将Deployment缩放到任意数量的副本。

ServiceIngress对象可以帮助您在副本之间实现负载平衡,如@Daein上文所述

您的Deployment可能如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-ykt
  namespace: elk
  labels:
    app: app-ykt
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app-ykt
  template:
    metadata:
      labels:
        app: app-ykt
    spec:
      containers:
      - name: app-ykt
        image: <your_image>
        ports:
        - containerPort: 80
        env:
        - name: spring.config.location
          value: application.properties
        volumeMounts:
          - name: volume-app-ykt
            mountPath: /usr/application
      volumes:
      - name: volume-app-ykt
        hostPath:
          path: /opt/docker/datalook-pre-core
          type: Directory

这将创建Deployment,这反过来将自动创建3个副本(3个Pod),其中只有一个app-ykt容器

注意:我也认为在这里使用hostPath并不是一个好主意,就像@Daein提到的那样,即使我不知道您的应用程序配置如何。 hostPath通常用于访问节点上的任何文件...

  

请记住仅在需要读取或写入时使用hostPath卷   节点上的系统文件。切勿使用它们在跨容器中持久存储数据。   “行动中的Kubernetes”(c)马可·卢卡斯(Marko Luksa)