首页 > 其他分享 >k8s-Volume使用说明

k8s-Volume使用说明

时间:2023-03-07 16:44:25浏览次数:41  
标签:说明 name deploy Volume nginx nfs deployment k8s root

Volume常用的几种卷:
  1.emptyDir:本地临时卷:
  2.hostPath:本地卷
  3.NFS:共享卷
  4.configmap: 配置文件

emptyDir: 当 Pod 被分配给节点时,首先创建 emptyDir 卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。
Pod 中的容器可以读取和写入 emptyDir 卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除或重构Pod时,emptyDir 中的数据将被永久删除。

[root@localhost7C case3]# cat  deploy_empty.yml 
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: linux39
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:        #容器卷
        - mountPath: /cache  #容器路径 ,会自动创建
          name: cache-volume #调用宿主机名
      volumes:               #node节点宿主机卷  
      - name: cache-volume   #node节点宿主机名,也是物理路径名称,会自动创建
        emptyDir: {}         #启用emptyDir功能 



#测试方法 在容器中创建一个文件,在节点上查找(/var/lib/kubelet/pods/) 。
[root@localhost7F k8s]# kubectl  apply  -f deploy_empty.yml 
deployment.apps/nginx-deployment created

[root@localhost7F k8s]# kubectl get pod -A -o wide
linux39      nginx-deployment-7cc86d98d5-csnx8       1/1    Running       0      47s     10.20.2.4       localhost7f.localdomain   <none>        <none>
[root@localhost7F k8s]# 
[root@localhost7F k8s]# kubectl exec -it -n linux39  nginx-deployment-7cc86d98d5-csnx8 bash
root@nginx-deployment-7cc86d98d5-csnx8:/# echo xxxxxx >> /cache/file.txt
root@nginx-deployment-7cc86d98d5-csnx8:/# ls  /cache/
file.txt

#宿主机
[root@localhost7J ~]# find /var/lib/kubelet/  -name file.txt
/var/lib/kubelet/pods/ce59b450-18b6-423b-8d1f-03afce8b8c54/volumes/kubernetes.io~empty-dir/cache-volume/file.txt       
[root@localhost7J ~]# cat /var/lib/kubelet/pods/ce59b450-18b6-423b-8d1f-03afce8b8c54/volumes/kubernetes.io~empty-dir/cache-volume/file.txt
xxxxxx

[root@localhost7F k8s]# kubectl  delete  -f deploy_empty.yml 
deployment.apps "nginx-deployment" deleted

#文件没有
[root@localhost7J ~]# ll /var/lib/kubelet/pods/
hostPath:hostPath 卷将主机节点的文件系统中的文件或目录挂载到集群中,pod删除的时候,卷不会被删除


#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx 
        ports:
        - containerPort: 80
        volumeMounts:               #容器卷
        - mountPath: /data/mysql    #容器路径 ,会自动创建
          name: data-volume         #调用宿主机名
      volumes:                      #node节点宿主机卷 
      - name: data-volume           #node节点宿主机名
        hostPath:                   #启用hostpath功能 
          path: /data/mysql         #node节点物理路径名称,会自动创建


#测试方法 在容器中创建一个文件,在节点上查找(/var/lib/kubelet/pods/) 。
#思考:如果pod重构后在另一个节点,数据文件会复制过去吗?答案是不能。
#思考:根据第一个问题,文件是不复制过去, 可以使用nodeSelector节点筛选器,使pod只运行某一节点。还有一方案是使用NFS共享卷。

[root@localhost7C k8s]# kubectl  apply -f deploy_hostPath.yml 
deployment.apps/nginx-deployment created
[root@localhost7C k8s]# kubectl get pod -A -o wide
NAMESPACE         NAME                           READY   STATUS              RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
default   nginx-deployment-7944748bc4-f9vvl        1/1     Running            0       34s     10.20.2.5   localhost7f.localdomain   <none>           <none>


