iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >docker中k8s存储卷的示例分析
  • 537
分享到

docker中k8s存储卷的示例分析

2023-06-04 14:06:24 537人浏览 泡泡鱼
摘要

这篇文章给大家分享的是有关Docker中k8s存储卷的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。    因为pod是有生命周期的,pod一重启,里面的数据就没了

这篇文章给大家分享的是有关Dockerk8s存储卷的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    因为pod是有生命周期的,pod一重启,里面的数据就没了。所以我们需要数据持久化存储。

    在k8s中,存储卷不属于容器,而是属于pod。也就是说同一个pod中的容器可以共享一个存储卷。

    存储卷可以是宿主机上的目录,也可以是挂载在宿主机上的外部设备。

存储卷类型

    emptyDIR存储卷:pod一重启,存储卷也删除,这叫emptyDir存储卷。一般用于当做临时空间或缓存关系

    hostPath存储卷:宿主机上目录作为存储卷,这种也不是真正意义实现了数据持久性。

    SAN(iscsi)或NAS(nfs、cifs):网络存储设备

    分布式存储(ceph,glusterfs,cephfs,rbd)

    云存储(亚马逊的EBS,Azure Disk,阿里云):这种一般k8s也在云上部署的。

    关键数据一定要有异地备份,否则数据一删,多少个副本都没用。

[root@master ingress]# kubectl explain pods.spec.volumes

 hostPath

功能:使用宿主机上目录作为存储卷,这种也不是真正意义实现了数据持久性。

[root@master ~]# kubectl explain pods.spec.volumes.hostPath.typeKIND:     PodVERSioN:  v1FIELD:    type <string>DESCRIPTION:     Type for HostPath Volume Defaults to "" More info:     https://kubernetes.io/docs/concepts/storage/volumes#hostpath

查看帮助:Https://kubernetes.io/docs/concepts/storage/volumes#hostpath

hostPath.type的类型说明:

DirectoryOrCreate:意思是我们要挂载的路径在宿主机上是个已经存在的目录,不存在就创建一个新的目录。

Directory:宿主机上必须实现存在目录,如果不存在就报错

FileOrCreate:表示挂载的是文件,如果不存在就挂载一个文件。文件也可以当做存储挂载的。

File:表示要挂载的文件必须事先存在,否则就报错。

Socket:表示必须是一个Socket类型的文件。

CharDevice:表示是一个字符类型的设备文件。

BlockDevice:表示的是一个块类型的设备文件。

例子:

[root@master volumes]# cat pod-hostpath-vol.yaml 

apiVersion: v1kind: Podmetadata:  name: pod-vol-hostpath  namespace: defaultspec:  containers:  - name: myapp    image: ikubernetes/myapp:v1    volumeMounts:    - name: html #存储卷的名字叫html      mountPath: /usr/share/Nginx/html/ #挂载路径  volumes:  - name: html    hostPath:      path: /data/pod/volume1      type: DirectoryOrCreate
[root@master volumes]# kubectl apply -f pod-hostpath-vol.yaml pod/pod-vol-hostpath created

    然后到node1节点上可以看到/data/pod/volume1目录已经创建出来了。

[root@master volumes]# kubectl get pods -o wideNAME                             READY     STATUS             RESTARTS   AGE       IP             NODEclient                           0/1       Error              0          15d       10.244.2.4     node2pod-vol-hostpath                 1/1       Running            0          4m        10.244.1.105   node1

    当node1节点宕机后,pod就飘到node2节点上,并使用node2节点上的/data/pod/volume1目录。这就有问题了,因为node2节点上的目录并没有同步node1节点上目录的数据,所以出现数据不一致。

    解决这个问题的方法就是使用类似nfs方法,让两个node节点共享一个存储。

使用nfs做共享存储

    我这里为了方便,把master节点当做nfs存储。

[root@master ~]# yum -y install nfs-utils
[root@master ~]# mkdir /data/volumes
[root@master ~]# cat /etc/exports#no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用! #root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份;/data/volumes 172.16.0.0/16(rw,no_root_squash)
[root@master ~]# systemctl start nfs

    在node1和node2上也安装nfs-utils包

[root@node1 ~]# yum -y install nfs-utils

    在node1和node2上挂载:

