DevOps工具:k8s数据共享与持久化-nfs

这篇具有很好参考价值的文章主要介绍了DevOps工具:k8s数据共享与持久化-nfs。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DevOps为什么要持久化数据?

  1. 可伸缩:可利用k8s集群的资源执行自动化任务。
  2. 可追溯:通过将构建产物和相关数据持久化,可以确保每个构建版本的可追溯性,有利于快速排查和解决问题,同时可回滚到之前得版本。而CI、CD和测试各阶段都可能产生文件(不适合存储数据库),因此需要持久化。
  3. 数据备份与恢复:通过定期备份关键数据,可以防止数据丢失、灾难恢复、以及保障业务连续性。
  4. 灵活性和可移植性:共享和持久化数据,可以确保应用程序在不同环境的一致性,有利于迁移。

准备服务端环境

服务器环境:10.10.13.46 Ubuntu

安装nfs server

执行命令

apt install nfs-kernel-server

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

检测服务状态:

systemctl status nfs-server

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

创建NFS数据目录

mkdir -p /data/nfs/test
chown nobody:nogroup /data/nfs/test
chmod -R 777 /data/nfs/test

编辑exports配置文件

# 允许网络段访问
# vim /etc/exports
echo "/data/nfs/test 10.10.*.*(rw,sync,no_subtree_check)" >> /etc/exports

配置文件中的权限说明:

  • rw:允许读写
  • sync:文件同时写入硬盘和内存
  • no_subtree_check:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率

共享目录

exportfs -arv
# 显示NFS服务器上所有的共享目录
showmount -e

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

exportfs参数说明

-a 打开或取消所有目录共享。
-o options,...指定一列共享选项,与 exports(5) 中讲到的类似。
-i 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
-r 重新共享所有目录。它使 /var/lib/nfs/xtab 和 /etc/exports 同步。 它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。
-u 取消一个或多个目录的共享。
-f 在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd添加的新的共享条目。
-v 输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。

showmount显示NFS服务器的共享信息
DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

准备客户端环境

安装NFS客户端

apt-get install nfs-common -y

mkdir /data/nfs
mount -t nfs -o nolock,vers=3 10.10.13.46:/data/nfs /data/nfs

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

测试

在客户端添加文件

dd if=/dev/zero of=./test.dd bs=1M count=10

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

服务端查看是否有文件:文件已同步

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

为所有k8s节点安装NFS客户端

  • 方案:ansible执行脚本安装
  • 步骤:
    1. 为所有节点设置免密
    2. 安装NFS客户端
1. 为所有节点设置免密

采用DaemonSet实现,成功执行后删除DaemonSet

# k8s 宿主机免密登录
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ssh-passwordless
  namespace: ops
  labels:
    app: ssh-passwordless
spec:
  selector:
    matchLabels:
      name: ssh-passwordless
  template:
    metadata:
      labels:
        name: ssh-passwordless
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      tolerations:
        - effect: NoSchedule
          operator: Exists
        - key: CriticalAddonsOnly
          operator: Exists
        - effect: NoExecute
          operator: Exists
      containers:
        - name: shell
          image: busybox
          command:
            - "/bin/sh"
          args:
            - "-c"
            - |
              pubkey='xxxxxx'
              exist=$(cat /root/.ssh/authorized_keys | grep "${pubkey}" | wc -l)
              echo ${exist}
              if [ ${exist} -eq 0 ]; then
                echo 添加公钥
                echo "${pubkey}" >> /root/.ssh/authorized_keys
              fi
              echo 休息一天。。。
              sleep 86400
          volumeMounts:
            - name: ssh
              mountPath: /root/.ssh
              readOnly: true
      volumes:
        - name: ssh
          hostPath:
            path: /root/.ssh

2. 安装NFS客户端
echo "安装nfs client"
kubectl get no -o wide | awk '{if (NR>1){print $6}}' > hosts
echo "安装nfs client的机器"
ansible all --list-host
echo "开始安装nfs client"
ansible all -m shell -a 'apt-get install nfs-common -y'

执行结果

安装nfs client
安装nfs client的机器
  hosts (22):
    10.10.12.35
    10.10.12.83
