文章目录

  • 一、简介
  • 二、NFS PV示例( 静态分配)
    • 1.保证环境的干净
    • 2.创建所需资源
    • 3.书写pv,pvc,pod文件并进行测试
      • (1)创建静态pv
      • (2)创建pvc
      • (3)创建pod
      • (4)测试、回收
  • 三、动态分配:storageclass
    • 1.简介
    • 2.实验示例
      • (1)创建sa(ServiceAccount)
      • (2)部署应用
      • (3)创建存储类、创建pvc
      • (4)创建pod
      • (5)回收
  • 四、默认的 StorageClass
    • 1.没有StorageClass的情况
    • 2.设置默认的StorageClass

一、简介

  • PersistentVolume(持久卷,简称PV)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。
  • PersistentVolumeClaim(持久卷声明,简称PVC)是用户的一种存储请求。它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)。
  • 有两种PV提供的方式:静态和动态。
    静态PV:集群管理员创建多个PV,它们携带着真实存储的详细信息,这些存储对于集群用户是可用的。它们存在于Kubernetes API中,并可用于存储使用。
    动态PV:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于StorageClass。
  • PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态。
  • 使用
    Pod使用PVC就像使用volume一样。集群检查PVC,查找绑定的PV,并映射PV给Pod。对于支持多种访问模式的PV,用户可以指定想用的模式。一旦用户拥有了一个PVC,并且PVC被绑定,那么只要用户还需要,PV就一直属于这个用户。用户调度Pod,通过在Pod的volume块中包含PVC来访问PV。
  • 释放
    当用户使用PV完毕后,他们可以通过API来删除PVC对象。当PVC被删除后,对应的PV就被认为是已经是“released”了,但还不能再给另外一个PVC使用。前一个PVC的属于还存在于该PV中,必须根据策略来处理掉。
  • 回收
    PV的回收策略告诉集群,在PV被释放之后集群应该如何处理该PV。当前,PV可以被Retained(保留)、 Recycled(再利用)或者Deleted(删除)。保留允许手动地再次声明资源。对于支持删除操作的PV卷,删除操作会从Kubernetes中移除PV对象,还有对应的外部存储(如AWS EBS,GCE PD,Azure Disk,或者Cinder volume)。动态供给的卷总是会被删除。

注意:PV没有namespace,但是PVC有namespace,pod所需要的PVC和pod需在同一个namespace

  • 访问模式
    ReadWriteOnce – 该volume只能被单个节点以读写的方式映射
    ReadOnlyMany – 该volume可以被多个节点以只读方式映射
    ReadWriteMany – 该volume可以被多个节点以读写的方式映射
    在命令行中,访问模式可以简写为:
    RWO - ReadWriteOnce
    ROX - ReadOnlyMany
    RWX - ReadWriteMany
  • 回收策略
    Retain:保留,需要手动回收
    Recycle:回收,自动删除卷中数据
    Delete:删除,相关联的存储资产,如AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷都会被删除
    当前,只有NFS和HostPath支持回收利用,AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷支持删除操作。
  • 状态:
    Available:空闲的资源,未绑定给PVC
    Bound:绑定给了某个PVC
    Released:PVC已经删除了,但是PV还没有被集群回收
    Failed:PV在自动回收中失败了
    命令行可以显示PV绑定的PVC名称。

二、NFS PV示例( 静态分配)

1.保证环境的干净

[root@server2 volumes]# kubectl get pod
NAME     READY   STATUS    RESTARTS   AGE
nfs-pd   1/1     Running   0          12m
[root@server2 volumes]# kubectl delete -f nfs.yaml    ##先清理环境
[root@server2 volumes]# kubectl get pv
No resources found
[root@server2 volumes]# kubectl get pvc
No resources found in default namespace.
[root@server2 volumes]# kubectl get pod
No resources found in default namespace.

2.创建所需资源