[root@localhost7C k8s]C kubectl  exec -it nginx-deployment-7944748bc4-f9vvl  bash
root@nginx-deployment-7944748bc4-f9vvl:/# echo aaaa >> /data/mysql/file.txt

#文件在
[root@localhost7F~]# cat  /data/mysql/file.txt 
aaaa

#drain命令:用于在维护期间排除节点,驱逐node上的业务pod,用于node节点下线。
[root@localhost7C k8s]# kubectl drain localhost7f.localdomain
[root@localhost7C case3]# kubectl get pods  -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE                      NOMINATED NODE   READINESS GATES
nginx-deployment-7944748bc4-dn7ss   1/1     Running   0          96s   10.10.4.28   localhost7g.localdomain   <none>           <none>

#没有文件
[root@localhost7G ~]# ll /data/mysql/


[root@localhost7C k8s]C kubectl  exec -it nginx-deployment-7944748bc4-dn7ss  bash
root@nginx-deployment-7944748bc4-f9vvl:/# echo aaaa >> /data/mysql/file.txt

[root@localhost7C k8s]# kubectl  delete  -f  deploy_hostPath.yml 
deployment.apps "nginx-deployment" deleted

#pod删除文件还在
[root@localhost7J ~]# cat  /data/mysql/file.txt 
aaaa
NFS:  nfs卷允许将现有的 NFS(网络文件系统)共享挂载到您的容器中。不像 emptyDir,当删除 Pod 时,nfs 卷的内容被保留,卷仅仅是
被卸载。这意味着 NFS 卷可以预填充数据,并且可以在 pod 之间“切换”数据。 NFS 可以被多个写入者同时挂载。

#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx 
        ports:
        - containerPort: 80
        volumeMounts:                                #启用卷挂载
        - mountPath: /usr/share/nginx/html/mysite    #容器挂载路径,mysite文件夹会自动创建。
          name: my-nfs-volume                        #卷名,调用NFS共享名

        - mountPath: /data/nginx/html
          name: linux39-nfs-volume 
      volumes:
      - name: my-nfs-volume                     #随机的NFS共享名
        nfs:
          server: 192.168.80.110                #NFS地址
          path: /nfs/datanfs                    #NFS路径名称,先创建。

      - name: linux39-nfs-volume
        nfs:
          server: 192.168.80.110
          path: /data/linux39


---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80
    nodePort: 30016
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80




#查看下node宿主机的挂载情况。
#测试中发现,多个pod可以同时挂载同一个NFS
#测试中发现,NFS的地址范围除了pod地址,也要包括node节点的地址,因为NFS挂载是先挂载node宿主机,再node宿主机挂载到pod中的。

#安装NFS
[root@localhost7B ~]#yum install nfs-utils.x86_64  -y
[root@localhost7B ~]#systemctl  start  nfs.service 

[root@localhost7B ~]# mkdir /nfs/datanfs  -p
[root@localhost7B ~]# vim /etc/exports
/nfs/datanfs  *(rw)

[root@localhost7B ~]# systemctl  restart  nfs.service 

[root@localhost7B ~]# echo nginx config file >  /nfs/datanfs/nginx.conf


#另一机子测试
showmount  -e 192.168.80.110
mount  192.168.80.100:/nfs/datanfs   /mnt/cdrom/
umount /mnt/cdrom/



[root@localhost7F k8s]# kubectl  apply  -f deploy_nfs.yml 
deployment.apps/nginx-deployment created
service/ng-deploy-80 created
[root@localhost7F k8s]# kubectl  get pod -A
NAMESPACE              NAME                                         READY   STATUS             RESTARTS   AGE
default                nginx-deployment-76567bccb4-zg765            1/1     Running            0          64s

