kubernetes是google开源的容器集群管理系统,提供应用部署、维护、扩展机制等功能,利用kubernetes能方便管理跨集群运行容器化的应用,简称:k8s(k与s之间有8个字母)

Pod:若干相关容器的组合,Pod包含的容器运行在同一host上,这些容器使用相同的网络命令空间、IP地址和端口,相互之间能通过localhost来发现和通信。另外,这些容器还可共享一块存储卷空间。在k8s中创建,调度和管理的最小单位就是Pod,而非容器,Pod通过提供更高层次的抽象,提供了更加灵活的部署和管理模式;

    • k8s的基本操作单元,一个Pod由一个或多个容器组成,通常pod里的容器运行的相同的应用;
    • 同一pod包含的容器运行在同一host上,作为统一管理单元:
  • 同一pod 共享着相同的volumes, network命名空间, ip和port空间,这是通过Mapped Container做到的;

      • pid ns:处于同一pod中的应用可以看到彼此的进程
      • network ns:处于同一pod中的应用可以访问一样的ip和port空间
      • ipc ns:处于同一pod的应用可以用systemV ipc 或者posix消息队列进行通信
      • UTC ns:处于同一pod应用共用一个主机名
    ReplicationController (RC)

    • RC是用来管理Pod的,每个RC由一个或多个Pod组成;在RC被创建之后,系统将会保持RC中的可用Pod的个数与创建RC时定义的Pod个数一致,如果Pod个数小于定义的个数,RC会启动新的Pod,反之则会杀死多余的Pod。
    • RC通过定义的Pod模板被创建,创建后对象叫做Pods(也可以理解为RC),可以在线修改Pods的属性,以实现动态缩减、扩展Pods的规模
    • RC通过label关联对应的Pods,通过修改Pods的label可以删除对应的Pods在需要对Pods中的容器进行更新时,RC采用一个一个替换原则来更新整个Pods中的Pod;
    • reschudeling: 维护pod副本,“多退少补”;即使是某些minion宕机

    • scaling:通过修改rc的副本数来水平扩展或者缩小运行的pods
    • Rolling updates:一个一个地替换pods来rolling updates服务;
    • multiple release tracks:如果需要在系统中运行multiple release 服务,replication controller使用labels来区分multiple release tracks;

  Label

    • Label是用于区分Pod、Service、RC的key/value键值对
    • Pod、Service、RC可以有多个label,但是每个label的key只能对应一个value
    • 整个系统都是通过Label进行关联,得到真正需要操作的目标

Service

    Service也是k8s的最小操作单元,是真实应用服务的抽象

    Service通常用来将浮动的资源与后端真实提供服务的容器进行关联

    Service对外表现为一个单一的访问接口,外部不需要了解后端的规模与机制

    Service是定义在集群中一组运行Pod集合的抽象资源,它提供了所有相同的功能。当一个Service资源被创建后,将会分配一个唯一的IP(也叫做集群IP),这个IP地址将存在于Service的整个生命资源,Service一旦被创建,整个IP无法进行修改。

Pod可以通过Service进行通信,并且所有的通信将会通过Service自动负载均很到所有的Pod中的容器。

三、kubernetes组成 

  k8s主要包括:

    kubectl 客户端命令行工具:

      将接收的命令,发送给kube-apiserver,作为对整个平台操作的入口。

    kube-apiserver REST API服务:

      作为整个系统的控制入口,以REST API的形式公开,可以横向扩展在高可用的架构中。

    kube-controller-manager 多个控制器的合体,用来执行整个系统中的后台任务,多个控制进程的合体:

    • Node Controller 负责整个系统中node up 或down的状态的响应和通知
    • Replication Controller 负责维持Pods中的正常运行的Pod的个数
    • Endpoints Controller 负责维持Pods和Service的关联关系
    • Service Account & Token Controllers负责为新的命名空间创建默认的账号和API访问的Token    

    kube-scheduler 任务调度、命令下发

      负责监视新创建的Pods任务,下发至未分配的节点运行该任务

    kube-proxy 网络代理转发:

      kube-proxy运行在每个节点上,负责整个网络规则的连接与转发,使k8s中的service更加抽象化

    kubelet 容器的管理

      kubelet运行在每个节点上,作为整个系统的agent,监视着分配到该节点的Pods任务,负责挂载Pods所依赖的卷组,下载Pods的秘钥,运行Pods中的容器(通常是docker),周期获取所有容器的状态,通过导出Pod和节点的状态反馈给REST系统;

    etcd 信息存储

    flannel IP地址的分配

四、k8s架构图

