【问题标题】:Create a new volume when pod restart in a statefulset在 statefulset 中重新启动 pod 时创建新卷
【发布时间】:2020-11-29 21:27:25
【问题描述】:

我正在使用 azure aks 使用 azure 磁盘配置程序创建一个带有卷的 statefulset。 我正在尝试找到一种方法来编写我的 statefulset YAML 文件,当 pod 重新启动时,它将获得一个新的 Volume 并且旧的卷将被删除.

我知道我可以手动删除卷,但有什么方法可以告诉 Kubernetes 通过 statefulset yaml 执行此操作?

这是我的 Yaml:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: janusgraph
  labels:
    app: janusgraph
spec:
...
...
  template:
    metadata:
      labels:
        app: janusgraph
    spec:
      containers:
        - name: janusgraph
...
...
          volumeMounts:
            - name: data
              mountPath: /var/lib/janusgraph
          livenessProbe:
            httpGet:
              port: 8182
              path: ?gremlin=g.V(123).count()
            initialDelaySeconds: 120
            periodSeconds: 10
  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes: ["ReadWriteOnce"]
        storageClassName: "default"
        resources:
          requests:
            storage: 7Gi

【问题讨论】:

  • kubernetes.io/docs/concepts/storage/persistent-volumes/#delete 这应该可以帮助您在使用后删除卷。它还会删除磁盘。
  • restart 是什么意思?
  • @HelloWorld kubernetes 的一项工作是在 pod 由于某种原因关闭时启动它。这都是基于复制值
  • 对不起,我应该更具体一些。在您的情况下,删除 pod 是否也算作重新启动?或者您的意思是仅在容器失败时重新启动(不删除 pod)。 @toto

标签: azure kubernetes azure-aks kubernetes-pvc statefulset


【解决方案1】:

如果您希望在 pod 重新启动时删除您的数据,您可以使用像 EmptyDir 这样的临时卷。

当 Pod 因任何原因被移除/重启时,emptyDir 中的数据将被永久删除。

示例:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        emptyDir: {}

注意: 默认情况下,emptyDir 卷存储在支持节点的任何介质上——可能是磁盘、SSD 或网络存储,具体取决于您的环境。但是,您可以将 emptyDir.medium 字段设置为“内存”,以告诉 Kubernetes 为您挂载 tmpfs(RAM 支持的文件系统)。

【讨论】:

  • 我不能使用 emptyDir 因为我的 storageClassName: "default" 实际上是 Azure 磁盘,它为我提供了上面的 7Gi。而且,似乎 statefulset 有这个限制:kubernetes.io/docs/concepts/workloads/controllers/statefulset/… 这意味着我不能删除这个卷,只能手动删除。或者只使用 Deployment 而不是 statefulset
猜你喜欢
  • 2021-08-27
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多