1. 安装配置NFS服务:(前面已经做过了)
[root@k8s1 ~]## yum install -y nfs-utils
[root@k8s1 ~]## mkdir -m 777 /nfsdata
[root@k8s1 ~]## vim /etc/exports
/nfsdata    *(rw,sync,no_root_squash)
[root@k8s1 ~]## systemctl enable --now rpcbind
[root@k8s1 ~]## systemctl enbale --now nfs[root@k8s3 ~]# yum install nfs-utils -y   ##都需要安装nfs服务
[root@k8s4 ~]# yum install nfs-utils -y

3.书写pv,pvc,pod文件并进行测试

(1)创建静态pv

配置nfs输出目录
[root@k8s1 ~]# cd /nfsdata/
[root@k8s1 nfsdata]# mkdir pv1 pv2 pv3创建静态pv
[root@k8s2 pv]# vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv1
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOnce                               ##单点读写persistentVolumeReclaimPolicy: Recycle   ##回收再利用storageClassName: nfs                 ##类型nfs:path: /nfsdata/pv1                       ##挂载目录server: 192.168.56.171---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv2
spec:capacity:storage: 10GivolumeMode: FilesystemaccessModes:- ReadWriteMany                                       ##读点读写persistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /nfsdata/pv2server: 192.168.56.171---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv3
spec:capacity:storage: 15GivolumeMode: FilesystemaccessModes:- ReadOnlyMany                            ##多点只读persistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /nfsdata/pv3server: 192.168.56.171[root@k8s2 pv]# kubectl apply -f pv.yaml
[root@k8s2 pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    5Gi        RWO            Recycle          Available           nfs                     3m30s
pv2    10Gi       RWX            Recycle          Available           nfs                     2s
pv3    15Gi       ROX            Recycle          Available           nfs                     2s

(2)创建pvc

要和pv绑定,需创建对应的pvc,绑定的前提是类型,大小,访问方式均对应;
其中大小:pv>=pvc

创建pvc
[root@k8s2 pv]# vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc1
spec:storageClassName: nfs       ##存储类型accessModes:- ReadWriteOnceresources:requests:storage: 5Gi---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc2
spec:storageClassName: nfsaccessModes:- ReadWriteManyresources:requests:storage: 10Gi---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc3
spec:storageClassName: nfsaccessModes:- ReadOnlyManyresources:requests:storage: 15Gi[root@k8s2 pv]# kubectl apply -f pvc.yaml
[root@k8s2 pv]# kubectl get pvc
NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Bound    pv1      5Gi        RWO            nfs            4m1s
pvc2   Bound    pv2      10Gi       RWX            nfs            2m4s
pvc3   Bound    pv3      15Gi       ROX            nfs            4s[root@k8s2 pv]# kubectl get pv          ##default/pvc1绑定
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
pv1    5Gi        RWO            Recycle          Bound    default/pvc1   nfs                     12m
pv2    10Gi       RWX            Recycle          Bound    default/pvc2   nfs                     8m37s
pv3    15Gi       ROX            Recycle          Bound    default/pvc3   nfs                     8m37s

(3)创建pod

上面实验一捆绑完成,在pod中使用

创建pod
[root@k8s2 pv]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:name: test-pd
spec:containers:- image: nginxname: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: vol1volumes:- name: vol1persistentVolumeClaim:claimName: pvc1                       ##映射对应的挂载类型:真正的存储[root@k8s2 pv]# kubectl apply -f pod.yaml

路径:pod->pvc->pv(pod请求pvc,pvc找pv)

(4)测试、回收

在nfs输出目录中创建测试页
[root@k8s1 pv1]# echo pv1 > index.html[root@k8s2 pv]# kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP               NODE   NOMINATED NODE   READINESS GATES
test-pd   1/1     Running   0          12s   10.244.106.144   k8s4   <none>           <none>[root@k8s2 pv]# curl 10.244.106.144
pv1回收资源,需要按顺序回收: pod -> pvc -> pv
[root@k8s2 pv]# kubectl delete  pod test-pd
[root@k8s2 pv]# kubectl delete  -f pvc.yaml回收pvc后,pv会被回收再利用(回收pvc,会运行一个pod下载registry.k8s.io/debian-base:v2.0.0释放pv,pv目录数据会删除)
[root@k8s2 pv]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    5Gi        RWO            Recycle          Available           nfs                     25m
pv2    10Gi       RWX            Recycle          Available           nfs                     22m
pv3    15Gi       ROX            Recycle          Available           nfs                     22m
pv的回收需要拉取镜像,提前在node节点导入镜像:registry.k8s.io/debian-base:v2.0.0
registry.k8s.io 替代 k8s.gcr.io 这个仓库,但依然需要科学上网[root@k8s3 ~]# docker pull yakexi007/debian-base:v2.0.0
[root@k8s3 ~]# docker tag yakexi007/debian-base:v2.0.0 registry.k8s.io/debian-base:v2.0.0##经测试、更改标签后可用
回收
[root@k8s2 pv]# kubectl delete -f pv.yaml

三、动态分配:storageclass

1.简介

  • StorageClass提供了一种描述存储类(class)的方法,不同的class可能会映射到不同的服务质量等级和备份策略或其他策略等。

  • 每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在StorageClass需要动态分配 PersistentVolume 时会使用到。

  • StorageClass的属性
    Provisioner(存储分配器):用来决定使用哪个卷插件分配 PV,该字段必须指定。可以指定内部分配器,也可以指定外部分配器。外部分配器的代码地址为: kubernetes-incubator/external-storage,其中包括NFS和Ceph等。
    Reclaim Policy(回收策略):通过reclaimPolicy字段指定创建的Persistent Volume的回收策略,回收策略包括:Delete 或者 Retain,没有指定默认为Delete。
    更多属性查看:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

  • NFS Client Provisioner是一个automatic provisioner,使用NFS作为存储,自动创建PV和对应的PVC,本身不提供NFS存储,需要外部先有一套NFS存储服务。
    PV以 n a m e s p a c e − {namespace}- namespace−{pvcName}- p v N a m e 的命名格式提供(在 N F S 服务器上) P V 回收的时候以 a r c h i e v e d − {pvName}的命名格式提供(在NFS服务器上) PV回收的时候以 archieved- pvName的命名格式提供(在NFS服务器上)PV回收的时候以archieved−{namespace}- p v c N a m e − {pvcName}- pvcName−{pvName} 的命名格式(在NFS服务器上)

storageclass官网: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

2.实验示例

上传镜像

(1)创建sa(ServiceAccount)

创建sa并授权
[root@k8s2 nfs]# vim rbac.yaml
apiVersion: v1
kind: Namespace                 ##创建Namespace,并全部替换为新建的Namespace
metadata:name: nfs-client-provisioner
---
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: nfs-client-provisioner
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: nfs-client-provisioner
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: nfs-client-provisioner
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io[root@k8s2 nfs]# kubectl apply -f rbac.yaml

(2)部署应用

部署应用
[root@k8s2 nfs]# vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisioner labels:app: nfs-client-provisionernamespace: nfs-client-provisioner       ##指向新建
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: sig-storage/nfs-subdir-external-provisioner:v4.0.2 ##更改镜像volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 192.168.56.171                        ##nfs服务器地址- name: NFS_PATHvalue: /nfsdata                              ##nfs路径volumes:- name: nfs-client-rootnfs:server: 192.168.56.171                          ##serverpath: /nfsdata                                  ##路径[root@k8s2 nfs]# kubectl apply -f deployment.yaml[root@k8s2 nfs]# kubectl  -n nfs-client-provisioner get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-5697d96584-6bbtb   1/1     Running   0          15m

(3)创建存储类、创建pvc

创建存储类,没有namespace,因为存储类是集群全局的
[root@k8s2 nfs]# vim class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner  ##和 deployment.yaml中定义的name一致
parameters:archiveOnDelete: "false"                                ##删除时不打包备份,删除PVC是会自动删除PV;delete策略[root@k8s2 nfs]# kubectl apply -f  class.yaml[root@k8s2 nfs]# kubectl get sc
NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  10s创建pvc
[root@k8s2 nfs]# vim pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim
spec:storageClassName: nfs-client           ##存储类名字需保持一致accessModes:- ReadWriteMany                      ##多点读写resources:requests:storage: 1Gi[root@k8s2 nfs]# kubectl apply -f pvc.yaml[root@k8s2 nfs]# kubectl get pvc          ##自动创建PV目录(server1)
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-662561d9-4d84-42d4-ad22-03d16a84c618   1Gi        RWX            nfs-client     6s

(4)创建pod

创建pod
[root@k8s2 nfs]# vim pod.yaml
kind: Pod
apiVersion: v1
metadata:name: test-pod
spec:containers:- name: test-podimage: busyboxcommand:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS && exit 0 || exit 1"   ##创建测试文件volumeMounts:- name: nfs-pvcmountPath: "/mnt"restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim                      ##PVC的名字[root@k8s2 nfs]# kubectl apply -f pod.yaml

pod会在pv中创建一个文件

(5)回收

回收
[root@k8s2 nfs]# kubectl delete -f pod.yaml
[root@k8s2 nfs]# kubectl delete -f pvc.yaml          ##自动回收pv设置【默认存储类】,这样在创建pvc时可以不用指定storageClassName
[root@k8s2 pvc]# kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
存储类名字:nfs-client以下查看default为nfs-client
[root@k8s2 pvc]# kubectl get sc
NAME                   PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  6m47s

四、默认的 StorageClass

默认的 StorageClass 将被用于动态的为没有特定 storage class 需求的 PersistentVolumeClaims 配置存储:(只能有一个默认StorageClass)
如果没有默认StorageClass,PVC 也没有指定storageClassName 的值,那么意味着它只能够跟 storageClassName 也是“”的 PV 进行绑定。

1.没有StorageClass的情况

[root@server2 nfs-client]# vim demo.yaml
[root@server2 nfs-client]# cat demo.yaml     ##测试没有StorageClass
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim-2
spec:
#  storageClassName: managed-nfs-storageaccessModes:- ReadOnlyManyresources:requests:storage: 5Gi[root@server2 nfs-client]# kubectl apply -f demo.yaml
[root@server2 nfs-client]# kubectl get pvc    ##没有指定一直处于pending状态

2.设置默认的StorageClass

kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'  ##模板
[root@server2 nfs-client]# kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'   ##指定sc
[root@server2 nfs-client]# kubectl get sc   ##查看是否设置成功
NAME                            PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
managed-nfs-storage (default)   k8s-sigs.io/nfs-subdir-external-provisioner   Delete          Immediate           false                  58m##查看效果
[root@server2 nfs-client]# kubectl delete -f demo.yaml
[root@server2 nfs-client]# kubectl apply -f demo.yaml
[root@server2 nfs-client]# kubectl get pvc
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim     Bound    pvc-bc952d4e-47a5-4ac4-9d95-5cd2e6132ebf   2Gi        RWX            managed-nfs-storage   55m
test-claim-2   Bound    pvc-2262d8b4-c660-4301-aad5-2ec59516f14e   5Gi        ROX            managed-nfs-storage   2s

k8s--Kubernetes存储--Volumes配置管理--持久卷--动态静态分配相关推荐

  1. Docker(二十一)--Docker k8s--Kubernetes存储--Volumes配置管理--持久卷--动态静态分配

    目录 1. 简介 2. NFS PV示例(静态分配) 2.1.保证环境的干净 2.2 创建所需资源 2.3 书写pv,pvc,pod文件并进行测试 2.3.1 创建pv 2.3.2 创建pvc和pod ...

  2. K8S持久化存储:NFS+StorageClass实现动态供给

    K8S持久化存储:NFS+StorageClass实现动态供给 一.简介:K8S中的持久化存储 二.部署nfs-provisioner 三.创建StorageClass 四.实验 实验1:部署depl ...

  3. 从零开始入门 K8s | Kubernetes 存储架构及插件使用

    作者 | 阚俊宝 阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 关注"阿里巴巴云原生"公众号,回复关键词**&quo ...

  4. 从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度

    作者 | 至天 阿里巴巴高级研发工程师 一.基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据进行 snapshot ,以及能快速 restore 的能力.另 ...

  5. 从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    作者 | 至天 阿里巴巴高级研发工程师 一.Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 ...

  6. Docker(二十)--Docker k8s--Kubernetes存储--Volumes配置管理

    目录 1. 简介 2. emptyDir卷 2.1 简介 2.2 示例 2.2.1 正常使用 2.2.2 文件超过sizelimit 3. hostPath 卷 3.1 简介 3.2 示例 4 NFS ...

  7. Docker Kubernetes存储>Volumes配置管理

    Docker Kubernetes存储>Volumes配置管理 1.简介 2. emptyDir卷 2.1 简介 2.2 emptyDir卷示例配置 2.3 文件超过sizelimit 3. h ...

  8. mysql上k8s_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

    上一篇"通过实例快速掌握k8s(Kubernetes)核心概念"讲解了k8s的核心概念,有了核心概念整个骨架就完整了,应付无状态程序已经够了,但还不够丰满.应用程序分成两种,无状态 ...

  9. k8s service type_通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷...

    点击上方蓝色"Go语言中文网"关注我们,设个星标,每天学习 Go 语言 前一篇"通过实例快速掌握 k8s(Kubernetes)核心概念[1]"讲解了 k8s ...

最新文章

  1. varint算法——本质上是牺牲最高位作为标识数据结束位,达到变长编码,说白了就是贪心的分割位...
  2. pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
  3. S4 Smartforms 改为WORD编辑器
  4. centos6上安装mysql8.0版本
  5. Spark SQL(一)之简介
  6. JS之数组元素排序方法sort
  7. 【机器学习】opencv-摄像头中的人脸采集
  8. Ubuntu14.04如何使用root登录
  9. qt添加菜单纯代码_QtCreator插件开发(二)——QtCreator菜单和菜单项
  10. 【Luogu2393】yyy loves Maths II(浮点输入输出)
  11. 编译java源代码文件
  12. Excel 数据库函数
  13. oracle新增字段时提示数据类型不正确
  14. java客服管理系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  15. 重磅!图森王乃岩团队最新工作—TridentNet:处理目标检测中尺度变化新思路
  16. css 侧栏跟随_简单代码实现智能侧边栏跟随固定浮动的效果
  17. 从《道德经》看项目经理修炼的7条法则,你做到了几条?
  18. WebRTC技术详解
  19. clion三角形运行键是灰的_能打游戏能编程,如何用吃灰机器,安装完整ChromeOS(支持安卓)...
  20. nz-zorro 主题切换 动态

热门文章

  1. 泸州田家炳中学2021高考成绩查询,2021年四川高中排名,高中高考成绩排名一览表...
  2. 解决打包脚本在 Xcode9 环境下报错
  3. 外贸公司注册企业邮箱选哪家好?外贸公司如何注册申请企业邮箱?
  4. 计算机 蚂蚁搬家 教案,小班体育活动-蚂蚁搬家
  5. 西二旗地铁换乘绕行指南
  6. 永利国际 php,屯三里·永利国际
  7. Java、JSP企业办公自动化系统
  8. 双击 计算机 打不开,电脑软件双击打不开,是什么回事?怎么处理?
  9. Echarts + 中国地图+事件报警撒点
  10. 终极社会工程黑客攻击