安装:
我们通过kubeadm工具安装,安装些基本组件 如 kubeadm kubectl kubelet,其他通过kubeadm配置启动,具体在kubeadm init的时候都会打印出来,可以看到。
单独安装docker,并且k8s对docker兼容的版本有限制,并不支持最近的docker版本。k8s会支持不仅一种容器,不仅是docker。

组件作用:
kubeadm 用来master初始化集群 node加入集群 
kubectl 脚本命令包 用来对集群操作的,授权之后就可以对集群操作了。可以用root 非root用户操作。可以在master机器(默认)上授权操作。猜测也可以在node机器,集群外机器(接口机)上授权操作。
kubelet 每台节点都要安装,集成了cAdvisor,收集本机信息,node与master通信。

kubeadm在初始化集群时还会通过docker启动一些服务,master独有etcd,apiserver,kube-controller-manager,kube-scheduler,kube-dns。每台机器上都会启动kube-proxy。如果使用了flannel网络的话,还有kube-flannel。其他网络应该是对应其他网络服务容器。
master是可以HA的。
etcd用于存储k8s信息
apiserver 是api中心,https restful api和kubectl命令应该都访问这里
kube-controller-manager
kube-scheduler
kube-dns

kube-proxy kube-flannel 用于实现虚拟网络。容器分配ip是在kube-flannel上。其他服务端口转发,服务ip应该都是靠这些服务来支持的。

nvidia-device-plugin,是容器中使用gpu使用的。看起来只起在node节点上,可能master需要再找一台机器,不要浪费gpu资源。

监控:
cAdvisor+Heapster+InfluxDB+Grafana
cAdvisor是自带监控,集成进了 kubelet,采集每台机器的信息
Heapster是容器集群监控和性能分析工具。
InfluxDB作为后端存储
Grafana作为前端界面展示。

dashboard 可选组件,k8s配套界面,可以查看很多集群,节点,容器信息,进行操作等等。可能通过restful api访问apiserver实现的。需要授权才能访问。
dashboard没有默认没有机器状态的信息,支持通过安装Heapster来显示监控信息。

以上都可以通过容器启动

pod我们可以自己分类:
(1)自主式pod:自我管理的,创建以后,任然是提交给API Server,由API Server接收后借助Scheduler将其调度到指定的node节点,然后由node启动此节点,如果有pod中容器出现问题了,需要重启容器,那是由Keepalived来完成,但是如果节点故障了,pod也就消失了,所以,它有这样的坏处,没办法实现全局的调度,所以建议使用第二种pod
(2)控制器管理的pod,正是控制器这种机制的使用,使得在K8S上的集群设计中,pod完全就可以叫做有生命周期的对象,而后由调度器调度到集群中的某节点,运行以后,它的任务终止也就随着被删除掉,但是有一些任务,大家知道传统上有nginx、tomcat,它们是做为守护进程运行的,那么这种运行为pod容器的话,我们要确保它是时刻运行的,一旦出现故障我们要第一时间发现,要么是重建取代它,要么是重启,那么pod控制器就可以观测并实现

权限管理:
1.6新增RBAC授权。简单来说就是权限--角色--用户的管理关系。

初始化时就创建了不少规则,所以可以集群操作。其他更多的个性化的权限就要自定义权限来管理了。通过创建角色,权限绑定关系等等来实现。权限可以通过token来授权,也可以通过账号密码来授权。

https://www.cnblogs.com/hanhuibk/p/9645962.html

http://blog.itpub.net/28916011/viewspace-2213536

k8s的部署有多种方式,但我们采用kubeadm工具部署。

kubeadm快速搭建k8s集群

https://www.cnblogs.com/omgasw/p/10531131.html

http://blog.itpub.net/28916011/viewspace-2213536

我们为了方便,不使用上面安装包的来安装k8s,这里只是让大家了解一下。我们此次安装使用kubeadm方式安装。

2、准备好yum源(master和nodes都需要)

a) docker源

1
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

b)k8s源

1
2
3
4
5
6
7
[root@k8s-master yum.repos.d]# cat k8s.repo 
[k8s]
name=k8s repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
1
[root@k8s-master yum.repos.d]# yum repolist
1
2
[root@k8s-master yum.repos.d]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 
[root@k8s-master yum.repos.d]# rpm --import yum-key.gpg
1
2
[root@k8s-master yum.repos.d]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@k8s-master yum.repos.d]# rpm --import rpm-package-key.gpg

3、首先安装kublete、kubeadm、docker(在master上执行)

1
   yum -y install docker-ce kubelet kubeadm kubectl   (master上执行)