[root@localhost7F k8s]# kubectl exec  -it  nginx-deployment-76567bccb4-zg765 bash
root@nginx-deployment-76567bccb4-zg765:/# ll /usr/share/nginx/html/
50x.html    index.html  mysite/     
root@nginx-deployment-76567bccb4-zg765:/# cat  /usr/share/nginx/html/mysite/nginx.conf 
nginx config file

#容器的挂载信息
root@nginx-deployment-76567bccb4-zg765:/# mount   | grep datanfs
192.168.80.110:/nfs/datanfs on /usr/share/nginx/html/mysite type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.150,local_lock=none,addr=192.168.80.110)

#宿主机的挂载信息
[root@localhost7F ~]# mount | grep datanfs
192.168.80.110:/nfs/datanfs on /var/lib/kubelet/pods/bdae2519-de34-4219-8314-38caad08673a/volumes/kubernetes.io~nfs/my-nfs-volume type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.150,local_lock=none,addr=192.168.80.110)
configmap:将配置信息放到configmap对象中,然后在pod的对象中导入configmap对象,实现导入配置的操作
声明一个ConfigMap的对象,作为Volume挂载到pod中

#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx 
        ports:
        - containerPort: 80
        volumeMounts:                                #启用卷挂载
        - mountPath: /usr/share/nginx/html/mysite    #容器挂载路径,mysite文件夹会自动创建。
          name: my-nfs-volume                        #卷名,调用NFS共享名

        - mountPath: /data/nginx/html
          name: linux39-nfs-volume 
      volumes:
      - name: my-nfs-volume                     #随机的NFS共享名
        nfs:
          server: 192.168.80.110                #NFS地址
          path: /nfs/datanfs                    #NFS路径名称,先创建。

      - name: linux39-nfs-volume
        nfs:
          server: 192.168.80.110
          path: /data/linux39


---
apiVersion: v1
kind: Service
metadata:
  name: ng-deploy-80
spec:
  ports:
  - name: http
    port: 81
    targetPort: 80
    nodePort: 30016
    protocol: TCP
  type: NodePort
  selector:
    app: ng-deploy-80




#查看下node宿主机的挂载情况。
#测试中发现,多个pod可以同时挂载同一个NFS
#测试中发现,NFS的地址范围除了pod地址,也要包括node节点的地址,因为NFS挂载是先挂载node宿主机,再node宿主机挂载到pod中的。

#安装NFS
[root@localhost7B ~]#yum install nfs-utils.x86_64  -y
[root@localhost7B ~]#systemctl  start  nfs.service 

[root@localhost7B ~]# mkdir /nfs/datanfs  -p
[root@localhost7B ~]# vim /etc/exports
/nfs/datanfs  *(rw)

[root@localhost7B ~]# systemctl  restart  nfs.service 

[root@localhost7B ~]# echo nginx config file >  /nfs/datanfs/nginx.conf


#另一机子测试
showmount  -e 192.168.80.110
mount  192.168.80.100:/nfs/datanfs   /mnt/cdrom/
umount /mnt/cdrom/





[root@localhost7F k8s]# kubectl  apply  -f deploy_nfs.yml 
deployment.apps/nginx-deployment created
service/ng-deploy-80 created
[root@localhost7F k8s]# kubectl  get pod -A
NAMESPACE              NAME                                         READY   STATUS             RESTARTS   AGE
default                nginx-deployment-76567bccb4-zg765            1/1     Running            0          64s

[root@localhost7F k8s]# kubectl exec  -it  nginx-deployment-76567bccb4-zg765 bash
root@nginx-deployment-76567bccb4-zg765:/# ll /usr/share/nginx/html/
50x.html    index.html  mysite/     
root@nginx-deployment-76567bccb4-zg765:/# cat  /usr/share/nginx/html/mysite/nginx.conf 
nginx config file

#容器的挂载信息
root@nginx-deployment-76567bccb4-zg765:/# mount   | grep datanfs
192.168.80.110:/nfs/datanfs on /usr/share/nginx/html/mysite type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.150,local_lock=none,addr=192.168.80.110)