[root@node1 ~]# mount -t nfs 172.16.1.100:/data/volumes /mnt

    在master上:

[root@master ~]# kubectl explain pods.spec.volumes.nfs
[root@master volumes]# cat pod-vol-nfs.yaml apiVersion: v1kind: Podmetadata:  name: pod-vol-nfs  namespace: defaultspec:  containers:  - name: myapp    image: ikubernetes/myapp:v1    volumeMounts:    - name: html #存储卷的名字叫html      mountPath: /usr/share/nginx/html/ #挂载路径,myapp容器里面的路径  volumes:  - name: html    nfs:      path: /data/volumes      server: 172.16.1.100 #nfs server ip
[root@master volumes]# kubectl apply -f pod-vol-nfs.yaml
[root@master volumes]# kubectl get pods -o wideNAME                             READY     STATUS             RESTARTS   AGE       IP             NODEpod-vol-nfs                      1/1       Running            0          1m        10.244.1.106   node1
[root@master volumes]# cat /data/volumes/index.htmlhello world
[root@master volumes]# curl  10.244.1.106 #容器的iphello world

    可见容器使用的是nfs提供的共享存储。

    不过,nfs自身没有冗余能力,所以如果nfs宕机了,数据也丢了。因此,我们一般用glusterfs或者cephfs分布式存储。

pvc和pv

    用户只需要挂载pvc到容器中而不需要关注存储卷采用何种技术实现。pvc和pv的关系与pod和node关系类似,前者消耗后者的资源。pvc可以向pv申请指定大小的存储资源并设置访问模式。

docker中k8s存储卷的示例分析

    在定义pod时,我们只需要说明我们要一个多大的存储卷就行了。pvc存储卷必须与当前namespace的pvc建立直接绑定关系。pvc必须与pv建立绑定关系。而pv是真正的某个存储设备上的空间。

docker中k8s存储卷的示例分析

[root@master volumes]# kubectl explain pods.spec.volumes.persistentVolumeClaim
[root@master volumes]# kubectl explain pvc

    一个pvc和pv是一一对应关系,一旦一个pv被一个pvc绑定了,那么这个pv就不能被其他pvc绑定了。

    一个pvc是可以被多个pod所访问的。

    在存储机器上建立如下几个目录(这里我以master节点做存储,生产中可以单独拿出 一个机器做存储):

[root@master volumes]# mkdir v{1,2,3,4,5}
[root@master volumes]# cat  /etc/exports#no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用! #root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份;/data/volumes/v1 172.16.0.0/16(rw,no_root_squash) /data/volumes/v2 172.16.0.0/16(rw,no_root_squash) /data/volumes/v3 172.16.0.0/16(rw,no_root_squash) /data/volumes/v4 172.16.0.0/16(rw,no_root_squash) /data/volumes/v5 172.16.0.0/16(rw,no_root_squash)
[root@master volumes]# exportfs  -arv #不用重启nfs服务,配置文件就会生效exporting 172.16.0.0/16:/data/volumes/v5exporting 172.16.0.0/16:/data/volumes/v4exporting 172.16.0.0/16:/data/volumes/v3exporting 172.16.0.0/16:/data/volumes/v2exporting 172.16.0.0/16:/data/volumes/v1
[root@master volumes]# showmount -eExport list for master:/data/volumes/v5 172.16.0.0/16/data/volumes/v4 172.16.0.0/16/data/volumes/v3 172.16.0.0/16/data/volumes/v2 172.16.0.0/16/data/volumes/v1 172.16.0.0/16
[root@master volumes]# kubectl explain pv.spec.nfs
[root@master ~]# kubectl explain pv.specFIELDS:   acceSSModes<[]string>     AccessModes contains all ways the volume can be mounted. More info:     https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes

访问 https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes看帮助。

accessModes模式有:

ReadWriteOnce:单路读写,可以简写为RWO

ReadOnlyMany:多路只读,可以简写为ROX

ReadWriteMany :多路读写,可以简写为RWX

不同类型的存储卷支持的accessModes也不同。

docker中k8s存储卷的示例分析

