kubernetes》》k8s》》Volume 数据卷 PVC PV NFS

为啥需要数据卷

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失------容器以干净的状态(镜像最初的状态)重新启动。其次,在 Pod 中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的 Volume 抽象就很好的解决了这些问题。

Volume类型

目前,Kubernetes支持以下Volume 类型:

NFS

NFS是Network File System的缩写,即网络文件系统。分布式文件系统协议,NFS基于RPC(Remote Procedure Call)远程过程调用实现,其允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序就可以像访问本地文件一样访问远程系统上的文件。NFS是一个非常稳定的,可以移植 的网络文件。具备可扩展和高性能等特性,达到了企业级应用质量标准。

Kubernetes中通过简单地配置就可以挂载NFS到Pod中,而NFS中的数据是可以永久保存的,同时NFS支持同时写操作。

》》NFS原理

NFS 使用RPC(Remote Procedure Call)的机制进行实现,RPC使得客户端可以调用服务端的函数。同时,由于有VFS的存在,客户端可以像使用其它普通文件系统一样使用NFS文件系统。经由操作系统的内核,将NFS文件系统的调用请求通过TCP/IP 发送至服务端的NFS服务。NFS服务器执行相关的操作,并将操作结果返回给客户端。


emptyDir可以提供不同容器间的文件共享,但不能存储;hostPath可以为不同容器提供文件的共享并可以存储,但受制于节点限制,不能跨节点共享;这时需要网络存储 (NAS),即既可以方便存储容器又可以从任何集群节点访问

安装NFS 服务端

csharp 复制代码
# NFS是一个分布式系统,建议单独部署一台主机
# 创建一个共享目录 
mkdir -pv /usr/local/nfs/volumes
# 给这个目录增加RW权限
chomd a+rw /usr/local/nfs/volumes
# Ubuntu 安装NFS 服务端 
sudo apt update
sudo apt install nfs-kernel-server
# centos 安装NFS 服务端
sudo yum install nfs-utils rpcbind
sudo systemctl enable --now nfs-server rpcbind
# 配置NFS服务目录  vim /etc/exports 
追加   /usr/local/nfs/volumes *(rw,sync,no_subtree_check,no_root_squash)
# /usr/local/nfs/volumes 作为服务目录向客户端开放
# 10.244.0.0/16 表示这个网段IP都可以访问,也可以 *  表示任何IP都可以访问
# rw 读写权限
# sync  同步权限
# no_subtree_check  如果输出目录是一个子目录,NFS服务器不检查其父目录的权限
# no_root_squash    客户端连接服务端时如果使用是root用户,那么也拥有对服务端分享的目录的root权限

# 重启服务,让上面的配置生效
sudo exportfs -ra  
# 重新加载exports配置
sudo systemctl restart nfs-kernel-server 
##  上面是针对 nfs 服务端的操作  
## 下面对nfs检测是否能使用,可以跟上面同一个节点或另外找一个节点  以下以是在k8s 集群的节点中操作
# 安装客户端
apt update
apt install -y nfs-common
# 创建NFS 客户端挂载目录
mkdir -pv /usr/local/kubernetes/nfs-volumes-mount
# 将NFS服务端/usr/local/nfs/volumes  的目录挂载到NFS 客户端的 /usr/local/kubernetes/nfs-volumes-mount 目录
# 如果报错 mount.nfs: access denied by server while mounting
# 要检查 是否允许ip地址挂载,或是否有读写的权限 
mount 172.30.164.60:/usr/local/nfs/volumes /usr/local/kubernetes/nfs-volumes-mount 
# 查看是否挂载成功
df  | grep mount

# 取消NFS 客户端挂载   注意不要直接在挂载目录下执行(就是不能在nfs-volumes-mount目录下执行),否则会报错(device is busy
)
umount /usr/local/kubernetes/nfs-volumes-mount 
# nfs-volumes-mount  这个文件夹也需要手动删除

》》或者在安装nfs客户端节点 机器中 执行

》showmount -e 172.30.164.60 ip地址就是 nfs服务端的ip




PV PVC

》》定义pv

csharp 复制代码
# 只需在master节点执行 
# 创建pv的配置文件
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-sqlserver
spec:
  # 设置容量
  capacity:
    storage: 5Gi
  # 访问模式
  accessModes:
    # 该卷能够以读写模式被多个节点同时加载
    - ReadWriteMany
  # 回收策略,这里是基础擦除  相当于 rm -rf /挂载/
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    # NFS 服务端设置的路径  就是 vim /etc/exports
    path: "/usr/local/nfs/volumes"
    # NFS 服务端地址
    server: 172.30.164.60
    readOnly: false
csharp 复制代码
# 
kubectl create -f nfs-pv-sqlserver.yml
# 
kubectl get pv

》》定义pvc

csharp 复制代码
# 也只需要在 master节点执行 
# nfs-pvc-sqlserver.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
 name: nfs-pvc-sqlserver-zen
spec:
  accessModes:
  # 需要使用和PV 一致的访问模式
  - ReadWriteMany
  # 按需分配资源
  resources:
    requests:
      storage: 2Gi
  
# 部署 上面的yml文件
kubectl create -f nfs-pvc-sqlserver.yml 
# 查看
kubectl get pvc 

》》定义sqlserver 配置文件

