【问题标题】:How to define PVC for specific path in a single node in kubernetes如何在 Kubernetes 中为单个节点中的特定路径定义 PVC
【发布时间】:2019-07-23 19:12:38
【问题描述】:

我正在运行本地 k8s 集群并将 PV 定义为 mysql pod 的 hostPath。 在下面分享所有配置细节。

kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
          # Use secret in real usage
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

我遇到的问题是 mysql pod 在 k8s 集群中运行,当它被删除并重新创建时,它会选择任何一个节点并部署。所以 mysql 主机路径总是安装到特定节点。这是一个好主意修复mysql的节点或任何其他选项吗?如果有任何想法请分享。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    您有以下选择

    1. 使用节点选择器或节点亲和性确保 pod 被调度到创建挂载的节点上,或者
    2. 使用本地持久卷。 Kubernetes 1.14 及以上版本支持它

    【讨论】:

    • 谢谢,使用节点亲和力可以使用主节点吗?
    • 是的,你可以。前提是允许 master 运行工作负载
    • nodeSelector 虽然更容易实现,但不适用于这些场景。
    【解决方案2】:

    为什么要使用 PVC 和 PV?实际上,对于 hostPath,您甚至不需要创建 PV 对象。它只是得到它。

    如果您希望重新创建一个 pod 以获取它使用前一个(状态)的存储,则应该使用 StatefulSet。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: "mysql"
      replicas: 1
      template:
        metadata:
          labels:
            app: mysql
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: mysql
            image: mysql:5.7
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: password
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumeClaimTemplates:
      - metadata:
          name: mysql-persistent-storage
        spec:
          accessModes: ["ReadWriteOnce"]
          # storageClassName: "standard"
          resources:
            requests:
              storage: 2Gi
    

    这个 statefulSet 失败了,但它是一个 mysql 的东西。作为参考,应该服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多