[root@master volumes]# cat pv-demo.yaml apiVersion: v1kind: PersistentVolumemetadata:  name: pv001 #注意,定义pv时一定不要加名称空间,因为pv是属于整个集群,而不是属于某个名称空间。但pvc是属于某个名称空间的  labels:    name: pv001spec:  nfs:    path: /data/volumes/v1    server: 172.16.1.100  accessModes: ["ReadWriteMany","ReadWriteOnce"]  capacity: #分配磁盘空间大小    storage: 1Gi---apiVersion: v1kind: PersistentVolumemetadata:  name: pv002 #注意,定义pv时一定不要加名称空间,因为pv是属于整个集群,而不是属于某个名称空间。但pvc是属于某个名称空间的  labels:    name: pv002spec:  nfs:    path: /data/volumes/v2    server: 172.16.1.100  accessModes: ["ReadWriteOnce"]  capacity: #分配磁盘空间大小    storage: 2Gi---apiVersion: v1kind: PersistentVolumemetadata:  name: pv003 #注意,定义pv时一定不要加名称空间,因为pv是属于整个集群,而不是属于某个名称空间。但pvc是属于某个名称空间的  labels:    name: pv003spec:  nfs:    path: /data/volumes/v3    server: 172.16.1.100  accessModes: ["ReadWriteMany","ReadWriteOnce"]  capacity: #分配磁盘空间大小    storage: 1Gi---apiVersion: v1kind: PersistentVolumemetadata:  name: pv004 #注意,定义pv时一定不要加名称空间,因为pv是属于整个集群,而不是属于某个名称空间。但pvc是属于某个名称空间的  labels:    name: pv004spec:  nfs:    path: /data/volumes/v4    server: 172.16.1.100  accessModes: ["ReadWriteMany","ReadWriteOnce"]  capacity: #分配磁盘空间大小    storage: 1Gi---apiVersion: v1kind: PersistentVolumemetadata:  name: pv005 #注意,定义pv时一定不要加名称空间,因为pv是属于整个集群,而不是属于某个名称空间。但pvc是属于某个名称空间的  labels:    name: pv005spec:  nfs:    path: /data/volumes/v5    server: 172.16.1.100  accessModes: ["ReadWriteMany","ReadWriteOnce"]  capacity: #分配磁盘空间大小    storage: 1Gi
[root@master volumes]# kubectl apply -f pv-demo.yaml persistentvolume/pv001 createdpersistentvolume/pv002 createdpersistentvolume/pv003 createdpersistentvolume/pv004 createdpersistentvolume/pv005 created
[root@master volumes]# kubectl get pvNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGEpv001     1Gi        RWO,RWX        Retain           Available                                      2mpv002     2Gi        RWO            Retain           Available                                      2mpv003     1Gi        RWO,RWX        Retain           Available                                      2mpv004     1Gi        RWO,RWX        Retain           Available                                      2mpv005     1Gi        RWO,RWX        Retain           Available                                      2m

    回收策略:如果某个pvc在pv里面存数据了,后来pvc删了,那么 pv里面的数据怎么处理呢。有如下几种策略:

    reclaim_policy:即pvc删了,但是pv里面的数据不擅长,还保留着。

    recycle:即pvc删了,那么就把pv里面的数据也删了。

    delete:即pvc删了,那么就把pv也删了。

    下面我们再创建pvc的清单文件。

[root@master ~]# kubectl explain pvc.spec
[root@master ~]# kubectl explain pods.spec.volumes.persistentVolumeClaim
[root@master volumes]# cat pod-vol-pvc.yaml apiVersion: v1kind: PersistentVolumeClaim #简称pvcmetadata:  name: mypvc  namespace: default #pvc和pod是在同一个名称空间spec:  accessModes: ["ReadWriteMany"] #一定是pv策略的子集  resources:    requests:      storage: 1Gi #表示我要pvc 为1G的空间---apiVersion: v1kind: Podmetadata:  name: pod-vol-pvc  namespace: defaultspec:  containers:  - name: myapp    image: ikubernetes/myapp:v1    volumeMounts:    - name: html #存储卷的名字叫html      mountPath: /usr/share/nginx/html/ #挂载路径  volumes:  - name: html    persistentVolumeClaim:      claimName: mypvc #表示我要使用哪个pvc
[root@master volumes]# kubectl apply -f pod-vol-pvc.yaml persistentvolumeclaim/mypvc createdpod/pod-vol-pvc created
[root@master volumes]# kubectl get pvNAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON    AGEpv001     1Gi        RWO,RWX        Retain           Available                                            7hpv002     2Gi        RWO            Retain           Available                                            7hpv003     1Gi        RWO,RWX        Retain           Available                                            7hpv004     1Gi        RWO,RWX        Retain           Bound       default/mypvc                            7hpv005     1Gi        RWO,RWX        Retain           Available                                            7h

    上面看到pv004被default名称空间的mypvc绑定了。