1
2
3
4
5
[root@k8s-master yum.repos.d]# rpm -ql kubelet
/etc/kubernetes/manifests #清单目录
/etc/sysconfig/kubelet #配置文件
/etc/systemd/system/kubelet.service
/usr/bin/kubelet #主程序

4、安装代理(为了翻墙)

由于中国某种不可描述的原因,需要更改docker 默认拉取镜像的源

1
2
3
4
5
6
root@k8s-master yum.repos.d]# vim /usr/lib/systemd/system/docker.service 
[Service]
#表示访问https服务时,通过下面的代理来访问,本次这么做的目的是为了能访问外国的docer镜像,要不会被墙,用完了再注释掉,从而继续使用国内
的镜像
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,172.16.0.0/16"
1
2
[root@k8s-master yum.repos.d]# systemctl daemon-reload
[root@k8s-master yum.repos.d]# systemctl start docker
1
2
3
[root@k8s-master yum.repos.d]# docker info #能看到如下两个
HTTPS Proxy: http://www.ik8s.io:10080
No Proxy: 127.0.0.0/8,172.16.0.0/16
1
[chenzx@sa ~]$ telnet www.ik8s.io 10080  #要确保这个端口是通的

5、运行kubeadm int初始化集群(在master上)

该过程会做先决条件预检、生成证书、私钥、生成配置文件、生成静态pod的清单文件并完成部署(addons)

1
[root@k8s-master yum.repos.d]# systemctl enable kubelet #首先只能设置为开机自启动,但先不要不要手工启动该服务(即使现在启动也启动不起来),等初始化完成了再启动。
1
[root@k8s-master chenzx]# systemctl  enable docker

[root@k8s-master chenzx]# kubeadm init --help

--apiserver-advertise-address:表示apiserver对外的地址是什么,默认是0.0.0.0

--apiserver-bind-port:表示apiserver的端口是什么,默认是6443

--cert-dir:加载证书的目录,默认在/etc/kubernetes/pki

--config:配置文件

--ignore-preflight-errors:在预检中如果有错误可以忽略掉,比如忽略 IsPrivilegedUser,Swap.等

--kubernetes-version:指定要初始化k8s的版本信息是什么

--pod-network-cidr :指定pod使用哪个网段,默认使用10.244.0.0/16

--service-cidr:指定service组件使用哪个网段,默认10.96.0.0/12

