第一章、RBAC介绍

在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;)绑定角色:将主体与角色进行绑定,对用户进行访问授权。

1、 角色和集群角色

在RBAC API中,角色包含代表权限集合的规则。在这里,权限只有被授予,而没有被拒绝的设置。在Kubernetes中有两类角色,即普通角色和集群角色。可以通过Role定义在一个命名空间中的角色,或者可以使用ClusterRole定义集群范围的角色。一个角色只能被用来授予访问单一命令空间中的资源。
集群角色(ClusterRole)能够被授予如下资源的权限:
集群范围的资源(类似于Node)
非资源端点(类似于”/healthz”)
集群中所有命名空间的资源(类似Pod)

2、角色绑定和集群角色绑定

角色绑定用于将角色与一个或一组用户进行绑定,从而实现将对用户进行授权的目的。主体分为用户、组和服务帐户。角色绑定也分为角色普通角色绑定和集群角色绑定。角色绑定只能引用同一个命名空间下的角色。
角色绑定也可以通过引用集群角色授予访问权限,当主体对资源的访问仅限与本命名空间,这就允许管理员定义整个集群的公共角色集合,然后在多个命名空间中进行复用。
集群角色可以被用来在集群层面和整个命名空间进行授权。

3、资源

在Kubernets中,主要的资源包括:Pods、Nodes、Services、Deployment、Replicasets、Statefulsets、Namespace、Persistents、Secrets和ConfigMaps等。另外,有些资源下面存在子资源,例如:Pod下就存在log子资源

4、主体

RBAC授权中的主体可以是组,用户或者服务帐户。用户通过字符串表示,比如“alice”、 “bob@example.com”等,具体的形式取决于管理员在认证模块中所配置的用户名。system:被保留作为用来Kubernetes系统使用,因此不能作为用户的前缀。组也有认证模块提供,格式与用户类似。

第二章、简单示例

1、使用RoleBanding将用户绑定到Role上

查看命令帮助及格式

[root@k8s-master01 ~]# kubectl create role -h  #查看创建role的命令帮助,以及一些简单的示例
[root@k8s-master01 RBAC]# kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml #通过 -o参数导出yaml格式,可以大致看到Role是如何定义的
[root@k8s-master01 RBAC]# cat role-
demo.yaml #最后完成的yaml文件如下
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pods-reader
namespace: default #名称空间名称
rules:
- apiGroups:
- ""
resources: #包含哪些资源
- pods
verbs: #对以上资源允许进行哪些操作
- get
- list
- watch

创建role