[root@master volumes]# kubectl get pvcNAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGEmypvc     Bound     pv004     1Gi        RWO,RWX                       33m
[root@master volumes]# kubectl get pods NAME                             READY     STATUS             RESTARTS   AGEclient                           0/1       Error              0          16dpod-vol-pvc                      1/1       Running            0          35m

    生产上,pv并不属于node节点,而是独立于node节点的。所以,node节点坏了,pv里面的数据还在。另外,pod才是属于node节点的。

    在k8s 1.10之后,不能手工从底层删除pv,这样做很安全。

 StorageClass(存储类)

docker中k8s存储卷的示例分析

    Kubernetes集群管理员通过提供不同的存储类,可以满足用户不同的服务质量级别、备份策略和任意策略要求的存储需求。动态存储卷供应使用StorageClass进行实现,其允许存储卷按需被创建。如果没有动态存储供应,Kubernetes集群的管理员将不得不通过手工的方式类创建新的存储卷。通过动态存储卷,Kubernetes将能够按照用户的需要,自动创建其需要的存储。

    storageclass底层可以是glusterfs,cephfs等不同的集群。

configmap   

    configmap和secret是两种特殊的存储卷,它们不是给pod提供存储空间用的,而是给我们的管理员或者用户提供了从外部向pod内部注入信息的方式。

    configmap:把配置文件放在配置中心上,然后多个pod读取配置中心的配置文件。不过,configmap中的配置信息都是明文的,所以不安全。

     secret:功能和configmap一样,只不过配置中心存储的配置文件不是明文的。

    configmap和secret也是专属于某个名称空间的。

[root@master ~]# kubectl explain configmap[root@master ~]# kubectl explain cm #简写[root@master ~]# kubectl create configmap --help

    简单的我们可以用命令行来创建configmap。

[root@master ~]# kubectl create configmap nginx-config --from-literal=nginx_port=80 --from-literal=server_name=myapp.zhixin.comconfigmap/nginx-config created
[root@master ~]# kubectl get cmNAME           DATA      AGEnginx-config   2         3m
[root@master ~]# kubectl describe cm nginx-configName:         nginx-configNamespace:    defaultLabels:       <none>Annotations:  <none>Data====nginx_port:----80server_name:----myapp.zhixin.com

    下面我们用配置清单的方式来创建configmap:

[root@master configmap]# cat www.conf server {      server_name myapp.zhixin.com;      listen 80;      root /data/WEB/html;}
[root@master configmap]# kubectl create configmap nginx-www --from-file=www.confconfigmap/nginx-www created
[root@master configmap]# kubectl get cmNAME           DATA      AGEnginx-config   2         3mnginx-www      1         7s
[root@master configmap]# kubectl describe cm nginx-www Name:         nginx-wwwNamespace:    defaultLabels:       <none>Annotations:  <none>Data====www.conf:----server {      server_name myapp.zhixin.com;      listen 80;      root /data/web/html;}

    我们创建的configmap,可用ENV等方式注入到Pod中。

    我们用ENV方式来把configmap注入到pod中去。

[root@master configmap]# cat pod-configmap.yaml apiVersion: v1kind: Podmetadata:  name: pod-cm-1  namespace: default  labels:    app: myapp  #kv格式的,也可以用花括号表示    tier: frontend #定义所属的层次  annotations:    chenzx.com/created-by: "cluster-admin" #这是注解的键值对spec:  containers:   - name: myapp  #前面的-号表示这是一个列表格式的,也可以用中括号表示    image: Tomcat     ports:    - name: http      containerPort: 80    env: #这是一个容器的属性    - name: NGINX_SERVER_PORT      valueFrom: #kubectl explain pods.spec.containers.env.valueFrom        configMapKeyRef: #表示我们要引用一个configmap来获取数据          name: nginx-config #这是configmap的名字,也就是通过kubectl get cm获取的名字          key: nginx_port #通过kubectl describe cm nginx-config的键     #下面开始引用第二个环境变量    - name: NGINX_SERVER_NAME      valueFrom:        configMapKeyRef:          name: nginx-config          key: server_name
[root@master configmap]# kubectl apply -f pod-configmap.yaml pod/pod-cm-1 created

    这样,我们就建立了一个pod-cm-1的pod,并且这个pod的配置文件来自于configmap。