1
2
3
[root@k8s-master chenzx]# cat /etc/sysconfig/kubelet 
#指定额外的初始化信息,下面表示禁用操作系统的swap功能
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@k8s-master chenzx]# kubeadm init --kubernetes-version=v1.11.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12  --ignore-preflight-errors=Swap
[preflight/images] Pulling images required for setting up a Kubernetes cluster ##表示开始拉取镜像
[preflight/images] This might take a minute or two, depending on the speed of your internet connection
[preflight/images] You can also perform this action in beforehand using 'kubeadm config images pull' ##如果你感觉网速慢,可以运行kubeadm config images pull命令把镜像拖到本地
[certificates] Generated apiserver-kubelet-client certificate and key. ##可以看到生成一堆证书
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Generated etcd/ca certificate and key. 
[controlplane] wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
##yml控制给pod分多少cpu和内存
[controlplane] wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.
###markmaster帮我们把此节点标记为主节点
[markmaster] Marking the node k8s-master as master by adding the label "node-role.kubernetes.io/master=''"
[markmaster] Marking the node k8s-master as master by adding the taints [node-role.kubernetes.io/master:NoSchedule]
##bootstraptoken是引导令牌,让其他nodes加入集群时用的
[bootstraptoken] using token: as5gwu.ktojf6cueg0doexi
[bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
##从k81.11版开始,DNS正式被CoreDNS取代,它支持很多新的功能,比如资源的动态配置等
[addons] Applied essential addon: CoreDNS
##kube-proxy托管在K8S之上,负责生产service的iptables和ipvs规则,从k8s1.11开始默认支持ipvs
[addons] Applied essential addon: kube-proxy
##看到初始化成功了
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
##还需要手工运行一下命令
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
##其他机器装好包后,可以执行下面的命令来把nodes节点加入集群,把下面的命令记得自己保存起来,要不将来找不着就加不进去了
##其实这么设计的目的就是不是谁都能加入集群的,需要拿着下面的令牌来加入
You can now join any number of machines by running the following on each node
as root:
  kubeadm join 172.16.1.100:6443 --token as5gwu.ktojf6cueg0doexi --discovery-token-ca-cert-hash sha256:399a7de763b95e52084d7bd4cad71dc8fa1bf6dd453b02743d445eee59252cc5
1
2
3
4
5
6
7
8
9
[root@k8s-master chenzx]# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy-amd64                v1.11.1             d5c25579d0ff        7 weeks ago         97.8MB
k8s.gcr.io/kube-apiserver-amd64            v1.11.1             816332bd9d11        7 weeks ago         187MB
k8s.gcr.io/kube-controller-manager-amd64   v1.11.1             52096ee87d0e        7 weeks ago         155MB
k8s.gcr.io/kube-scheduler-amd64            v1.11.1             272b3a60cd68        7 weeks ago         56.8MB
k8s.gcr.io/coredns                         1.1.3               b3b94275d97c        3 months ago        45.6MB
k8s.gcr.io/etcd-amd64                      3.2.18              b8df3b177be2        4 months ago        219MB
k8s.gcr.io/pause                           3.1                 da86e6ba6ca1        8 months ago        742kB

说明:pause可以做一个容器,这个容器不用启动,pause可以使其他容器复制基础的网络和存储构件。

如果安装出错了,可以执行kubeadm reset命令进行重置,再重新执行kubeadm init...命令

注意:上面初始化中输出的kubeadm join 172.16.1.100:6443 --token.....这句话,一定要粘贴到记事本保存好,因为以后要使用这个命令把node加入集群,并且该命令无法复现,切记切记!!!

1
2
[root@k8s-master chenzx]#  mkdir -p $HOME/.kube
[root@k8s-master chenzx]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

6、在nodes节点上安装k8s包(所有nodes节点上执行)

1
 yum -y install docker-ce kubelet kubeadm (node上执行,nodes上可以不安装kubectl)

7、查看状态信息(在master上)

查看组件信息:

1
2
3
4
5
[root@k8s-master chenzx]# kubectl get cs 
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                   
controller-manager   Healthy   ok                   
etcd-0               Healthy   {"health""true"}

查看节点信息:

1
2
3
[root@k8s-master chenzx]# kubectl get nodes
NAME         STATUS     ROLES     AGE       VERSION
k8s-master   NotReady   master    51m       v1.11.2

说明,:状态为NotReady,是因为还缺flannel组件,没有这个组件是没法设置网络的。

8、安装flannel网络组件(master上执行)

下载地址:https://github.com/coreos/flannel

1
2
安装flannel:
[root@k8s-master chenzx]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看当前master节点上kube-system名称空间里运行的所有pod状态:

1
2
3
4
5
6
7
8
9
10
[root@k8s-master chenzx]# kubectl  get pods -n kube-system  
NAME                                 READY     STATUS              RESTARTS   AGE
coredns-78fcdf6894-6j6nt             0/1       Running   0          2h
coredns-78fcdf6894-pnmjj             0/1       Running   0          2h
etcd-k8s-master                      1/1       Running             0          1h
kube-apiserver-k8s-master            1/1       Running             0          1h
kube-controller-manager-k8s-master   1/1       Running             0          1h
kube-flannel-ds-amd64-txxw2          1/1       Running             0          1h
kube-proxy-frkp9                     1/1       Running             0          2h
kube-scheduler-k8s-master            1/1       Running             0          1h

另外,以上所有pod必须保证都是running状态的,如果哪个不是,可以通过类似如下命令查看为什么:

1
 kubectl dscrible pods  coredns-78fcdf6894-6j6nt   -n kube-system
1
2
3
4
查看flannel镜像:
[root@k8s-master chenzx]# docker images quay.io/coreos/flannel
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
1
2
3
4
查看nodes节点信息,看到status这回变成ready了
[root@k8s-master chenzx]# kubectl get nodes
NAME         STATUS    ROLES     AGE       VERSION
k8s-master   Ready     master    1h        v1.11.2

查看当前节点名称空间:

1
2
3
4
5
[root@k8s-master chenzx]# kubectl  get ns
NAME          STATUS    AGE
default       Active    3h
kube-public   Active    3h
kube-system   Active    3h

9、执行kubeadm join(在node1和node2上执行,表示加入集群中来)

该过程也会先检查先决条件是否满足需求,然后基于域共享的令牌认证方式完成master节点的认证,并完成本地的pod的资源安装,包含以addons方法部署的kubbe-proxy、DNS。

1)在node1和node2上修改配置文件并启动服务:

[root@k8s-master chenzx]# vim  /usr/lib/systemd/system/docker.service

1
2
3
[Service]
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,172.16.0.0/16"

[root@k8s-master chenzx]# vim /etc/sysconfig/kubelet