#宿主机的挂载信息
[root@localhost7F ~]# mount | grep datanfs
192.168.80.110:/nfs/datanfs on /var/lib/kubelet/pods/bdae2519-de34-4219-8314-38caad08673a/volumes/kubernetes.io~nfs/my-nfs-volume type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.80.150,local_lock=none,addr=192.168.80.110)




实例2:将ConfigMap中的数据设置为容器的环境变量

apiVersion: v1
kind: ConfigMap

#定义configmap名称,
metadata:
  name: nginx-config
data:
  username: user1   #pod中变量的值,可以定义多个。
   


---
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ng-deploy-80
  template:
    metadata:
      labels:
        app: ng-deploy-80
    spec:
      containers:
      - name: ng-deploy-80
        image: nginx 
        env:
        - name: MY_USERNAME  #pod中定义的变量名
          valueFrom:
            configMapKeyRef:      #
              name: nginx-config  #调用configmap名称
              key: username
        ports:
        - containerPort: 80


[root@localhost7F k8s]# kubectl apply  -f deploy_configmap.yml 
root@nginx-deployment-669d88577-vf4nh:/# kubectl  exec -it nginx-deployment-669d88577-vf4nh bash

root@nginx-deployment-669d88577-vf4nh:/# echo $MY_USERNAME
user1

 

标签:说明,name,deploy,Volume,nginx,nfs,deployment,k8s,root
From: https://www.cnblogs.com/Yuanbangchen/p/17188564.html

相关文章

  • K8S的资源配置管理 (云原生)
    一、SecretSecret是用来保存密码、token、密钥等敏感数据的k8s资源,这类数据虽然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少......
  • K8S内部网络通信是如何实现的?
    在本文中,我们将探讨GoogleKubernetesEngine(GKE)的网络组件以及现有的各种选项。Kubernetes是一个用于管理容器化工作负载和服务的开源平台,而GKE是一个完全托管的环......
  • Higress on K8s 5分钟开箱即用
    作者:澄潭Higress简介Higress是云原生网关的提出者和定义者,实现了K8s的IngressAPI标准,历经阿里双十一洪峰考验,对比IngressNginx具备以下优势:5分钟开箱即用Step0.......
  • markdown的使用说明
    目录markdown的使用说明一、标题二、段落1、换行2、分割线三、文字显示1、字体2、上下标四、列表1、无序列表2、有序列表3、任务列表五、区块显示六、代码显示1、行内代码2......
  • Higress on K8s 5分钟开箱即用
    作者:澄潭Higress简介Higress是云原生网关的提出者和定义者,实现了K8s的IngressAPI标准,历经阿里双十一洪峰考验,对比IngressNginx具备以下优势:5分钟开箱即用......
  • 【vue开发】vue 项目中 .eslintrc.js 配置示例,有配置说明
    module.exports={root:true,env:{node:true},extends:['plugin:vue/essential','plugin:vue/recommended','eslint:recommended'],parserOpt......
  • CentOS-1810系统DHCP服务器ISC DHCP软件配置说明
    DHCP全称DynamicHostconfigurationprotocol,动态主机配置协议。是一个局域网的网络协议,使用UDP协议工作,它可以为客户机自动分配IP地址、子网掩码以及缺省网关、DNS服务......
  • K8S域名解析问题分析
    ......
  • Controller配置方式及RequestMapping说明
    一.控制器controller控制器复杂提供访问应用程序的行为,通常通过接口定义和注解定义两种方式实现控制器负责解析用户的请求并将其转化为一个模型在springMVC中一个控制......
  • nginx 命令说明
    #启动命令./sbin/nginx-c./conf/nginx.conf#验证配置是否正确./nginx-t回显testissuccessful说明配置正确第二种方法  ./sbin/nginx-t-c./conf/nginx.conf......