k8s学习笔记之八:存储卷
第一章、前言
- 默认情况下容器的数据都是非持久化的, 在容器消亡以后数据也跟着丢失, 所以 Docker 提供了 Volume 机制以便将数据持久化存储。 类似的, Kubernetes 提供了更强大的 Volume 机制和丰富的插件, 解决了容器数据持久化和容器间共享数据的问题。
- 与 Docker 不同, Kubernetes Volume 的生命周期与 Pod 绑定容器挂掉后 Kubelet 再次重启容器时, Volume 的数据依然还在而 Pod 删除时, Volume 才会清理。
- 数据是否丢失取决于具体的 Volume 类型, 比如 emptyDir 的数据会丢失, 而 PV 的数据则不会丢
- PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节。管理员关注于如何通过pv提供存储功能而无需关注用户如何使用,同样的用户只需要挂载pvc到容器中而不需要关注存储卷采用何种技术实现。
- pvc和pv的关系与pod和node关系类似,前者消耗后者的资源。pvc可以向pv申请指定大小的存储资源并设置访问模式。
第二章、pv pvc相关知识
生命周期
- pv和pvc遵循以下生命周期:
1.供应准备。管理员在集群中创建多个pv供用户使用。- 2.绑定。用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
- 3.使用。用户可在pod中像volume一样使用pvc。
- 4.释放。用户删除pvc来回收存储资源,pv将变成“released”状态。由于还保留着之前的数据,这些数据需要根据不同的策略来处理,否则这些存储资源无法被其他pvc使用。
- 5.回收。pv可以设置三种回收策略:保留(Retain),回收(Recycle)和删除(Delete)。
- 保留策略允许人工处理保留的数据。
- 删除策略将删除pv和外部关联的存储资源,需要插件支持。
- 回收策略将执行清除操作,之后可以被新的pvc使用,需要插件支持。
pv属性
- pv拥有以下属性:
- 容量。目前仅支持存储大小,未来可能支持IOPS和吞吐量等。
- 访问模式。ReadWriteOnce:单个节点读写。ReadOnlyMany:多节点只读。ReadWriteMany:多节点读写。挂载时只能使用一种模式。
- 回收策略。目前NFS和HostPath支持回收。 AWS、EBS、GCE、PD和Cinder支持删除。
- 阶段。分为Available(未绑定pvc)、Bound(已绑定)、Released(pvc已删除但资源未回收)、Failed(自动回收失败)
pvc属性
- 访问模式。与pv的语义相同。在请求资源时使用特定模式。
- 资源。申请的存储资源数量
pv类型
- emptyDir
- hostPath
- gcePersistentDisk
- awsElasticBlockStore
- nfs
- iscsi
- flocker
- glusterfs
- rbd
- cephfs
- gitRepo
- secret
- persistentVolumeClaim
- downwardAPI
- azureFileVolume
- ................
- ........(以下省略)
目前常用Volume 类型
emptyDir
- 如果 Pod 设置了 emptyDir 类型 Volume, Pod 被分配到 Node 上时候, 会创建emptyDir, 只要 Pod 运行在 Node 上, emptyDir 都会存在( 容器挂掉不会导致emptyDir 丢失数据) , 但是如果 Pod 从 Node 上被删除( Pod 被删除, 或者 Pod 发生迁移) , emptyDir 也会被删除, 并且永久丢失。
hostPath
- hostPath 允许挂载 Node 上的文件系统到 Pod 里面去。 如果 Pod 需要使用 Node 上的文件, 可以使用 hostPath
NFS
- NFS 是 Network File System 的缩写, 即网络文件系统。 Kubernetes 中通过简单地配置就可以挂载 NFS 到 Pod 中, 而 NFS 中的数据是可以永久保存的, 同时 NFS 支持同时写操作。
gcePersistentDisk
- gcePersistentDisk 可以挂载 GCE 上的永久磁盘到容器, 需要 Kubernetes 运行在 GCE的 VM 中
awsElasticBlockStore
- awsElasticBlockStore 可以挂载 AWS 上的 EBS 盘到容器, 需要 Kubernetes 运行在AWS 的 EC2 上。
gitRepo
- gitRepo volume 将 git 代码下拉到指定的容器路径中
Projected Volume
- Projected volume 将多个 Volume 源映射到同一个目录中, 支持 secret、 downwardAPI和 configMap
第三章、简单示例
emptyDir (节点级存储,生命周期与pod相同)
- [root@k8s-master01 volume]# cat pod-vol-demo.yaml #pod中有两个container挂载同一个emptyDir,nginx提供web服务,busybox则循环向挂载目录下的index.html文件写入数据
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-demo
- namespace: default
- labels:
- app: myapp
- tier: frontend
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- ports:
- - name: myapp
- containerPort:
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html
- - name: busybox
- image: busybox:latest
- volumeMounts: #见pod的volume挂载到container中
- - name: html #名称需要和 volumes中的name一致
- mountPath: /data #挂载volume在container中的路径
- command:
- - "/bin/sh"
- - "-c"
- - "while true; do echo $(date) >> /data/index.html; sleep 2; done"
- volumes: #创建pod可以使用的volume,可以有多个
- - name: html
- emptyDir: {} #volume类型,默认不限制使用空间
查看pod是否运行,并访问
- [root@k8s-master01 volume]# kubectl get pod -o wide #查看pod地址
- NAME READY STATUS RESTARTS AGE IP NODE
- myapp-deploy-5cfd895984-2gmmd / Running 2d 10.244.1.37 k8s-node01
- myapp-deploy-5cfd895984-58csg / Running 2d 10.244.2.71 k8s-node02
- myapp-deploy-5cfd895984-9s6zn / Running 2d 10.244.1.36 k8s-node01
- myapp-deploy-5cfd895984-hwtlt / Running 2d 10.244.1.35 k8s-node01
- myapp-deploy-5cfd895984-xclv4 / Running 2d 10.244.2.70 k8s-node02
- pod-demo / Running 22s 10.244.1.44 k8s-node01
- pod-pvc / Running 11h 10.244.2.78 k8s-node02
- tomcat-deploy-5bf584448b-7dbn2 / Running 2d 10.244.2.73 k8s-node02
- tomcat-deploy-5bf584448b-r7ng5 / Running 2d 10.244.2.74 k8s-node02
- tomcat-deploy-5bf584448b-xxj8n / Running 2d 10.244.1.39 k8s-node01
- [root@k8s-master01 volume]# while true; do curl 10.244.1.44; sleep ; done #直接访问
- Fri Nov :: UTC
- Fri Nov :: UTC
- Fri Nov :: UTC
- Fri Nov :: UTC
- Fri Nov :: UTC
- Fri Nov :: UTC
- ......
hostPath (节点级存储,生命周期和node相同)
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-hostpath
- namespace: default
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html
- volumes:
- - name: html
- hostPath:
- path: "/data/pod/volumel" #依据type的值来确定挂载路径是否需要创建
- type: DirectoryOrCreate #挂载目录不存在则创建, 具体type的值可以查看官方文档: https://kubernetes.io/docs/concepts/storage/volumes#hostpath
- [root@k8s-master01 ~]# kubectl get pod -o wide
- NAME READY STATUS RESTARTS AGE IP NODE
- myapp-deploy-5cfd895984-2gmmd / Running 2d 10.244.1.37 k8s-node01
- myapp-deploy-5cfd895984-58csg / Running 2d 10.244.2.71 k8s-node02
- myapp-deploy-5cfd895984-9s6zn / Running 2d 10.244.1.36 k8s-node01
- myapp-deploy-5cfd895984-hwtlt / Running 2d 10.244.1.35 k8s-node01
- myapp-deploy-5cfd895984-xclv4 / Running 2d 10.244.2.70 k8s-node02
- pod-hostpath / Running 34s 10.244.2.80 k8s-node02 #所在node节点
- tomcat-deploy-5bf584448b-7dbn2 / Running 2d 10.244.2.73 k8s-node02
- tomcat-deploy-5bf584448b-r7ng5 / Running 2d 10.244.2.74 k8s-node02
- tomcat-deploy-5bf584448b-xxj8n / Running 2d 10.244.1.39 k8s-node01
- [root@k8s-master01 ~]# ssh k8s-node02 "ls -l /data/pod/volumel" #查看该节点上是否存在该目录
- 总用量 0
删除pod手动创建挂载目录并添加HTML文件测试
- [root@k8s-master01 volume]# kubectl delete pod pod-hostpath
- pod "pod-hostpath" deleted
- #所有node节点上进行如下操作,注意index中的内容是当前节点名称以示区别
- [root@k8s-master01 ~]# mkdir /data/pod/volume1 #创建挂载的目录
- [root@k8s-master01 ~]# cd /data/pod/volume1
- [root@k8s-master01 volume1]# echo "node1" > /data/pod/volume1/index.html #添加一个index.html测试文件
- [root@k8s-master01 volume]# kubectl apply -f pod-hostpath-vol.yaml
- pod "pod-hostpath" created
- [root@k8s-master01 volume]# kubectl get pod pod-hostpath -o wide
- NAME READY STATUS RESTARTS AGE IP NODE
- pod-hostpath / Running 12s 10.244.2.191 k8s-node02
- [root@k8s-master01 volume]# curl 10.244.2.191
- node2
NFS(永久存储,生命周期与NFS server相同)
- [root@k8s-master01 volume]# cat pod-nfs-vol.yaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-nfs
- namespace: default
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html
- volumes:
- - name: html
- nfs:
- path: "/data/volumes/v1" #该目录在NFS server上必须存在并可以被集群中node节点可以挂载,node节点需要安装nfs-utils,可以执行NFS 挂载操作
- server: 172.16.150.155 #该server需要安装NFS 服务,并共享path中的目录或文件
- [root@k8s-node02 ~]# mount -t nfs 172.16.150.155:/data/volumes/v1 /mnt 在任意一节点上进行挂载测试,确定可以挂载是否可以成功,需要安装nfsutils工具包
- [root@k8s-node02 ~]# df -h |grep mnt #查看挂载状态
- 172.16.150.155:/data/volumes/v1 77G .5G 74G % /mnt
- [root@k8s-node02 ~]# umount /mnt #确认没有问题后卸载
- [root@k8s-master01 volume]# kubectl apply -f pod-nfs-vol.yaml #创建pod
- pod "pod-nfs" created
- [root@k8s-master01 volume]# kubectl get pod -o wide
- NAME READY STATUS RESTARTS AGE IP NODE
- pod-nfs / Running 17s 10.244.1.154 k8s-node01
- #在NFS server上添加一个测试HTML文件
- [root@k8s-node- ~]# cd /data/volumes/v1/ #挂载目录
- [root@k8s-node- v1]# echo "<h1>NFS Server volume v1</h1>" > index.html
- #访问一下pod
- [root@k8s-master01 volume]# curl 10.244.1.154
- <h1>NFS Server volume v1</h1>
- [root@k8s-master01 volume]# kubectl delete pod pod-nfs #删除刚刚创建的pod
- pod "pod-nfs" deleted
- [root@k8s-master01 volume]# kubectl apply -f pod-nfs-vol.yaml #再重新创建
- pod "pod-nfs" created
- [root@k8s-master01 volume]# kubectl get pod -o wide #查看新创建后pod所在的node节点级IP地址
- NAME READY STATUS RESTARTS AGE IP NODE
- counter / Running 1d 10.244.1.68 k8s-node01
- pod-hostpath / Running 29m 10.244.2.191 k8s-node02
- pod-nfs / Running 17s 10.244.2.192 k8s-node02
- sa-demo / Running 8d 10.244.2.98 k8s-node02
- [root@k8s-master01 volume]# curl 10.244.2.192 #再次访问一下,文件依然存在,文件不会随着pod的终结而销毁
- <h1>NFS Server volume v1</h1>
第四章、创建PV和PVC(以NFS为例)
NFS server上创建多个挂载目录,并共享
- [root@k8s-node- v1]# cat /etc/exports
- /data/volumes/v1 172.16.150.0/(rw,no_root_squash)
- /data/volumes/v2 172.16.150.0/(rw,no_root_squash)
- /data/volumes/v3 172.16.150.0/(rw,no_root_squash)
- /data/volumes/v4 172.16.150.0/(rw,no_root_squash)
- /data/volumes/v5 172.16.150.0/(rw,no_root_squash)
- [root@k8s-node- v1]# ll /data/volumes/
- 总用量
- drwxr-xr-x root root -- : v1
- drwxr-xr-x root root -- : v2
- drwxr-xr-x root root -- : v3
- drwxr-xr-x root root -- : v4
- drwxr-xr-x root root -- : v5
- [root@k8s-node- v1]# exportfs
- /data/volumes/v1 172.16.150.0/
- /data/volumes/v2 172.16.150.0/
- /data/volumes/v3 172.16.150.0/
- /data/volumes/v4 172.16.150.0/
- /data/volumes/v5 172.16.150.0/
- [root@k8s-node- v1]# showmount -e
- Export list for k8s-node-:
- /data/volumes/v5 172.16.150.0/
- /data/volumes/v4 172.16.150.0/
- /data/volumes/v3 172.16.150.0/
- /data/volumes/v2 172.16.150.0/
- /data/volumes/v1 172.16.150.0/
将NFS server共享的目录创建为PV
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: nfs-vol- #不允许定义名称空间,应为pv是属于集群级别的
labels:
name: nfs-vol-01 #建议对PV添加labels,后期PVC可以通过labels指定PV- spec:
- capacity: #pv的大小
- storage: 5Gi
- accessModes: #访问的模型,具体访问模型官方文档链接: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes
- - ReadWriteOnce #支持的访问模型与具体的共享存储设备类型有关,具体见上方链接,可以有多个
- - ReadWriteMany
- persistentVolumeReclaimPolicy: Recycle #pv的回收策略
- nfs:
- path: /data/volumes/v1
- server: 172.16.150.155
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: nfs-vol-
- spec:
- capacity:
- storage: 5Gi
- accessModes:
- - ReadWriteOnce
- persistentVolumeReclaimPolicy: Recycle
- nfs:
- path: /data/volumes/v2
- server: 172.16.150.155
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: nfs-vol-
- spec:
- capacity:
- storage: 10Gi
- accessModes:
- - ReadWriteOnce
- - ReadWriteMany
- persistentVolumeReclaimPolicy: Recycle
- nfs:
- path: /data/volumes/v3
- server: 172.16.150.155
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: nfs-vol-
- spec:
- capacity:
- storage: 15Gi
- accessModes:
- - ReadWriteOnce
- persistentVolumeReclaimPolicy: Recycle
- nfs:
- path: /data/volumes/v4
- server: 172.16.150.155
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: nfs-vol-
- spec:
- capacity:
- storage: 20Gi
- accessModes:
- - ReadWriteOnce
- - ReadWriteMany
- persistentVolumeReclaimPolicy: Recycle
- nfs:
- path: /data/volumes/v5
- server: 172.16.150.155
- [root@k8s-master01 volume]# kubectl apply -f nfs-vol.yaml
- persistentvolume "nfs-vol-01" created
- persistentvolume "nfs-vol-02" created
- persistentvolume "nfs-vol-03" created
- persistentvolume "nfs-vol-04" created
- persistentvolume "nfs-vol-05" created
- [root@k8s-master01 volume]# kubectl get pv
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- nfs-vol- 5Gi RWO,RWX Recycle Available 7s
- nfs-vol- 5Gi RWO Recycle Available 7s
- nfs-vol- 10Gi RWO,RWX Recycle Available 7s
- nfs-vol- 15Gi RWO Recycle Available 7s
- nfs-vol- 20Gi RWO,RWX Recycle Available 7s
创建一个PVC
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: my-pvc
- namespace: default
- spec:
- accessModes: ["ReadWriteOnce"] #pvc的访问模式一定是pv访问模式的子集
selector:
matchLabels:
name: nfs-vol-01 #选择指定的PV- resources:
- requests:
- storage: 5Gi
- ---
- apiVersion: v1
- kind: Pod
- metadata:
- name: pod-pvc
- namespace: default
- spec:
- containers:
- - name: myapp
- image: ikubernetes/myapp:v1
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html
- volumes:
- - name: html
- persistentVolumeClaim:
- claimName: my-pvc
- [root@k8s-master01 volume]# kubectl apply -f pod-pvc-vol.yaml
- persistentvolumeclaim "my-pvc" created
- pod "pod-pvc" created
- [root@k8s-master01 volume]# kubectl get pvc
- NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
- my-pvc Bound nfs-vol- 5Gi RWO 1m
- [root@k8s-master01 volume]# kubectl get pv #查看pv状态的变化,nfs-vol-02被 default名称空间下my-pvc申请并绑定
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON A
- nfs-vol- 5Gi RWO,RWX Recycle Bound default/my-pvc
- nfs-vol- 5Gi RWO Recycle Available
- nfs-vol- 10Gi RWO,RWX Recycle Available
- nfs-vol- 15Gi RWO Recycle Available
- nfs-vol- 20Gi RWO,RWX Recycle Available
查看下pod的创建信息
- [root@k8s-master01 volume]# kubectl describe pod pod-pvc
- ......
- Volumes:
- html:
- Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
- ClaimName: my-pvc
- ReadOnly: false
- default-token-tcwjz:
- Type: Secret (a volume populated by a Secret)
- SecretName: default-token-tcwjz
- Optional: false
- QoS Class: BestEffort
- Node-Selectors: <none>
- Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
- node.kubernetes.io/unreachable:NoExecute for 300s
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Warning FailedScheduling 8m (x2 over 8m) default-scheduler pod has unbound PersistentVolumeClaims (repeated times)
- Normal Scheduled 8m default-scheduler Successfully assigned pod-pvc to k8s-node01
- Normal SuccessfulMountVolume 8m kubelet, k8s-node01 MountVolume.SetUp succeeded for volume "default-token-tcwjz"
- Normal SuccessfulMountVolume 8m kubelet, k8s-node01 MountVolume.SetUp succeeded for volume "nfs-vol-02"
- Normal Pulled 8m kubelet, k8s-node01 Container image "ikubernetes/myapp:v1" already present on machine
- Normal Created 7m kubelet, k8s-node01 Created container
- Normal Started 7m kubelet, k8s-node01 Started container
#处于绑定状态下的pv无法直接被删除,如果需要删除被绑定的pv,需要先删除申请绑定的PVC
第五章、PV released状态下重新分配到PVC
当 PV 已经处在 released 状态下,它是没有办法直接回到 available 状态,也就是说接下来无法被一个新的 PVC 去做绑定。
1.删除PVC及pod,查看pv的状态
- [root@k8s-master01 volume]#kubectl delete -f pod-pvc-vol.yaml
- persistentvolumeclaim "my-pvc" deleted
- pod "pod-pvc" deleted
- [root@k8s-master01 volume]# kubectl get pv
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- nfs-vol- 5Gi RWO,RWX Retain Released default/my-pvc 18m #状态变成了Released
- nfs-vol- 5Gi RWO Retain Available 18m
- nfs-vol- 10Gi RWO,RWX Retain Available 18m
- nfs-vol- 15Gi RWO Retain Available 18m
- nfs-vol- 20Gi RWO,RWX Retain Available 18m
2.再次创建PVC使用nfs-vol-01,并观察pv及pod状态
- [root@k8s-master01 volume]#kubectl apply -f pod-pvc-vol.yaml
- persistentvolumeclaim/my-pvc created
- pod/pod-pvc created
- [root@k8s-master01 volume]#kubectl get pods |grep pod-pvc
- pod-pvc / Pending 8m23s
- [root@k8s-master01 volume]#kubectl describe pod pod-pvc #可以看到,pod处于pending状态,原因是没有绑定的PVC可以使用
......- Warning FailedScheduling 19s (x7 over 9m6s) default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated times)
3.修改PV的配置,删除spec下claimRef字段及包含内容
- [root@k8s-master-- manifests]# kubectl edit pv nfs-vol-
- spec:
- claimRef:
- apiVersion: v1
- kind: PersistentVolumeClaim
- name: my-pvc
- namespace: default
- resourceVersion: ""
- uid: 628b5026-35dc-11ea-87ad-525400512eca
- ....
再次查看
- [root@k8s-master-- manifests]# kubectl get pv
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- nfs-vol- 5Gi RWO,RWX Retain Available 39m
- nfs-vol- 5Gi RWO Retain Available 39m
- nfs-vol- 10Gi RWO,RWX Retain Available 39m
- nfs-vol- 15Gi RWO Retain Available 39m
- nfs-vol- 20Gi RWO,RWX Retain Available 39m
4.创建PVC及pod,查看状态
- [root@k8s-master01 volume]#kubectl apply -f pod-pvc-vol.yaml
- persistentvolumeclaim/my-pvc created
- pod/pod-pvc created
- [root@k8s-master01 volume]#kubectl get pv
- NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
- nfs-vol- 5Gi RWO,RWX Retain Bound default/my-pvc 39m
- nfs-vol- 5Gi RWO Retain Available 39m
- nfs-vol- 10Gi RWO,RWX Retain Available 39m
- nfs-vol- 15Gi RWO Retain Available 39m
- nfs-vol- 20Gi RWO,RWX Retain Available 39m
- [root@k8s-master01 volume]#kubectl get pods|grep pod-pvc
- pod-pvc / Running 22s
k8s学习笔记之八:存储卷的更多相关文章
- 【K8s学习笔记】K8s是如何部署应用的?
本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...
- SQL反模式学习笔记12 存储图片或其他多媒体大文件
目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点: 1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...
- Kubernetes 学习12 kubernetes 存储卷
一.概述 1.我们此前讲过根据应用本身是否需要持久存储数据以及某一次请求和之前的请求是否有联系,可以分为四类应用 a.有状态,要存储 b.有状态,无持久存储 c.无状态,要存储 d.无状态,无持久存储 ...
- k8s 学习笔记
常用的kubectl命令 kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1 --image 指定镜像 - ...
- k8s学习笔记之四:资源清单定义入门
第一章.k8s中的资源 1.什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 2.在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet D ...
- k8s学习笔记
9.deployment:声明式的升级应用 9.1.使用RC实现滚动升级 #kubectl rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v ...
- Docker&K8S学习笔记(一)—— Docker安装
最近一年在工作上经常使用Docker与K8S,除了利用其打镜像,部署服务外,还基于Docker与K8S开发了一套CICD流水线平台,为了加深相关知识点的理解,所以从今天开始会定期更新学习笔记,本套学习 ...
- 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...
- Docker 学习6 Docker存储卷
一.什么是存储卷 二.为什么要用到数据卷 三.数据卷是怎么被管理的 四.存储卷种类 五.在容器中使用存储卷 1.只声明容器路径 [root@localhost docker]# docker run ...
随机推荐
- python之路---面向对象编程(一)
一.设计思想的发展 面向机器(代码复杂,效率低,学习成本高,开发周期长)-------->面向过程(扩展性差,不适用多变的需求改变)----------->面向对象(扩展性好,但是可控性差 ...
- tomcat的LifecycleException异常
异常:start: org.apache.catalina.LifecycleException: tomcat版本:8 解决:将tomcat的版本换成tomcat6,问题解决了
- 关于数据安全RSA,MD5,TOKEN
网络上明文传输时 1.数据可能被窃取:2.数据可能被篡改:3.数据被泄露 如何解决: 1.数据被窃取是由于数据能随意的被拿到,且能够被识别.可以有2个方式解决 a.使数据不能随意被获取: 使用toke ...
- Angular2 NgModule 模块详解
原文 https://segmentfault.com/a/1190000007187393 我们今天要学习的是Angular2的模块系统,一般情况下我们使用一个根模块去启动我们的应用,然后使用许多 ...
- 莫烦tensorflow(8)-CNN
import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data#number 1 to 10 dat ...
- HTML/overflow的认识
1.overflow的定义:overflow属性规定当内容溢出元素框时应该做的处理.2.overflow:scorll; 是提供一种滚动的机制.3.关于overflow的其他相关值设置:
- php字符串统计次数的各种方法(转)
<?php $str = 'AbCdEfGaBcDeFgH0234;,!-AaBbCcDdEeFfGg'; $str = strtoupper($str); // 不区分大小写时,全部转换成大写 ...
- java基础(3)java常用API
1 ArrayList集合 01 创建 import java.util.ArrayList; /* 泛型:装在集合中的元素,全都是统一的一种类型.泛型必须是引用类型,不能是基本数据类型 */ pub ...
- 20155208 徐子涵 Exp3 免杀原理与实践
20155208 徐子涵 Exp3 免杀原理与实践 基础问题回答 (1)杀软是如何检测出恶意代码的? 一种是基于特征码的检测,另一种是基于恶意行为的检测. (2)免杀是做什么? 在我看来,免杀就是要达 ...
- hdu 1754 I Hate It (单点修改+区间最值+裸题)
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...