[root@master configmap]# kubectl get podsNAME                             READY     STATUS                       RESTARTS   AGEpod-cm-1                         0/1       Running   0          15m
[root@master configmap]# kubectl exec -it pod-cm-1 -- /bin/sh# printenvNGINX_SERVER_PORT=80NGINX_SERVER_NAME=myapp.zhixin.com
[root@master configmap]# kubectl edit cm nginx-confiGConfigmap/nginx-config edited

    通过edit方式编辑的配置文件,在Pod里面不会立即理解生效,需要重启pod才能生效。

[root@master configmap]# kubectl delete -f pod-configmap.yaml pod "pod-cm-1" deleted

    下面我们用配置mount存储卷的方法把configmap注入到pod中。

[root@master configmap]# cat pod-configmap2.ymal apiVersion: v1kind: Podmetadata:  name: pod-cm-2  namespace: default  labels:    app: myapp  #kv格式的,也可以用花括号表示    tier: frontend #定义所属的层次  annotations:    chenzx.com/created-by: "cluster-admin" #这是注解的键值对spec:  containers:   - name: myapp  #前面的-号表示这是一个列表格式的,也可以用中括号表示    image: ikubernetes/myapp:v1     ports:    - name: http      containerPort: 80    volumeMounts:    - name: nginxconf      mountPath: /etc/nginx/conf.d/      readOnly: true  volumes:  - name: nginxconf    configMap:      name: nginx-config
[root@master configmap]# kubectl apply -f pod-configmap2.ymal pod/pod-cm-2 created
[root@master configmap]# kubectl get podsNAME                             READY     STATUS             RESTARTS   AGEpod-cm-2                         1/1       Running            0          1m
[root@master configmap]# kubectl exec -it pod-cm-2 -- /bin/sh/ # cd /etc/nginx/conf.d//etc/nginx/conf.d # lsnginx_port   server_name/etc/nginx/conf.d # ls -ltotal 0lrwxrwxrwx    1 root     root            17 Sep 27 05:07 nginx_port -> ..data/nginx_portlrwxrwxrwx    1 root     root            18 Sep 27 05:07 server_name -> ..data/server_name/etc/nginx/conf.d # cat nginx_port8080

    下面我们再把前面我们创建的www.conf文件注入到pod中:

