【问题标题】:kubernetes how to write deployment yaml just for replicakubernetes 如何为副本编写部署 yaml
【发布时间】:2018-06-22 12:42:12
【问题描述】:

我有一个 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 并且缺少了一些我必须具备的属性,例如 volume。我的目标就是这个副本,这样我就可以获得 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

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    首先,我认为 hostPath 卷不是 HA 解决方案,因此您应该关注跨 kubernetes 集群共享一个卷作为 ReadWriteMany Persistent Volume。 然后你还需要复制的 pod 之间的内部负载均衡器,比如 Services[0]。

    希望对你有帮助。

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

    【讨论】:

      【解决方案2】:

      每个 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 卷 节点上的系统文件。永远不要使用它们跨 pod 持久化数据。 “Kubernetes 在行动” (c) Marko Luksa

      【讨论】:

      • 仅针对这种情况,如何编写Deployment yaml文件?如果 Deployment 拥有 Pod 的所有字段,那么我只需要编写服务和部署 yaml 文件。为什么我们还需要 pod 文件?
      • Deployment 将创建Pod。你根本不需要Pod 文件。我改变了我的帖子
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2017-06-22
      • 2022-08-03
      • 1970-01-01
      • 2020-09-04
      • 2020-12-14
      • 2022-01-17
      相关资源
      最近更新 更多