1
2
#指定额外的初始化信息
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
1
2
3
4
[root@k8s-node1 chenzx]# systemctl daemon-reload
[root@k8s-node1 chenzx]# systemctl start docker
[root@k8s-node1 chenzx]# systemctl enable docker 
[root@k8s-node1 chenzx]# systemctl enable kubelet

[root@k8s-node1 chenzx]# docker info

1
2
HTTPS Proxy: http://www.ik8s.io:10080
No Proxy: 127.0.0.0/8,172.16.0.0/16

[root@k8s-node1 chenzx]#   kubeadm join 172.16.1.100:6443 --token as5gwu.ktojf6cueg0doexi --discovery-token-ca-cert-hash sha256:399a7de763b95e52084d7bd4cad71dc8fa1bf6dd453b02743d445eee59252cc5  --ignore-preflight-errors=Swap (注意:这个命令是在kubeadm init初始化中得到的)

1
2
3
4
5
6
7
[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "k8s-node1" as an annotation
This node has joined the cluster:
* Certificate signing request was sent to master and a response
  was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the master to see this node join the cluster.

[root@k8s-node1 chenzx]# docker images

1
2
3
4
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy-amd64   v1.11.1             d5c25579d0ff        7 weeks ago         97.8MB
quay.io/coreos/flannel        v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
k8s.gcr.io/pause              3.1                 da86e6ba6ca1        8 months ago        742kB

[root@k8s-master chenzx]# kubectl get nodes (master上看)

1
2
3
NAME         STATUS    ROLES     AGE       VERSION
k8s-master   Ready     master    4h        v1.11.2
k8s-node1    Ready     <none>    55m       v1.11.2

[root@k8s-master chenzx]# kubectl get pods -n kube-system -o wide (master上看)

1
2
3
4
5
6
7
8
9
10
11
NAME                                 READY     STATUS              RESTARTS   AGE       IP             NODE
coredns-78fcdf6894-6j6nt             0/1       Running   0          4h        <none>         k8s-master
coredns-78fcdf6894-pnmjj             0/1       Running   0          4h        <none>         k8s-master
etcd-k8s-master                      1/1       Running             0          3h        172.16.1.100   k8s-master
kube-apiserver-k8s-master            1/1       Running             0          3h        172.16.1.100   k8s-master
kube-controller-manager-k8s-master   1/1       Running             0          3h        172.16.1.100   k8s-master
kube-flannel-ds-amd64-87tqv          1/1       Running             0          57m       172.16.1.101   k8s-node1
kube-flannel-ds-amd64-txxw2          1/1       Running             0          3h        172.16.1.100   k8s-master
kube-proxy-2rf4m                     1/1       Running             0          57m       172.16.1.101   k8s-node1
kube-proxy-frkp9                     1/1       Running             0          4h        172.16.1.100   k8s-master
kube-scheduler-k8s-master            1/1       Running             0          3h        172.16.1.100   k8s-master

以上命令在node2上也执行一遍。

此时已经完成k8s的安装。

最新文章

  1. POJ 3678 Katu Puzzle
  2. c++聪聪看书(低数据版代码)
  3. mysqlnd cannot connect 连接错误处理方法
  4. TinyMCE在线编辑器使用方法初探
  5. convert from base 10 to base 2
  6. &lt;q&gt;标签,短文本引用;&lt;blockquote&gt;标签,长文本引用
  7. linix container &amp; cgroup note
  8. ubuntu下读取数据库中文乱码解决
  9. 禁用gridview默认点击效果
  10. [转] 详解http和https的作用与区别
  11. repo的小结
  12. QT中的OpcDa 客户端 实现
  13. 编写高效的JavaScript
  14. 关于React Native 报Export declarations are not supported by current JavaScript version错误的解决问题
  15. 简易promise的实现(二)
  16. MachineLearningOnCoursera
  17. Spring Cloud中的负载均衡策略
  18. 【转】Android辅助功能AccessibilityService自动全选择文字粘贴模拟输入
  19. java.nio.file.NoSuchFileException
  20. mysql 终止 存储过程

热门文章

  1. Python 依赖版本控制 (requirements.txt 文件生成和使用)
  2. Nginx编译安装和平滑升级
  3. python处理yml
  4. 10分钟学会 linux awk命令
  5. 在eclipse运行一个项目报端口被占的问题
  6. es6 let介绍及应用场景
  7. [唐胡璐]Selenium技巧 - 利用MonteScreenRecorder录制视频
  8. 五.Protobuf3 枚举
  9. Django自定义filter
  10. RCNN,Fast RCNN,Faster RCNN 的前生今世:(2) R- CNN (3,2,1)