代码之家  ›  专栏  ›  技术社区  ›  colm.anseo

在没有专用pod的情况下本地复制PVC文件

  •  0
  • colm.anseo  · 技术社区  · 1 年前

    我们有一个 PVC 那是很多人写的 k8s cronjobs 。我们希望定期在本地复制此数据。通常会使用 kubectl cp 做这样的任务,但由于没有主动运行的pod 聚氯乙烯 安装,这是不可能的。

    我们一直在使用这个要点脚本的修改版本 kubectl-run-with-pvc.sh 创建一个临时pod(正在运行 sleep 300 )然后 kubectl cp 从这个临时吊舱中获取 聚氯乙烯 数据这“行得通”,但似乎有些草率。

    有没有更优雅的方法来实现这一点?

    0 回复  |  直到 1 年前
        1
  •  2
  •   Lukman    1 年前

    我可以建议用NFS代替PVC吗?

    如果您没有NFS服务器,您可以使用此映像在k8s集群内运行一个@ https://hub.docker.com/r/itsthenetwork/nfs-server-alpine 。集群中的NFS服务器确实使用PVC进行存储,但您的pod应该使用NFS进行装载。

    含义,来自 pod --> PVC pod --> NFS --> PVC

    以下是我经常用来创建集群中专用NFS服务器的脚本(只需相应地修改脚本顶部的变量):

    export NFS_NAME="nfs-share"
    export NFS_SIZE="10Gi"
    export NFS_SERVER_IMAGE="itsthenetwork/nfs-server-alpine:latest"
    export STORAGE_CLASS="thin-disk"
    
    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: ${NFS_NAME}
      labels:
        app.kubernetes.io/name: nfs-server
        app.kubernetes.io/instance: ${NFS_NAME}
    spec:
      ports:
      - name: tcp-2049
        port: 2049
        protocol: TCP
      - name: udp-111
        port: 111
        protocol: UDP
      selector:
        app.kubernetes.io/name: nfs-server
        app.kubernetes.io/instance: ${NFS_NAME}
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      labels:
        app.kubernetes.io/name: nfs-server
        app.kubernetes.io/instance: ${NFS_NAME}
      name: ${NFS_NAME}
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: ${NFS_SIZE}
      storageClassName: ${STORAGE_CLASS}
      volumeMode: Filesystem
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ${NFS_NAME}
      labels:
        app.kubernetes.io/name: nfs-server
        app.kubernetes.io/instance: ${NFS_NAME}
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: nfs-server
          app.kubernetes.io/instance: ${NFS_NAME}
      template:
        metadata:
          labels:
            app.kubernetes.io/name: nfs-server
            app.kubernetes.io/instance: ${NFS_NAME}
        spec:
          containers:
          - name: nfs-server
            image: ${NFS_SERVER_IMAGE}
            ports:
            - containerPort: 2049
              name: tcp
            - containerPort: 111
              name: udp
            securityContext:
              privileged: true
            env:
            - name: SHARED_DIRECTORY
              value: /nfsshare
            volumeMounts:
            - name: pvc
              mountPath: /nfsshare
          volumes:
          - name: pvc
            persistentVolumeClaim:
              claimName: ${NFS_NAME}
    EOF
    

    要在pod中装载NFS,首先需要获取其服务IP:

    export NFS_NAME="nfs-share"
    export NFS_IP=$(kubectl get --template={{.spec.clusterIP}} service/$NFS_NAME)
    

    然后:

      containers:
        - name: apache
          image: apache
          volumeMounts:
            - mountPath: /var/www/html/
              name: nfs-vol
              subPath: html
      volumes:
        - name: nfs-vol
          nfs: 
            server: $NFS_IP
            path: /
    

    这样一来,您不仅有一个永久运行的pod(即NFS服务器pod)来执行 kubectl cp ,您还可以将同一个NFS卷同时装载到多个pod,因为NFS没有大多数PVC驱动程序所具有的单一装载限制。

    注意:我已经在集群中使用这种NFS服务器技术将近5年了,在支持生产级流量方面没有任何问题。

        2
  •  1
  •   Aref Riant    1 年前

    您可以使用 Restic 备份您的文件系统,并在需要的地方进行恢复。

    为了创建备份,您可以编写这样的作业: 首先创建init作业:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: restic-init-job
    spec:
      template:
        spec:
          containers:
          - image: restic/restic:0.14.0
            name: restic
            env:
            - name: RESTIC_PASSWORD
              value: "123"
            command: ["restic"]
            args: ["init", "--repo", "/tmp/backup"]
            volumeMounts:
            - name: restic-backup
              mountPath: /tmp/backup/
          restartPolicy: OnFailure
    
          volumes:
           - name: restic-backup
             persistentVolumeClaim:
               claimName: restic-claim
    
    

    然后备份:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: restic-backup
    spec:
      template:
        spec:
          containers:
          - image: restic/restic:0.14.0
            name: restic
            env:
            - name: RESTIC_PASSWORD
              value: "123"
            command: ["restic"]
            args: ["--repo", "/tmp/backup", "backup", "/bitnami/postgresql"]
            volumeMounts:
            - name: html
              mountPath: /bitnami/postgresql
              readOnly: true
            - name: restic-backup
              mountPath: /tmp/backup/
          restartPolicy: OnFailure
    
          volumes:
           - name: html
             persistentVolumeClaim:
               claimName: data-postgres-0
           - name: restic-backup
             persistentVolumeClaim:
               claimName: restic-claim
    

    以及用于恢复:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: restic-restore
    spec:
      template:
        spec:
          containers:
          - image: restic/restic:0.14.0
            name: restic
            env:
            - name: RESTIC_PASSWORD
              value: "123"
            command: ["restic"]
            args: ["--repo", "/tmp/backup", "restore", "latest", "--target", "/"]
            volumeMounts:
            - name: html
              mountPath: /bitnami/postgresql
            - name: restic-backup
              mountPath: /tmp/backup/
          restartPolicy: OnFailure
    
          volumes:
           - name: html
             persistentVolumeClaim:
               claimName: data-postgres-0
           - name: restic-backup
             persistentVolumeClaim:
               claimName: restic-claim
    
    
    推荐文章