csharp 复制代码
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: sqlserver
---
# sqlserver-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mssql-secret
  namespace: sqlserver
type: Opaque
data:
  MSSQL_SA_PASSWORD: "U3VwZXJTdHJvbmdQYXNzMTIzIQ=="  # Base64 编码的密码(示例:SuperStrongPass123!)
---
# sqlserver 部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mssql-deployment
  namespace: sqlserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mssql
  template:
    metadata:
      labels:
        app: mssql
    spec:
      containers:
      - name: mssql
        image: mcr.microsoft.com/mssql/server:2022-latest
        ports:
        - containerPort: 1433
        env:
        - name: MSSQL_PID
          value: "Developer"  # 版本:Developer/Express/Enterprise(按需选择)
        - name: ACCEPT_EULA
          value: "Y"
        - name: MSSQL_SA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mssql-secret
              key: MSSQL_SA_PASSWORD
        volumeMounts:
        - name: mssql-data
          mountPath: /var/opt/mssql
      volumes:
      - name: mssql-data
        persistentVolumeClaim:
          claimName: nfs-pvc-sqlserver-zen
---
# sqlserver-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mssql-service
  namespace: sqlserver
spec:
  selector:
    app: mssql
  ports:
    - protocol: TCP
      port: 1433
      targetPort: 1433
      nodePort: 30099
  type: NodePort  # 生产环境可改为 LoadBalancer 或 NodePort

可用把 PVC、PV、命名空间、应用部署(sqlserver) 放在一个ymal文件

csharp 复制代码
# 创建命名空间
apiVersion: v1
kind: Namespace
metadata:
  name: sqlserver
---
# pv配置文件
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv-sqlserver
    # 由于 PV 是集群级别的资源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespace
    #namespace: sqlserver
  labels:
    app: kaizen
spec:
  # 设置容量
  capacity:
    storage: 5Gi
  # 访问模式
  accessModes:
    # 该卷能够以读写模式被多个节点同时加载
    - ReadWriteMany
  # 回收策略,这里是基础擦除  相当于 rm -rf /挂载/*
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    # NFS 服务端设置的路径  就是 vim /etc/exports
    path: "/usr/local/nfs/volumes"
    # NFS 服务端地址
    server: 172.30.164.60
    readOnly: false
---
# pvc  配置文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
 name: nfs-pvc-sqlserver-zen
 namespace: sqlserver
spec:
  accessModes:
  # 需要使用和PV 一致的访问模式
  - ReadWriteMany
  # 按需分配资源
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs
  selector:
    matchLabels:
      app: kaizen
---
# sqlserver-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mssql-secret
  namespace: sqlserver
type: Opaque
data:
  MSSQL_SA_PASSWORD: "U3VwZXJTdHJvbmdQYXNzMTIzIQ=="  # Base64 编码的密码(示例:SuperStrongPass123!)
---
# sqlserver 部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mssql-deployment
  namespace: sqlserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mssql
  template:
    metadata:
      labels:
        app: mssql
    spec:
      containers:
      - name: mssql
        image: mcr.microsoft.com/mssql/server:2022-latest
        ports:
        - containerPort: 1433
        env:
        - name: MSSQL_PID
          value: "Developer"  # 版本:Developer/Express/Enterprise(按需选择)
        - name: ACCEPT_EULA
          value: "Y"
        - name: MSSQL_SA_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mssql-secret
              key: MSSQL_SA_PASSWORD
        volumeMounts:
        - name: mssql-data
          mountPath: /var/opt/mssql
      volumes:
      - name: mssql-data
        persistentVolumeClaim:
          claimName: nfs-pvc-sqlserver-zen
---
# sqlserver-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mssql-service
  namespace: sqlserver
spec:
  selector:
    app: mssql
  ports:
    - protocol: TCP
      port: 1433
      targetPort: 1433
      nodePort: 30099
  type: NodePort  # 生产环境可改为 LoadBalancer 或 NodePort

》》密码:SuperStrongPass123!

》》持续化了

相关推荐
coder_lorraine1 小时前
【Docker系列】Docker简介:轻松理解容器技术
docker·容器
佳腾_1 小时前
【高性能缓存Redis_中间件】一、快速上手redis缓存中间件
redis·缓存·云原生·中间件·高缓存
AKAMAI1 小时前
教程:在Linode平台上用TrueNAS搭建大规模存储系统
后端·云原生·云计算
孔令飞1 小时前
Go 1.24 新方法:编写性能测试用例方法 testing.B.Loop 介绍
人工智能·云原生·go
老马啸西风1 小时前
Neo4j GDS-08-neo4j GDS 库中路径搜索算法介绍
网络·数据库·算法·云原生·中间件·neo4j·
老马啸西风1 小时前
Neo4j GDS-13-neo4j GDS 库中节点插入算法实现
数据库·算法·云原生·中间件·embedding·neo4j
程序猿chen2 小时前
“堆积木”式话云原生微服务架构(第一回)
java·开发语言·git·后端·微服务·云原生·java-ee
z日火2 小时前
Windows Server 2019 安装 Docker 完整指南
windows·docker·容器
弧襪3 小时前
Docker Swarm 集群
docker·容器·eureka
alden_ygq11 小时前
k8s node inode被耗尽如何处理?
云原生·容器·kubernetes