K8S单机部署-05.静态持久化之PV、PVC(基于NFS)

转载请注明出处

相关链接



Persistent volume

Persistent Volume (持久存储卷)简称PV,是一个K8S资源对象,所以我们可以单独创建一个PV。它不和Pod直接发生关系,而是通过Persistent Volume Claim(PV索取),简称PVC来实现动态绑定。Pod定义里指定的是PVC,然后PVC会根据Pod的要求去自动绑定合适的PV给Pod使用。

PV的访问模式有三种:

1、ReadWriteOnce:

是最基本的方式,可读可写,但只支持被单个Pod挂载。简称:RWO – ReadWriteOnce

2、ReadOnlyMany:

可以以只读的方式被多个Pod挂载。 简称:ROX – ReadOnlyMany

3、ReadWriteMany:

简称:RWX – ReadWriteMany。这种存储可以以读写的方式被多个Pod共享。不是每一种存储都支持
这三种方式,像共享方式,目前支持的还比较少,比较常用的是NFS。
PVC绑定PV时通常根据两个条件来绑定,“存储的大小” 及 “访问模式”。

创建PV有两种方式:

静态PV

管理员手动创建一堆PV,组成一个PV池,供PVC来绑定。

动态PV

在现有PV不满足PVC的请求时,可以使用存储分类(StorageClass),描述具体过程为:PV先创建分类,PVC请求已创建的某个类(StorageClass)的资源,这样就达到动态配置的效果。即通过一个叫 Storage Class的对象由存储系统根据PVC的要求自动创建。
PV创建完后状态会变成Available,等待被PVC绑定。一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。Pod使用完后会释放PV,PV的状态变成Released。变成Released的PV会根据定义的回收策略做相应的回收工作。

PV有三种回收策略:
1、Retain

Retain就是保留现场,K8S什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。

2、Delete

Delete 策略,K8S会自动删除该PV及里面的数据。

3、Recycle

Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。

在实际使用场景里,PV的创建和使用通常不是同一个人。一般为:管理员创建一个PV池,开发人员创建Pod和PVC,PVC里定义了Pod所需存储的大小和访问模式,然后PVC会到PV池里自动匹配最合适的PV给Pod使用

K8S+NFS静态存储模式案例:

部署NFS服务器

可参考
K8S单机部署-04.NFS服务器搭建

PV存储卷创建

kubectl apply -f default_name_pv.yaml

default_name_pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: k8s-nfs-pv
  namespace: default
spec:
  capacity:
    storage: 50G
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.21.223
    path: /middle/nfsdata/

PV配置参数说明:

Capacity 指定 PV 的容量为 100M;
accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。
ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。
persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:
Retain – 需要管理员手工回收。
Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*;
Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure、Disk、OpenStack Cinder Volume 等。
storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
path:指定 PV 在 NFS 服务器上对应的目录。

PVC存储卷创建

kubectl apply -f kubectl apply -f default_name_pvc.yaml

default_name_pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: k8s-nfs-pv
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 1G

POD使用PVC
依旧来创建Nginx来进行验证, 在创建Nginx的时候将pod的日志目录挂载到我们的PVC

nginx 服务

apiVersion: v1
kind: Service
metadata:
  name: demo-nginx
  labels:
    app: demo-nginx
spec:
  type: NodePort
  ports:
  # node port 要求端口大于30000
  - nodePort: 30013
    port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: demo-nginx


---
# nginx 部署 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-nginx
  labels:
    app: demo-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-nginx
  template:
    metadata:
      labels:
        app: demo-nginx
    spec:
      containers:
      - name: demo-nginx
        image: docker.io/nginx:1.22.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "1Gi"
            cpu: "200m"
        volumeMounts:
          - mountPath: /var/log/nginx
            name: nginx-data
      volumes:
      - name: nginx-data
        persistentVolumeClaim:
          claimName: k8s-nfs-pv
      restartPolicy: Always
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

验证

查看pv, pvc 以及pod

[root@master deploy-demo]# kubectl get pv,pvc,pod
NAME                          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS   REASON   AGE
persistentvolume/k8s-nfs-pv   50G        RWX            Retain           Bound    default/k8s-nfs-pv                           3m34s

NAME                               STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/k8s-nfs-pv   Bound    k8s-nfs-pv   50G        RWX                           3m27s

NAME                              READY   STATUS    RESTARTS   AGE
pod/demo-nginx-64fbfbd89b-krg8t   1/1     Running   0          3m17s
[root@master deploy-demo]#
[root@master deploy-demo]#
[root@master deploy-demo]#
[root@master deploy-demo]#
[root@master deploy-demo]# ll /middle/nfsdata/
total 12
-rw-r--r-- 1 nfsnobody nfsnobody 420 Jan 13 20:18 access.log
-rw-r--r-- 1 nfsnobody nfsnobody  12 Jan 13 18:00 demo.txt
-rw-r--r-- 1 nfsnobody nfsnobody 900 Jan 13 20:18 error.log

可以看到 在我们的NFS共享存储下已经有了nginx的日志相关文件
同时可以发现,这里的弊端在pod使用pvc的时候每次都需要创建pvc 和pv 相对繁琐, 后面我们将实践动态存储的方式

转载请注明出处来源

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,以下是使用kubeadm部署Kubernetes 1.27.4的步骤: 1. 确认k8s版本和环境:首先,确认您要部署Kubernetes版本为1.27.4,并确保您的环境满足部署要求,例如操作系统版本、CPU和内存等。 2. 创建配置文件:根据您的需求,创建Kubernetes集群的配置文件,包括证书、网络插件、镜像源等。您可以根据实际情况进行配置。 3. 安装kubeadm:在两台Ubuntu 16.04 64位双核CPU虚拟机上安装kubeadm。您可以使用以下命令安装kubeadm: ```shell sudo apt-get update sudo apt-get install -y kubeadm ``` 4. 初始化Master节点:在其中一台虚拟机上执行以下命令初始化Master节点: ```shell sudo kubeadm init --kubernetes-version=1.27.4 ``` 该命令将会初始化Kubernetes Master节点,并生成一个加入集群的命令。 5. 部署网络插件:根据您的配置文件选择网络插件,这里以flannel为例。在Master节点上执行以下命令部署flannel网络插件: ```shell kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ``` 6. 加入Worker节点:在另一台虚拟机上执行Master节点生成的加入集群的命令,将其加入到Kubernetes集群中: ```shell sudo kubeadm join <Master节点IP>:<Master节点端口> --token <Token值> --discovery-token-ca-cert-hash <证书哈希值> ``` 请将`<Master节点IP>`、`<Master节点端口>`、`<Token值>`和`<证书哈希值>`替换为实际的值。 至此,您已成功使用kubeadm部署Kubernetes 1.27.4集群。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值