Merge pull request #51 from x1e/patch-20170925

将'名字空间'修改为更通用的'命名空间'
pull/54/head
Jimmy Song 2017-09-25 11:37:27 +08:00 committed by GitHub
commit 45e6f60131
2 changed files with 43 additions and 43 deletions

View File

@ -114,9 +114,9 @@ Secret是用来保存和传递密码、密钥、认证凭证这些敏感信息
顾名思义用户帐户为人提供账户标识而服务账户为计算机进程和Kubernetes集群中运行的Pod提供账户标识。用户帐户和服务帐户的一个区别是作用范围用户帐户对应的是人的身份人的身份与服务的namespace无关所以用户账户是跨namespace的而服务帐户对应的是一个运行中程序的身份与特定namespace是相关的。
### 名空间Namespace
### 名空间Namespace
空间为Kubernetes集群提供虚拟的隔离作用Kubernetes集群初始有两个名空间,分别是默认名空间default和系统名空间kube-system除此以外管理员可以可以创建新的名空间满足需要。
名空间为Kubernetes集群提供虚拟的隔离作用Kubernetes集群初始有两个名空间,分别是默认名空间default和系统名空间kube-system除此以外管理员可以可以创建新的名空间满足需要。
### RBAC访问授权

View File

@ -14,9 +14,9 @@
### Role与ClusterRole
在RBAC API中一个角色包含了一套表示一组权限的规则。 权限以纯粹的累加形式累积(没有”否定”的规则)。 角色可以由名空间namespace内的`Role`对象定义而整个Kubernetes集群范围内有效的角色则通过`ClusterRole`对象实现。
在RBAC API中一个角色包含了一套表示一组权限的规则。 权限以纯粹的累加形式累积(没有”否定”的规则)。 角色可以由名空间namespace内的`Role`对象定义而整个Kubernetes集群范围内有效的角色则通过`ClusterRole`对象实现。
一个`Role`对象只能用于授予对某一单一名空间中资源的访问权限。 以下示例描述了”default”名空间中的一个`Role`对象的定义用于授予对pod的读访问权限
一个`Role`对象只能用于授予对某一单一名空间中资源的访问权限。 以下示例描述了”default”名空间中的一个`Role`对象的定义用于授予对pod的读访问权限
```yaml
kind: Role
@ -34,9 +34,9 @@ rules:
- 集群范围资源例如节点即node
- 非资源类型endpoint例如”/healthz”
- 跨所有名空间的名空间范围资源例如pod需要运行命令`kubectl get pods --all-namespaces`来查询集群中所有的pod
- 跨所有名空间的名空间范围资源例如pod需要运行命令`kubectl get pods --all-namespaces`来查询集群中所有的pod
下面示例中的`ClusterRole`定义可用于授予用户对某一特定名空间,或者所有名空间中的secret取决于其[绑定](https://k8smeetup.github.io/docs/admin/authorization/rbac/#rolebinding-and-clusterrolebinding)方式)的读访问权限:
下面示例中的`ClusterRole`定义可用于授予用户对某一特定名空间,或者所有名空间中的secret取决于其[绑定](https://k8smeetup.github.io/docs/admin/authorization/rbac/#rolebinding-and-clusterrolebinding)方式)的读访问权限:
```Yaml
kind: ClusterRole
@ -52,12 +52,12 @@ rules:
### RoleBinding与ClusterRoleBinding
角色绑定将一个角色中定义的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体即subject, 包括用户——User、用户组——Group、或者服务账户——Service Account以及对被授予角色的引用。 在名空间中可以通过`RoleBinding`对象授予权限,而集群范围的权限授予则通过`ClusterRoleBinding`对象完成。
角色绑定将一个角色中定义的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体即subject, 包括用户——User、用户组——Group、或者服务账户——Service Account以及对被授予角色的引用。 在名空间中可以通过`RoleBinding`对象授予权限,而集群范围的权限授予则通过`ClusterRoleBinding`对象完成。
`RoleBinding`可以引用在同一名空间内定义的`Role`对象。 下面示例中定义的`RoleBinding`对象在”default”名空间中将”pod-reader”角色授予用户”jane”。 这一授权将允许用户”jane”从”default”名空间中读取pod。
`RoleBinding`可以引用在同一名空间内定义的`Role`对象。 下面示例中定义的`RoleBinding`对象在”default”名空间中将”pod-reader”角色授予用户”jane”。 这一授权将允许用户”jane”从”default”名空间中读取pod。
```Yaml
# 以下角色绑定定义将允许用户"jane"从"default"名空间中读取pod。
# 以下角色绑定定义将允许用户"jane"从"default"名空间中读取pod。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
@ -73,17 +73,17 @@ roleRef:
apiGroup: rbac.authorization.k8s.io
```
`RoleBinding`对象也可以引用一个`ClusterRole`对象用于在`RoleBinding`所在的名空间内授予用户对所引用的`ClusterRole`中 定义的名空间资源的访问权限。这一点允许管理员在整个集群范围内首先定义一组通用的角色,然后再在不同的名空间中复用这些角色。
`RoleBinding`对象也可以引用一个`ClusterRole`对象用于在`RoleBinding`所在的名空间内授予用户对所引用的`ClusterRole`中 定义的名空间资源的访问权限。这一点允许管理员在整个集群范围内首先定义一组通用的角色,然后再在不同的名空间中复用这些角色。
例如,尽管下面示例中的`RoleBinding`引用的是一个`ClusterRole`对象但是用户”dave”即角色绑定主体还是只能读取”development” 名空间中的secret即`RoleBinding`所在的名空间)。
例如,尽管下面示例中的`RoleBinding`引用的是一个`ClusterRole`对象但是用户”dave”即角色绑定主体还是只能读取”development” 名空间中的secret即`RoleBinding`所在的名空间)。
```yaml
# 以下角色绑定允许用户"dave"读取"development"名空间中的secret。
# 以下角色绑定允许用户"dave"读取"development"名空间中的secret。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-secrets
namespace: development # 这里表明仅授权读取"development"名空间中的资源。
namespace: development # 这里表明仅授权读取"development"名空间中的资源。
subjects:
- kind: User
name: dave
@ -94,10 +94,10 @@ roleRef:
apiGroup: rbac.authorization.k8s.io
```
最后,可以使用`ClusterRoleBinding`在集群级别和所有名空间中授予权限。下面示例中所定义的`ClusterRoleBinding` 允许在用户组”manager”中的任何用户都可以读取集群中任何名空间中的secret。
最后,可以使用`ClusterRoleBinding`在集群级别和所有名空间中授予权限。下面示例中所定义的`ClusterRoleBinding` 允许在用户组”manager”中的任何用户都可以读取集群中任何名空间中的secret。
```yaml
# 以下`ClusterRoleBinding`对象允许在用户组"manager"中的任何用户都可以读取集群中任何名空间中的secret。
# 以下`ClusterRoleBinding`对象允许在用户组"manager"中的任何用户都可以读取集群中任何名空间中的secret。
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
@ -121,7 +121,7 @@ GET /api/v1/namespaces/{namespace}/pods/{name}/log
```
在这种情况下”pods”是名空间资源而”log”是pods的子资源。为了在RBAC角色中表示出这一点我们需要使用斜线来划分资源 与子资源。如果需要角色绑定主体读取pods以及pod log您需要定义以下角色
在这种情况下”pods”是名空间资源而”log”是pods的子资源。为了在RBAC角色中表示出这一点我们需要使用斜线来划分资源 与子资源。如果需要角色绑定主体读取pods以及pod log您需要定义以下角色
```yaml
kind: Role
@ -186,7 +186,7 @@ rules:
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
```
允许读取一个名为”my-config”的`ConfigMap`实例(需要将其通过`RoleBinding`绑定从而限制针对某一个名空间中定义的一个`ConfigMap`实例的访问):
允许读取一个名为”my-config”的`ConfigMap`实例(需要将其通过`RoleBinding`绑定从而限制针对某一个名空间中定义的一个`ConfigMap`实例的访问):
```yaml
rules:
@ -245,7 +245,7 @@ subjects:
apiGroup: rbac.authorization.k8s.io
```
kube-system名空间中的默认服务账户:
kube-system名空间中的默认服务账户:
```yaml
subjects:
@ -254,7 +254,7 @@ subjects:
namespace: kube-system
```
名为”qa”名空间中的所有服务账户:
名为”qa”名空间中的所有服务账户:
```yaml
subjects:
@ -325,14 +325,14 @@ API Server会创建一组默认的`ClusterRole`和`ClusterRoleBinding`对象。
### 面向用户的角色
一些默认角色并不包含`system:`前缀,它们是面向用户的角色。 这些角色包含超级用户角色(`cluster-admin`即旨在利用ClusterRoleBinding`cluster-status`)在集群范围内授权的角色, 以及那些使用RoleBinding`admin`、`edit`和`view`)在特定名空间中授权的角色。
一些默认角色并不包含`system:`前缀,它们是面向用户的角色。 这些角色包含超级用户角色(`cluster-admin`即旨在利用ClusterRoleBinding`cluster-status`)在集群范围内授权的角色, 以及那些使用RoleBinding`admin`、`edit`和`view`)在特定名空间中授权的角色。
| 默认ClusterRole | 默认ClusterRoleBinding | 描述 |
| ----------------- | ------------------------ | ---------------------------------------- |
| **cluster-admin** | **system:masters** group | 超级用户权限,允许对任何资源执行任何操作。 在**ClusterRoleBinding**中使用时,可以完全控制集群和所有名空间中的所有资源。 在**RoleBinding**中使用时可以完全控制RoleBinding所在名空间中的所有资源,包括名空间自己。 |
| **admin** | None | 管理员权限,利用**RoleBinding**在某一名空间内部授予。 在**RoleBinding**中使用时,允许针对名空间内大部分资源的读写访问, 包括在名空间内创建角色与角色绑定的能力。 但不允许对资源配额resource quota或者名空间本身的写访问。 |
| **edit** | None | 允许对某一个名空间内大部分对象的读写访问,但不允许查看或者修改角色或者角色绑定。 |
| **view** | None | 允许对某一个名空间内大部分对象的只读访问。 不允许查看角色或者角色绑定。 由于可扩散性等原因不允许查看secret资源。 |
| **cluster-admin** | **system:masters** group | 超级用户权限,允许对任何资源执行任何操作。 在**ClusterRoleBinding**中使用时,可以完全控制集群和所有名空间中的所有资源。 在**RoleBinding**中使用时可以完全控制RoleBinding所在名空间中的所有资源,包括名空间自己。 |
| **admin** | None | 管理员权限,利用**RoleBinding**在某一名空间内部授予。 在**RoleBinding**中使用时,允许针对名空间内大部分资源的读写访问, 包括在名空间内创建角色与角色绑定的能力。 但不允许对资源配额resource quota或者名空间本身的写访问。 |
| **edit** | None | 允许对某一个名空间内大部分对象的读写访问,但不允许查看或者修改角色或者角色绑定。 |
| **view** | None | 允许对某一个名空间内大部分对象的只读访问。 不允许查看角色或者角色绑定。 由于可扩散性等原因不允许查看secret资源。 |
### Core Component Roles
@ -388,7 +388,7 @@ API Server会创建一组默认的`ClusterRole`和`ClusterRoleBinding`对象。
RBAC API会阻止用户通过编辑角色或者角色绑定来升级权限。 由于这一点是在API级别实现的所以在RBAC授权器RBAC authorizer未启用的状态下依然可以正常工作。
用户只有在拥有了角色所包含的所有权限的条件下才能创建/更新一个角色,这些操作还必须在角色所处的相同范围内进行(对于`ClusterRole`来说是集群范围,对于`Role`来说是在与角色相同的名空间或者集群范围)。 例如如果用户”user-1”没有权限读取集群范围内的secret列表那么他也不能创建包含这种权限的`ClusterRole`。为了能够让用户创建/更新角色,需要:
用户只有在拥有了角色所包含的所有权限的条件下才能创建/更新一个角色,这些操作还必须在角色所处的相同范围内进行(对于`ClusterRole`来说是集群范围,对于`Role`来说是在与角色相同的名空间或者集群范围)。 例如如果用户”user-1”没有权限读取集群范围内的secret列表那么他也不能创建包含这种权限的`ClusterRole`。为了能够让用户创建/更新角色,需要:
1. 授予用户一个角色以允许他们根据需要创建/更新`Role`或者`ClusterRole`对象。
2. 授予用户一个角色包含他们在`Role`或者`ClusterRole`中所能够设置的所有权限。如果用户尝试创建或者修改`Role`或者`ClusterRole`以设置那些他们未被授权的权限时这些API请求将被禁止。
@ -400,7 +400,7 @@ RBAC API会阻止用户通过编辑角色或者角色绑定来升级权限。
- 隐式地,通过授予用户所有所引用的角色中所包含的权限
- 显式地通过授予用户在特定Role或者ClusterRole对象上执行`bind`操作的权限
例如下面例子中的ClusterRole和RoleBinding将允许用户”user-1”授予其它用户”user-1-namespace”名空间内的`admin`、`edit`和`view`等角色和角色绑定。
例如下面例子中的ClusterRole和RoleBinding将允许用户”user-1”授予其它用户”user-1-namespace”名空间内的`admin`、`edit`和`view`等角色和角色绑定。
```yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
@ -438,23 +438,23 @@ subjects:
## 一些命令行工具
有两个`kubectl`命令可以用于在名空间内或者整个集群内授予角色。
有两个`kubectl`命令可以用于在名空间内或者整个集群内授予角色。
### `kubectl create rolebinding`
在某一特定名空间内授予`Role`或者`ClusterRole`。示例如下:
在某一特定名空间内授予`Role`或者`ClusterRole`。示例如下:
- 在名为”acme”的名空间中将`admin` `ClusterRole`授予用户”bob”
- 在名为”acme”的名空间中将`admin` `ClusterRole`授予用户”bob”
`kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme`
- 在名为”acme”的名空间中将`view` `ClusterRole`授予服务账户”myapp”
- 在名为”acme”的名空间中将`view` `ClusterRole`授予服务账户”myapp”
`kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme`
### `kubectl create clusterrolebinding`
在整个集群中授予`ClusterRole`,包括所有名空间。示例如下:
在整个集群中授予`ClusterRole`,包括所有名空间。示例如下:
- 在整个集群范围内将`cluster-admin` `ClusterRole`授予用户”root”
@ -464,7 +464,7 @@ subjects:
`kubectl create clusterrolebinding kubelet-node-binding --clusterrole=system:node --user=kubelet`
- 在整个集群范围内将`view` `ClusterRole`授予名空间”acme”内的服务账户”myapp”
- 在整个集群范围内将`view` `ClusterRole`授予名空间”acme”内的服务账户”myapp”
`kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp`
@ -472,7 +472,7 @@ subjects:
## 服务账户Service Account权限
默认的RBAC策略将授予控制平面组件control-plane component、节点node和控制器controller一组范围受限的权限 但对于”kube-system”名空间以外的服务账户,则*不授予任何权限*(超出授予所有认证用户的发现权限)。
默认的RBAC策略将授予控制平面组件control-plane component、节点node和控制器controller一组范围受限的权限 但对于”kube-system”名空间以外的服务账户,则*不授予任何权限*(超出授予所有认证用户的发现权限)。
这一点允许您根据需要向特定服务账号授予特定权限。 细粒度的角色绑定将提供更好的安全性,但需要更多精力管理。 更粗粒度的授权可能授予服务账号不需要的API访问权限甚至导致潜在授权扩散但更易于管理。
@ -482,7 +482,7 @@ subjects:
要求应用程序在其pod规范pod spec中指定`serviceAccountName`字段并且要创建相应服务账户例如通过API、应用程序清单或者命令`kubectl create serviceaccount`等)。
例如在”my-namespace”名空间中授予服务账户”my-sa”只读权限
例如在”my-namespace”名空间中授予服务账户”my-sa”只读权限
```bash
kubectl create rolebinding my-sa-view \
@ -491,13 +491,13 @@ subjects:
--namespace=my-namespace
```
2. 在某一名空间中授予”default”服务账号一个角色
2. 在某一名空间中授予”default”服务账号一个角色
如果一个应用程序没有在其pod规范中指定`serviceAccountName`它将默认使用”default”服务账号。
注意授予”default”服务账号的权限将可用于名空间内任何没有指定`serviceAccountName`的pod。
注意授予”default”服务账号的权限将可用于名空间内任何没有指定`serviceAccountName`的pod。
下面的例子将在”my-namespace”名空间内授予”default”服务账号只读权限
下面的例子将在”my-namespace”名空间内授予”default”服务账号只读权限
```bash
kubectl create rolebinding default-view \
@ -506,7 +506,7 @@ subjects:
--namespace=my-namespace
```
目前,许多[加载项addon]/ docs / concepts / cluster-administration / addons /作为”kube-system”名空间中的”default”服务帐户运行。 要允许这些加载项使用超级用户访问权限请将cluster-admin权限授予”kube-system”名空间中的”default”服务帐户。 注意启用上述操作意味着”kube-system”名空间将包含允许超级用户访问API的秘钥。
目前,许多[加载项addon]/ docs / concepts / cluster-administration / addons /作为”kube-system”名空间中的”default”服务帐户运行。 要允许这些加载项使用超级用户访问权限请将cluster-admin权限授予”kube-system”名空间中的”default”服务帐户。 注意启用上述操作意味着”kube-system”名空间将包含允许超级用户访问API的秘钥。
```bash
kubectl create clusterrolebinding add-on-cluster-admin \
@ -514,11 +514,11 @@ subjects:
--serviceaccount=kube-system:default
```
3. 为名空间中所有的服务账号授予角色
3. 为名空间中所有的服务账号授予角色
如果您希望名空间内的所有应用程序都拥有同一个角色,无论它们使用什么服务账户,您可以为该名空间的服务账户用户组授予角色。
如果您希望名空间内的所有应用程序都拥有同一个角色,无论它们使用什么服务账户,您可以为该名空间的服务账户用户组授予角色。
下面的例子将授予”my-namespace”名空间中的所有服务账户只读权限:
下面的例子将授予”my-namespace”名空间中的所有服务账户只读权限:
```bash
kubectl create rolebinding serviceaccounts-view \
@ -531,7 +531,7 @@ subjects:
如果您不想管理每个命名空间的权限,则可以将集群范围角色授予所有服务帐户。
下面的例子将所有名空间中的只读权限授予集群中的所有服务账户:
下面的例子将所有名空间中的只读权限授予集群中的所有服务账户:
```bash
kubectl create clusterrolebinding serviceaccounts-view \
@ -555,7 +555,7 @@ subjects:
在Kubernetes 1.6之前许多部署使用非常宽泛的ABAC策略包括授予对所有服务帐户的完整API访问权限。
默认的RBAC策略将授予控制平面组件control-plane components、节点nodes和控制器controller一组范围受限的权限 但对于”kube-system”名空间以外的服务账户,则*不授予任何权限*(超出授予所有认证用户的发现权限)。
默认的RBAC策略将授予控制平面组件control-plane components、节点nodes和控制器controller一组范围受限的权限 但对于”kube-system”名空间以外的服务账户,则*不授予任何权限*(超出授予所有认证用户的发现权限)。
虽然安全性更高但这可能会影响到期望自动接收API权限的现有工作负载。 以下是管理此转换的两种方法: