k8s持久卷

k8s持久卷:

所有存储都是持久卷的一种类型,可做成pv

普通存储:

数据持久化方式:
基于CSI,支持docker引擎

  • emptyDir 临时卷,对应docker的临时目录
  • hostPath 主机卷,对应docker的目录映射
  • 网络附加存储
    • SAN iscsi
    • NAS nfs、cifs
    • 分布式存储 glusterfs、rbd(ceph)、cephfs
    • 云存储 EBS

存储卷资源:

kubectl explain pod.spec.volumes

配置格式

pod.spec
  containers:
    volumeMounts <[]Object>		#使用哪些存储卷
    - name				#挂载的卷名称
      mountPath			#挂载路径
      readOnly			#是否只读挂载
      subPath			#挂载到哪个子目录
  volumes:
  -	name <str>		#对存储卷的命名
    cephfs
    configMap
      name			#cm的名称
    emptyDir
      medium: 媒介类型		#存数据的方式
        #"",空字符为使用磁盘,默认。指定路径时以路径为准
        #Memory,定义为使用内存
      sizeLimit: 使用上限		#仅内存时生效,避免把内存占完
    gitRepo		#git仓库当做存储卷,依赖物理机git命令
        #实际上,基于empty,但启动后回去git找代码,克隆过来
    glusterfs
    hostPath		
      path			#宿主机路径
      type			#宿主机目录操作类型
        #DirectoryOrCreate,存在使用,不存在则创建
        #Directory,目录在宿主机必须存在
        #FileOrCreate,文件不存在就创建空文件
        #File,文件必须存在
        #Socket,套接字必须存在
        #CharDevice,必须是字符设备
        #BlockDevice,必须是块设备
    iscsi
    name
    nfs				#就版本k8s需要提前在node节点挂载nfs,1.20版是不需要提前挂载了
      path				#共享文件路径
      readOnly			#是否只读挂载
      server			#nfs服务主机名(集群可识别)、ip地址都可以
    persistentVolumeClaim		#PVC,持久存储卷申请
      claimName		#pvc的名称
      readOnly		
    rbd
    vsphereVolume
    ...

案例:

例1: 一个pod中创建两个容器,使用emptyDir卷
apiVersion: apps/v1
kind: Deployment
metadata:
	name: emp-dep
	namespace: default
spec:
	replicas: 1
	selector:
		metadata:
			matchLabels:
				app: empdir-pod
	template:
		metadata:
			labels:
				app: empdir
		spec:
      containers:
        - name: alpine
          image: alpine
          magePullPolicy: IfNotPresent
          command: ["/bin/sh"]
          args: ["-c","while true;do echo `date` >> /data/index.html; sleep 2;done"]
          volumeMounts:		#挂载创建的临时卷
            - name: file		#临时卷名称
              mountPath: /data/	#容器中挂载的目录,自动创建
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
          volumeMounts:
            - name: file
              mountPath: /usr/share/nginx/html/
      volumes:		#创建一个临时卷给pod
        - name: file		#临时卷名称,方便调用
          emptyDir: {}		#{},代表默认用磁盘空间
例2: 使用hostPath
#2个node节点准备文件
mkdir -p /data/web ;echo `hostname` >> /data/web/index.html

#配置文件
cat > hostdir.yml <<eof
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ngx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hostdir
  template:
    metadata:
      labels:
        app: hostdir
    spec:
      volumes:
      - name: html
        hostPath:
          path: /data/web
          type: DirectoryOrCreate
      containers:
      - name: hostdir
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: html
          mountPath: /usr/share/nginx/html
eof   

#创建pod
kubectl apply -f pod-hostPath.yml
kubectl get po -o wide		
curl测试
例3: 使用nfs存储

1)所有主机都需要nfs工具

#全部节点装
yum install -y nfs-utils

#nfs服务主机开启共享文件
vim /etc/exports
/data/xx  2.2.0.0/16(rw,no_root_squash)
exportfs -av

3)写pod文件

cat > nfs-dir.yml<<eof
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ngx-nfs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-dir
  template:
    metadata:
      labels:
        app: nfs-dir
    spec:
      volumes:
        - name: html
          nfs:
            path: /data/xx
            server: node1
            readOnly: false
      containers:
        - name: ngx
          image: nginx
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: html
              mountPath: /usr/share/nginx/html
eof

#创建pod
kubectl apply -f pod-nfs.yml

3)在nfs目录写入数据,测试

echo `hostname -i` >> xx/index.html
curl pod-ip
posted @ 2022-09-02 15:51  suyanhj  阅读(127)  评论(0)    收藏  举报