开始安装nfs client
10.10.12.35 | CHANGED | rc=0 >>
Reading package lists...
Building dependency tree...
Reading state information...
nfs-common is already the newest version (1:1.3.4-2.5ubuntu3.6).
0 upgraded, 0 newly installed, 0 to remove and 129 not upgraded.    

k8s应用NFS

手动管理PV

编写编排测试

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 1Mi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 10.10.13.46
    path: /data/nfs/debug
  mountOptions:
    - nfsvers=4.2

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pv-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
  volumeName: nfs-pv

---
kind: Pod
apiVersion: v1
metadata:
  name: test-pod-pv
spec:
  containers:
    - name: test-pod
      image: busybox:1.24
      command:
        - "/bin/sh"
      args:
        - "-c"
        - "touch /mnt/SUCCESS && exit 0 || exit 1"   #创建一个SUCCESS文件后退出
      volumeMounts:
        - name: nfs-pvc
          mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: nfs-pv-pvc  #与PVC名称保持一致

执行结果

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

自动管理PV

安装StorageClass

由StorageClass自动管理PV

方法一:helm安装

文档:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/blob/master/charts/nfs-subdir-external-provisioner/README.md

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
    --set nfs.server=10.10.13.46 \
    --set nfs.path=/data/nfs/debug
方法二:编排安装
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default        #根据实际环境设定namespace,下面类同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-nfs-storage
provisioner: nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
allowVolumeExpansion: true
parameters:
  archiveOnDelete: "false"


---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-client-provisioner
  labels:
    app: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: default  #与RBAC文件中的namespace保持一致
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.2
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: nfs-storage  #provisioner名称,请确保该名称与 nfs-StorageClass.yaml文件中的provisioner名称保持一致
            - name: NFS_SERVER
              value: 10.10.13.46   #NFS Server IP地址
            - name: NFS_PATH
              value: /data/nfs/debug    #NFS挂载卷
      volumes:
        - name: nfs-client-root
          nfs:
            server: 10.10.13.46  #NFS Server IP地址
            path: /data/nfs/debug   #NFS 挂载卷
测试自动管理PV方案
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
spec:
  storageClassName: managed-nfs-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

---
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
    - name: test-pod
      image: busybox:1.24
      command:
        - "/bin/sh"
      args:
        - "-c"
        - "touch /mnt/SUCCESS-sc && exit 0 || exit 1"   #创建一个SUCCESS文件后退出
      volumeMounts:
        - name: nfs-pvc
          mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: test-claim  #与PVC名称保持一致

集成到DevOps

init-kube:
  settings:
    ns: ops
  config:
    - |
      %{readText "ops/init/init.ssh-passwordless.k8s.yaml" | indent 32}%
  execTmpl: |
    - name: kube
      template: ops-shell
      arguments:
        parameters:
          - name: cmd
            value: |
                kubectl --kubeconfig=/.kube/@{- $.env.kube.env -}@.yaml apply -f /workdir/@{$.sys.stage}@/@{$.sys.mod}@/@{$.name}@
                sleep 30
                echo "查看免密Pod"
                kubectl --kubeconfig=/.kube/@{- $.env.kube.env -}@.yaml -n @{ $.settings.ns }@ get po -o wide | grep ssh
                echo "删除ssh免密任务"
                kubectl --kubeconfig=/.kube/@{- $.env.kube.env -}@.yaml -n @{ $.settings.ns }@ delete ds ssh-passwordless

                @{- if and (not (contains .sys.env "uat") ) (not (contains .sys.env "prod") )  }@

                echo "安装nfs client"
                cd / # 因为ansible.cfg 位于根目录,默认进入root目录
                kubectl --kubeconfig=/.kube/@{- $.env.kube.env -}@.yaml get no -o wide | awk '{if (NR>1){print $6}}' > hosts
                echo "安装nfs client的机器"
                ansible all --list-host
                echo "开始安装nfs client"
                ansible all -m shell -a 'apt-get install nfs-common -y'

                @{- end  }@

FAQ

Read-only file system

现象
DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

解决方案:NFS路径必须是挂载路径

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