[root@master configmap]# cat pod-configmap3.yaml apiVersion: v1kind: Podmetadata:  name: pod-cm-3  namespace: default  labels:    app: myapp  #kv格式的,也可以用花括号表示    tier: frontend #定义所属的层次  annotations:    chenzx.com/created-by: "cluster-admin" #这是注解的键值对spec:  containers:   - name: myapp  #前面的-号表示这是一个列表格式的,也可以用中括号表示    image: ikubernetes/myapp:v1     ports:    - name: http      containerPort: 80    volumeMounts:    - name: nginxconf      mountPath: /etc/nginx/conf.d/      readOnly: true  volumes:  - name: nginxconf    configMap:      name: nginx-www
[root@master configmap]# kubectl apply -f pod-configmap3.yaml pod/pod-cm-3 created
[root@master configmap]# [root@master configmap]# kubectl get podsNAME                             READY     STATUS             RESTARTS   AGEclient                           0/1       Error              0          16dpod-cm-3                         1/1       Running            0          1m
[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh/ # cd /etc/nginx/conf.d//etc/nginx/conf.d # lswww.conf/etc/nginx/conf.d # cat www.conf server {      server_name myapp.zhixin.com;      listen 80;      root /data/web/html;}

    通过上面的例子,大家看到我们已经把www.conf中的内容注入到了pod myapp中。

[root@master configmap]# kubectl edit cm nginx-www

    改个端口,然后再到pod里面,多等一会就会看到刚才修改的在pod里面生效了。

[root@master configmap]# kubectl exec -it pod-cm-3 -- /bin/sh/ # cd /etc/nginx/conf.d//etc/nginx/conf.d # cat www.conf server {      server_name myapp.zhixin.com;      listen 8081;      root /data/web/html;[root@master configmap]# /etc/init.d/nginx reload #重载nginx使8081端口生效

    如果我们期望只注入部分,而非所有,该怎么做呢?

[root@master configmap]# kubectl explain pods.spec.volumes.configMap.items[root@master configmap]# kubectl create secret generic --help

    通过items来注入部分,这里面就不演示了,请读者自行解决。

secret

    功能和configmap一样,只不过secret配置中心存储的配置文件不是明文的。

 [root@master configmap]# kubectl create secret --help generic:保存密码用的类型 tls:保存证书用的类型 docker-reGIStry:保存docker认证信息用的类型,比如从私有docker仓库拉镜像时,就用这个类型。 备注:k8s拖镜像的进程是kublete
[root@master configmap]# kubectl explain pods.spec.imagePullSecrets如果是从私有仓库拉镜像,就用imagePullSecrets存登录验证的信息

例子:

[root@master configmap]# kubectl create secret generic mysql-root-passWord --from-literal=password=123456secret/Mysql-root-password created
[root@master configmap]# kubectl get secretNAME                    TYPE                                  DATA      AGEdefault-token-5r85r     kubernetes.io/service-account-token   3         19dmysql-root-password     Opaque                                1         40stomcat-ingress-secret   kubernetes.io/tls                     2         2d
[root@master configmap]# kubectl describe secret mysql-root-passwordName:         mysql-root-passwordNamespace:    defaultLabels:       <none>Annotations:  <none>Type:  OpaqueData====password:  6 bytes

    看到password的内容就是base64加密的形式了。

[root@master configmap]# kubectl get secret mysql-root-password -o yamlapiVersion: v1data:  password: MTIzNDU2kind: Secretmetadata:  creationTimestamp: 2018-09-27T06:01:24Z  name: mysql-root-password  namespace: default  resourceVersion: "2482795"  selflink: /api/v1/namespaces/default/secrets/mysql-root-password  uid: c3D3e8ec-c21a-11e8-bb35-005056a24ecbtype: Opaque

    可以用命令base64命令进行明文解码:

[root@master configmap]# echo MTIzNDU2 |base64 -d123456

    可见secret是防君子不防小人,是个伪加密,哈哈。

    下面我们把secret通过env的方式注入到pod里面。

[root@master configmap]# cat  pod-secret-1.yaml apiVersion: v1kind: Podmetadata:  name: pod-secret-1  namespace: default  labels:    app: myapp  #kv格式的,也可以用花括号表示    tier: frontend #定义所属的层次  annotations:    chenzx.com/created-by: "cluster-admin" #这是注解的键值对spec:  containers:   - name: myapp  #前面的-号表示这是一个列表格式的,也可以用中括号表示    image: tomcat     ports:    - name: http      containerPort: 80    env: #这是一个容器的属性    - name: MYSQL_ROOT_PASSWORD      valueFrom: #kubectl explain pods.spec.containers.env.valueFrom        secreTKEyRef: #表示我们要引用一个configmap来获取数据          name: mysql-root-password  #这是configmap的名字,也就是通过kubectl get secret获取的名字          key: password #通过kubectl describe secret mysql-root-password的键     #下面开始引用第二个环境变量    - name: NGINX_SERVER_NAME      valueFrom:        configMapKeyRef:          name: nginx-config          key: server_name
[root@master configmap]# kubectl apply -f pod-secret-1.yaml pod/pod-secret-1 created
[root@master configmap]# kubectl get podsNAME                             READY     STATUS             RESTARTS   AGEpod-secret-1                     1/1       Running            0          1m
[root@master configmap]# kubectl exec -it pod-secret-1 -- /bin/sh# printenvMYSQL_ROOT_PASSWORD=123456

感谢各位的阅读!关于“docker中k8s存储卷的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: docker中k8s存储卷的示例分析

本文链接: https://www.lsjlt.com/news/238319.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • docker中k8s存储卷的示例分析
    这篇文章给大家分享的是有关docker中k8s存储卷的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。    因为pod是有生命周期的,pod一重启,里面的数据就没了...
    99+
    2023-06-04
  • docker中19-k8s的示例分析
    这篇文章主要介绍docker中19-k8s的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!    Docker的第一类编排工具:   &n...
    99+
    2023-06-04
  • Kubernetes中存储卷PV和PVC的示例分析
    这篇文章主要为大家展示了“Kubernetes中存储卷PV和PVC的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Kubernetes中存储卷PV和PVC的示例分析”这篇文章吧。一:体系...
    99+
    2023-06-04
  • docker中容器数据卷volumes的示例分析
    这篇文章主要介绍了docker中容器数据卷volumes的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 数据卷的概念   &...
    99+
    2023-06-04
  • Docker容器卷管理的示例分析
    小编给大家分享一下Docker容器卷管理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!容器卷管理容器卷 主机...
    99+
    2024-04-02
  • docker中k8s认证及serviceaccount、RBAC的示例分析
    这篇文章给大家分享的是有关docker中k8s认证及serviceaccount、RBAC的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。    目前RBAC是k8s授权方式最常用的一...
    99+
    2023-06-04
  • HTML5Web存储的示例分析
    这篇文章主要介绍了HTML5Web存储的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是 HTML5 Web 存储使用HTML5...
    99+
    2024-04-02
  • 云原生存储中的容器存储与 K8s 存储卷怎么理解
    本篇文章为大家展示了云原生存储中的容器存储与 K8s 存储卷怎么理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。云原生存储的两个关键领域:Docker 存储卷、K8s 存储卷;Docker 存储卷...
    99+
    2023-06-04
  • html5中离线存储和cookie储存的示例分析
    这篇文章主要为大家展示了“html5中离线存储和cookie储存的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“html5中离线存储和cookie储存的...
    99+
    2024-04-02
  • mysql中存储过程的示例分析
    这篇文章主要介绍了mysql中存储过程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在mysql中,存储过程是一组为了完成特定功能...
    99+
    2024-04-02
  • MySQL中存储函数的示例分析
    这篇文章将为大家详细讲解有关MySQL中存储函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。存储函数什么是存储函数: 封装一段sql代码,完成一种特定的功能,...
    99+
    2024-04-02
  • Html5中本地存储的示例分析
    小编给大家分享一下Html5中本地存储的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 他...
    99+
    2024-04-02
  • MySQL中存储过程和存储函数的示例分析
    这篇文章主要为大家展示了“MySQL中存储过程和存储函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中存储过程和存储函数的示例分析”这篇文...
    99+
    2024-04-02
  • MySQL中InnoDB存储文件的示例分析
    这篇文章主要为大家展示了“MySQL中InnoDB存储文件的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中InnoDB存储文件的示例分析”这...
    99+
    2024-04-02
  • HTML5中LocalStorage本地存储的示例分析
    这篇文章给大家分享的是有关HTML5中LocalStorage本地存储的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。H5的两种存储技术的最大区别就是生命周期。1. lo...
    99+
    2024-04-02
  • MySQL中InnoDB存储引擎的示例分析
    这篇文章主要介绍MySQL中InnoDB存储引擎的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、存储引擎SQL 的执行计划是执行器组件调用存储引擎的接口来完成的。那我们可...
    99+
    2024-04-02
  • nw.js中localStorage物理储存的示例分析
    这篇文章将为大家详细讲解有关nw.js中localStorage物理储存的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。储存位置nw.js打包出来的应用的loca...
    99+
    2024-04-02
  • mysql存储中in参数的示例分析
    这篇文章主要介绍mysql存储中in参数的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.in输入参数概念:表示调用者向过程传入值(传入值可以是字面量或变量)2.使用示例:mysql> de...
    99+
    2023-06-14
  • Pandas数据存储的示例分析
    这篇文章主要为大家展示了“Pandas数据存储的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Pandas数据存储的示例分析”这篇文章吧。数据的存储数据可以有两种类型-连续的和离散的,这...
    99+
    2023-06-27
  • Hive数据存储的示例分析
    小编给大家分享一下Hive数据存储的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作