[root@k8s-master01 RBAC]# kubectl apply -f role-demo.yaml
role.rbac.authorization.k8s.io "pods-reader" created
[root@k8s-master01 RBAC]# kubectl get role #查看role的信息
NAME AGE
pods-reader 8s
[root@k8s-master01 RBAC]# kubectl describe role pods-reader #查看pods-reader 的详细信息
Name: pods-reader
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"pods-reader","namespace":"default"},"rules":[{"apiGroup...
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
pods [] [] [get list watch]
#
Resources:资源类别,表示对该资源类别下的所有资源进行操作
Non
-Resource URLs:非资源URL,对某些资源进行某种特殊操作的存在
Resource Names:对资源类别下某个或多个资源进行操作
Verbs:操作的类型 
 

 创建一个RoleBinding,将用户qiangungun(该用户在上一章节serviceaccount中已经被创建)绑定到pods-reader 这个role上去

[root@k8s-master01 ~]# kubectl create rolebinding -h  #查看命令帮助
kubectl create rolebinding qiangungun-read-pods --role=pods-reader --user=qiangungun --dry-run -o yaml #创建名称为qiangungun-read-pods的rolebinding,绑定到名称为pods-reader的role上
[root@k8s-master01 RBAC]# cat rolebinding-demo.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: qiangungun-read-pods
roleRef: #role引用,表示引用哪个role
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pods-reader
subjects: #动作的执行主题
- apiGroup: rbac.authorization.k8s.io
kind: User
name: qiangungun
[root@k8s-master01 RBAC]# kubectl describe rolebinding qiangungun-read-pods
Name: qiangungun-read-pods
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"rbac.authorization.k8s.io/v1","kind":"RoleBinding","metadata":{"annotations":{},"name":"qiangungun-read-pods","namespace":"default"},"ro...
Role:
Kind: Role
Name: pods-reader
Subjects:
Kind Name Namespace
---- ---- ---------
User qiangungun   

验证操作

[root@k8s-master01 RBAC]# kubectl config use-context qiangungun@kubernetes #前后当前上下文到qiangungun用户
Switched to context "qiangungun@kubernetes".
[root@k8s-master01 RBAC]# kubectl get pods #获取当前名称空间的pod信息,可以看到能够正常显示
NAME READY STATUS RESTARTS AGE
myapp-deploy-5cfd895984-262kz / Running 3d
myapp-deploy-5cfd895984-7whdn / Running 3d
myapp-deploy-5cfd895984-lg8sh / Running 3d
myapp-deploy-5cfd895984-m7h5j / Running 3d
myapp-deploy-5cfd895984-zd9cm / Running 3d
[root@k8s-master01 RBAC]# kubectl get pods -n kube-system #查看其它空间pod的信息,可以看到提示没有权限,即验证RoleBanding的权限只对当前的名称空间生效
Error from server (Forbidden): pods is forbidden: User "qiangungun" cannot list pods in the namespace "kube-system"

2、使用ClusterRoleBanding将用户绑定到ClusterRole上

创建一个ClusterRole

[root@k8s-master01 RBAC]# kubectl config use-context kubernetes-admin@kubernetes #切换上下文
Switched to context "kubernetes-admin@kubernetes".
[root@k8s-master01 RBAC]# kubectl create clusterrole -h
[root@k8s-master01 RBAC]# kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods -o yaml --dry-run
[root@k8s-master01 RBAC]# cat clusterrole-
cluster.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-reader #ClusterRole属于集群级别,所有不可以定义namespace
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
[root@k8s-master01 RBAC]# kubectl apply -f clusterrole-cluster.yaml
[root@k8s-master01 RBAC]# useradd admin
[root@k8s-master01 RBAC]# cp -rp ~/.kube/ /home/admin
[root@k8s-master01 RBAC]# chown -R admin:admin /home/admin
[root@k8s-master01 RBAC]# su - admin
[admin@k8s-master01 ~]$ kubectl config use-context qiangungun@kubernetes
[admin@k8s-master01 ~]$ kubectl config view 
 

创建一个ClusterRoleBinding,将用户qiangungun绑定到cluster-reader这个ClusterRole上面去

[root@k8s-master01 RBAC]# kubectl delete rolebinding qiangungun-read-pods   #root用户
[admin@k8s-master01 ~]$ kubectl get
pods #admin用户下验证
Error from server (Forbidden): pods is forbidden: User "qiangungun" cannot list pods in the namespace "default"
[root@k8s-master01 RBAC]# kubectl create clusterrolebinding -h
[root@k8s-master01 RBAC]# kubectl create clusterrolebinding qiangungun-read-all-pods --clusterrole=cluster-reader --user=qiangungun --dry-run -o yaml #创建名称为qiangungun-read-all-pods的才clusterrolebinding,将名称为cluster-reader的clusterrole绑定到用户名称为qiangungun上
[root@k8s-master01 RBAC]# cat clusterrolebinding-
demo.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
creationTimestamp: null
name: qiangungun-read-all-pods
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: qiangungun
[root@k8s-master01 RBAC]# kubectl apply -f clusterrolebinding-demo.yaml
[root@k8s-master01 RBAC]# kubectl describe clusterrolebinding qiangungun-read-all-pods   

验证

#切换到admin用户终端下
[admin@k8s-master01 ~]$ kubectl get
pods #可以查看当前名称空间pod信息
NAME READY STATUS RESTARTS AGE
myapp-deploy-5cfd895984-262kz / Running 3d
myapp-deploy-5cfd895984-7whdn / Running 3d
myapp-deploy-5cfd895984-lg8sh / Running 3d
myapp-deploy-5cfd895984-m7h5j / Running 3d
myapp-deploy-5cfd895984-zd9cm / Running 3d
[admin@k8s-master01 ~]$ kubectl get pods -n ingress-nginx #可以查看其他空间的pod信息
NAME READY STATUS RESTARTS AGE
default-http-backend-66c4fbf5b4-m8d6j / Running 24d
nginx-ingress-controller-64bcff8657-6j4tq / Running 24d
[admin@k8s-master01 ~]$ kubectl delete pod myapp-deploy-5cfd895984-262kz #无法删除pod
Error from server (Forbidden): pods "myapp-deploy-5cfd895984-262kz" is forbidden: User "qiangungun" cannot delete pods in the namespace "default"

3、使用RoleBinding绑定ClusterRole 

创建一个RoleBinding(ClusterRole使用以及存在的),并将用户绑定到ClusterRole上

[root@k8s-master01 RBAC]# kubectl delete clusterrolebinding qiangungun-read-all-pods #为了避免冲突,先将之前的clusterrolebinding删除
clusterrolebinding.rbac.authorization.k8s.io "qiangungun-read-all-pods" deleted
[root@k8s-master01 RBAC]#kubectl create rolebinding qiangungun-read-pods --clusterrole=cluster-reader --user=qiangungun --dry-run -o yam
[root@k8s-master01 RBAC]# cat rolebinding-cluster-
demo.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: qiangungun-read-pods
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: qiangungun
[root@k8s-master01 RBAC]# kubectl apply -f rolebinding-cluster-demo.yaml
rolebinding.rbac.authorization.k8s.io "qiangungun-read-pods" created
[root@k8s-master01 RBAC]# kubectl describe rolebinding qiangungun-read-pods   

验证:

#admin用户终端下
[admin@k8s-master01 ~]$ kubectl get
pods #可以获取当前名称空间的pod信息
NAME READY STATUS RESTARTS AGE
myapp-deploy-5cfd895984-262kz / Running 3d
myapp-deploy-5cfd895984-7whdn / Running 3d
myapp-deploy-5cfd895984-lg8sh / Running 3d
myapp-deploy-5cfd895984-m7h5j / Running 3d
myapp-deploy-5cfd895984-zd9cm / Running 3d
[admin@k8s-master01 ~]$ kubectl get pods -n ingress-nginx #不可用获取其他名称空间的信息
Error from server (Forbidden): pods is forbidden: User "qiangungun" cannot list pods in the namespace "ingres

4、使用RoleBinding绑定集群自带的ClusterRole  

[root@k8s-master01 RBAC]# kubectl get clusterrole  #查看当前集群存在的clusterrole
[root@k8s-master01 RBAC]# kubectl create rolebinding default-ns-admin --clusterrole=admin --user=qiangungun --dry-run -o yaml #将qiangungun用户绑定到名称为admin的clusterrole上,可以使用get查看admin的配置
[root@k8s-master01 RBAC]# cat rolebinding-cluster-admin-
demo.yaml
piVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: default-ns-admin
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: qiangungun
[root@k8s-master01 RBAC]# kubectl apply -f rolebinding-cluster-admin-demo.yaml
[root@k8s-master01 RBAC]# kubectl describe rolebinding default-ns-admin  
 

验证

#admin用户终端下
[admin@k8s-master01 ~]$ kubectl get
pods #可以获取当前名称空间的pod信息
NAME READY STATUS RESTARTS AGE
myapp-deploy-5cfd895984-262kz / Running 3d
myapp-deploy-5cfd895984-7whdn / Running 3d
myapp-deploy-5cfd895984-lg8sh / Running 3d
myapp-deploy-5cfd895984-m7h5j / Running 3d
myapp-deploy-5cfd895984-zd9cm / Running 3d
......
[admin@k8s-master01 ~]$ kubectl delete pod myapp-deploy-5cfd895984-262kz #可以删除当前名称空间的pod
pod "myapp-deploy-5cfd895984-262kz" deleted
[admin@k8s-master01 ~]$ kubectl get deploy #可以查看名称空间中的其他资源,如deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deploy 3d
[admin@k8s-master01 ~]$ kubectl delete deployment nginx-deploy #可以删除当前名称空间的其他资源,如deployment
deployment.extensions "nginx-deploy" deleted
[admin@k8s-master01 ~]$ kubectl get pods -n kube-system #对其名称空间没有任何权限
Error from server (Forbidden): pods is forbidden: User "qiangungun" cannot list pods in the namespace "kube-system"

第三章、Role、CluseterRole、RoleBinding、ClusterRoleBinding在系统的相关联系

[root@k8s-master01 RBAC]# kubectl get clusterrolebinding #查看集群中的clusterrolebingding
NAME AGE
cluster-admin 31d
......
[root@k8s-master01 RBAC]# kubectl get clusterrolebinding cluster-admin -o yaml #获取名称为cluster-admin的clusterrolebingding配置信息
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
creationTimestamp: --30T02::22Z
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: cluster-admin
resourceVersion: ""
selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/cluster-admin
uid: 07b1d436-dbec-11e8--5254001b07db
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group #类型是一个组
name: system:masters #这个组中包含了kubernetes-admin这个用户,而这个用户是默认的当前使用用户
[root@k8s-master01 RBAC]# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://172.16.150.212:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin #默认使用的当前用户
name: kubernetes-admin@kubernetes
- context:
cluster: kubernetes
user: qiangungun
name: qiangungun@kubernetes
current-context: kubernetes-admin@kubernetes #当前的使用sa
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
- name: qiangungun
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
[root@k8s-master01 RBAC]# cd /etc/kubernetes/pki/
[root@k8s-master01 pki]# openssl x509 -in ./apiserver-kubelet-client.crt -text -
noout #查看证书签发的内容
Certificate:
Data:
Version: (0x2)
Serial Number: (0x2c3ce992f3e5d4dd)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=kubernetes
Validity
Not Before: Oct :: GMT
Not After : Oct :: GMT
Subject: O=system:masters, CN=kube-apiserver-kubelet-client #kubernetes-admin用户之所以属于system:master这个组,是因为在它的的证书中定义的,O表示组,如果以后我们想一次授权多个用户,可以将这些用户添加至一个组内,然后给这个组授权即可
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: ( bit)
.....

#如果RoleBinding或者ClusterRoleBinding的对象是serviceaccount,,那么任意一个pod(spec.serviceAcountName中定义)如果启动时以这个serviceaccount name作为它是以的serviceaccount,那么pod中的应用程序也同时拥有了这个serviceaccount的权限,也就是拥有该serviceaccount绑定的Role或者ClusterRole的权限。系统上一下特殊的pod可能需要做这样的设置,下面我就以集群创建时使用的flannel网络插件为示例讲解

查看flannel的配置

[root@k8s-master01 kubernetes]# cat kube-flannel.yml   #flannel的配置文件
---
kind: ClusterRole #定义一个ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding #定义了一个ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount #定义了一个ServiceAccount
metadata:
name: flannel
namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
---
......(以下省略)  

查看flannel创建的pod信息

[root@k8s-master01 kubernetes]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
etcd-k8s-master01 / Running 32d
kube-apiserver-k8s-master01 / Running 32d
kube-controller-manager-k8s-master01 / Running 7d
kube-dns-86f4d74b45-72kdh / Running 32d
kube-flannel-ds-amd64-847wt / Running 32d
kube-flannel-ds-amd64-9v9t6 / Running 32d
kube-flannel-ds-amd64-k4blq / Running 32d
kube-proxy-8l9tf / Running 32d
kube-proxy-m6pqm / Running 32d
kube-proxy-scj8n / Running 32d
kube-scheduler-k8s-master01 / Running 32d
[root@k8s-master01 kubernetes]# kubectl get pod kube-flannel-ds-amd64-847wt -n kube-system -o yaml
......(省略)
serviceAccount: flannel
serviceAccountName: flannel #表示当前的pod在启动容器时,运行的进程与APIserver进行通讯的时候,会以serviceAccountName的账号与APIserver进行连接,从而获得该serviceaccount的权限
.....(省略) 

下面是一张我个人总结的关于user绑定到不同的Role和Binding时所拥有的权限边界

User

Binding 类型

Role 类型

权限

RoleBinding

Role

namespace

ClusterRoleBinding

ClusterRole

Cluster

RoleBinding

ClusterRole

namespace

参考文档:https://www.kubernetes.org.cn/4062.html  

kubernetes学习笔记之十:RBAC的更多相关文章

  1. kubernetes学习笔记之十四:helm入门

    1.Helm的简介 Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. Helm有如下几个基本概念: Chart ...

  2. kubernetes学习笔记之十二:资源指标API及自定义指标API

    第一章.前言 以前是用heapster来收集资源指标才能看,现在heapster要废弃了从1.8以后引入了资源api指标监视 资源指标:metrics-server(核心指标) 自定义指标:prome ...

  3. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  4. VSTO 学习笔记(十二)自定义公式与Ribbon

    原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...

  5. VSTO学习笔记(十五)Office 2013 初体验

    原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...

  6. VSTO 学习笔记(十)Office 2010 Ribbon开发

    原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...

  7. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  8. Python学习笔记(十)

    Python学习笔记(十): 装饰器的应用 列表生成式 生成器 迭代器 模块:time,random 1. 装饰器的应用-登陆练习 login_status = False # 定义登陆状态 def ...

  9. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

随机推荐

  1. 最短路,floyd算法,图的最短路径

    题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线 ...

  2. Font 'C:\WINDOWS\FONTS\msyh.ttc' with 'Identity-H' is not recognized

    在生成PDF使用windows自带字体雅黑的时候不停的报“Font 'C:\WINDOWS\FONTS\msyh.ttc' with 'Identity-H' is not recognized”的错 ...

  3. 直接借鉴的 ids拼接

    function _getIds(selectedIds, targetType){ var ids = ""; var $box = targetType == "di ...

  4. less的入门教程

    CSS的短板 作为前端学习者的我们 或多或少都要学些 CSS ,它作为前端开发的三大基石之一,时刻引领着 Web 的发展潮向. 而 CSS 作为一门标记性语言,可能 给初学者第一印象 就是简单易懂,毫 ...

  5. Linux搭建bugfree

    1.xampp安装包地址: 链接:https://pan.baidu.com/s/1Th2QvF77jvIGzMROoF2rbg 密码:yoar 2.因为我用的是xshell5连接Linux服务器,直 ...

  6. ViewpagerHandler

    import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.su ...

  7. Ubuntu16.04中pip无法更新升级,采用源码方式安装

    1.从pip官网下载最新版 https://pypi.org/project/pip/#files 2.ubuntu中创建文件位置,我的放在一下路径,之后进行解压 3.解压后进入pip的文件夹,在执行 ...

  8. SSH(远程登录)原理

    最近在研究hadoop,因为是分布式的,会涉及很多机器协作工作,但所有的操作都是需要进行权限验证的,namenode主机会尝试启动datanode主机上的进程等等.下面就用一张图来解释SSH登录验证的 ...

  9. 【python接口自动化框架-unittest】如何传参数到下一个case

    1.前提 平时我们用unittest的时候,都知道每个test_ 都是相互独立的,但是很多现实情况是,我们下一个接口参数,可能会用到上一个接口返回的json字段,那么,我们怎么去实现呢 2.实例 1. ...

  10. 前后端如何保持长连接?---websocket

    1. pc端的应用,一般会采用前端定时请求后台; 2. app定时去访问后台的话,对用户来说并不友好,会消耗大量的流量,移动端最好的方式就是后台主动向app推送信息; 3. H5提供了一种比较好的方式 ...