selfLink was empty, can’t make reference

现象
DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

解决方案:换镜像gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0,参考#25

旧镜像:quay.io/external_storage/nfs-client-provisioner:latest

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

结语

本文包含了k8s应用NFS环境搭建的所有操作,以及集成到自研DevOps平台的配置。

若有更佳的实践方法和需求,请评论告知。

DevOps工具:k8s数据共享与持久化-nfs,DevOps,kubernetes,devops,自动化,kubernetes,运维

请用微信扫码关注下🙏 ,持续更新云原生DevOps最佳实践。

本文由mdnice多平台发布文章来源地址https://www.toymoban.com/news/detail-843266.html

到了这里,关于DevOps工具:k8s数据共享与持久化-nfs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第18关 K8s数据安全无忧——持久化存储详解

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,本期课程将深入解析Kubernetes的持久化存储机制,包括PV、PVC、StorageClass等的工作原理、使用场景、最佳实践等,帮您构建稳定可靠的状态存储,确保应用和数据 100% 安全。 Volume 我们这里先来聊聊K8s的存储模型V

    2024年02月05日
    浏览(49)
  • k8s1.28.8版本安装prometheus并持久化数据

    本文参考 前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题,可以后面删除这个策略,这里可以查看我之前的文档。 部署kube-prometheus 这里是配置好才执行这个,我们还没有配置存储什么的需要进行修改 持久化数据我这里用的是NFS创建动态的

    2024年04月15日
    浏览(31)
  • 持续集成部署-k8s-数据持久化-NFS安装与使用

    网络文件系统(Network File System, NFS),是基于内核的文件系统,nfs主要是通过网络实现服务器和客户端之间的数据传输,采用远程过程调用RPC(Romete Procedure Call)机制,让不同的机器节点共享文件目录。只需将nfs服务器共享的文件目录挂载到nfs客户端,这样客户端就可以对远程

    2024年02月07日
    浏览(38)
  • 03-k8s的pod资源01-数据持久化、env环境变量、网络暴露

    1,pod资源是k8s集群当中,最小的管理单位; 2,其他所有资源都是围绕着为pod资源提供服务的;给pod提供服务的; 3,pod就是“一组”容器,一个pod中可以有1个或者多个容器;         emptyDir存储卷,本质上是一个临时的目录,其生命周期与pod相同,pod被删除,则数据也会被

    2024年02月21日
    浏览(41)
  • k8s 持久化存储

    我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁 那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问节点的设备 这个时候,我们就可以让 hostP

    2024年02月16日
    浏览(42)
  • K8S之持久化存储

    在K8S中部署的应用都是以pod容器的形式运行的,假如部署数据库服务 例如:MySQL、Redis等,需要对产生的数据做备份。如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,想要长久的保留这些数据就要用到pod数据持久化存储。 查看K8S支持哪些存储 常用的如下:

    2024年04月09日
    浏览(44)
  • [Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

    前面通过 deployment 结合 service 来部署 无状态的应用 ,下面来讲解通过 satefulSet 结合 service 来部署 有状态的应用 无状态: 无状态 (stateless) 、牲畜 (cattle) 、无名 (nameless) 、可丢弃 (disposable) 有状态: 有状态 (stateful) 、宠物 (pet) 、具有名 (haviing name) 、不可丢弃 (non-disposable) St

    2024年02月01日
    浏览(44)
  • 飞天使-k8s基础组件分析-持久化存储

    emptyDir hostpath pv和pvc介绍 nfs作为静态pv案例 nfs作为动态pv案例 使用本地文件夹作为pv 改变默认存储类及回收策略 参考文档

    2024年02月11日
    浏览(46)
  • 【k8s存储--使用OpenEBS做持久化存储】

    使用OpenEBS,你可以将有持久化数据的容器,像对待其他普通容器一样来对待。OpenEBS本身也是通过容器来部署的,支持Kubernetes、Swarm、Mesos、Rancher编排调度,存储服务可以分派给每个pod、应用程序、集群或者容器级别,包括: 跨节点的数据持久化 跨可用区和云厂商的数据同步

    2024年04月23日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包