这是本系列文章中的第三篇,前两篇文章分别介绍了Kubernetes访问控制以及身份认证。本文将通过上手实践的方式,带你理解Kubernetes授权这一概念。

在文章正式开始之前,我们先快速回顾一下我们实操过程中的环境和场景。我们正在处理生产环境中的集群,其中每个部分都与命名空间相关联。现在,组里新来了一位同事叫Bob,我们在上篇教程中帮助Bob以engineering命名空间管理员的身份加入集群。并且他已经获得私钥以及签名证书来访问集群。
如果你还没有完成上述操作,请查看上篇教程,运行其中的命令以完成环境设置以及为Bob配置证书。
好,我们正式开始本篇教程。
现在我们要给Bob授权,以控制属于engineering命名空间的资源。
首先,我们要为kubectl创建一个上下文(context),方便它在不同的环境之间切换。
kubectl config set-context eng-context \
--cluster=minikube \
--namespace=engineering \
--user=bob
Context "eng-context" created.
上面的命令使用Bob在minikube集群中的凭据创建了一个指向engineering命名空间的新上下文。这会导致在〜/ .kube / config文件中添加一个新的部分。

我们现在在engineering命名空间中创建一个简单的pod:
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: engineering
labels:
app: myapp
spec:
containers:
- name: myapp
image: busybox
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
kubectl create -f myapp.yaml
pod/myapp created
kubectl get pods -n=engineering
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 0 89s
虽然您可以作为集群管理员在工程命名空间中创建和操作pod,但Bob甚至无法在同一名称空间中列出pod。
kubectl get pods --namespace engineering --as bob
Error from server (Forbidden): pods is forbidden: User "bob" cannot list resource "pods" in API group
为了使得Bob可以在engineering命名空间中访问资源,我们需要给他授权。这可以通过创建具有适当权限的角色然后将其绑定到用户Bob来完成。实质上,我们使用的是基于角色访问控制(RBAC)来允许Bob对engineering命名空间中的某些Kubernetes资源执行特定操作。
创建一个名为eng-reader的Kubernetes角色,允许其在engineering命名空间中列出pod。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: engineering
name: eng-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods", "services", "nodes"]
verbs: ["get", "watch", "list"]
kubectl create -f role.yaml
role.rbac.authorization.k8s.io/eng-reader created
kubectl get roles --namespace=engineering
NAME AGE
eng-reader 58s
注意,这一角色目前和Bob毫无关联。我们需要通过角色绑定将角色中指定的权限应用于Bob。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: eng-read-access
namespace: engineering
subjects:
- kind: User
name: bob # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role #this must be Role or ClusterRole
name: eng-reader # this must match the name of the Role or ClusterRole you wish to bind to
apiGroup: rbac.authorization.k8s.io
kubectl create -f role-binding.yaml
rolebinding.rbac.authorization.k8s.io/eng-read-access created
kubectl get rolebindings --namespace=engineering
NAME AGE
eng-read-access 31s
让我们来检查一下Bob现在是否可以访问pod。
kubectl get pods --namespace engineering --as bob
NAME READY STATUS RESTARTS AGE
myapp 1/1 Running 0 11m
既然他现在已经关联了eng-reader角色,那么他就获得了pod列表的权限。
此时,Bob在集群中的访问权限依旧十分有限。他所能做的只是在engineering 命名空间中列出pod。这对Bob帮助不大。他想要检查集群中的节点数量,但是令他失望的是,他遇到了 forbidden error。
kubectl get nodes --as bob
Error from server (Forbidden): nodes is forbidden: User "bob" cannot list resource "nodes" in API group
在Kubernetes中角色和角色绑定既可以应用在命名空间层面也可以应用在集群层面。我们现在创建一个集群角色以及一个与Bob关联的角色绑定,以使他能够列出节点。
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
# "namespace" omitted since ClusterRoles are not namespaced
name: cluster-node-reader
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "watch", "list"]
kubectl create -f cluster-role.yaml
clusterrole.rbac.authorization.k8s.io/cluster-node-reader created
kubectl get clusterroles cluster-node-reader
NAME AGE
cluster-node-reader 49s
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-cluster-nodes
subjects:
- kind: User
name: bob # Name is case sensitive
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-node-reader
apiGroup: rbac.authorization.k8s.io
kubectl create -f cluster-role-binding.yaml
clusterrolebinding.rbac.authorization.k8s.io/read-cluster-nodes created
kubectl get clusterrolebindings read-cluster-nodes
NAME AGE
read-cluster-nodes 35s
现在,Bob已经设置为可以在集群中列出节点。
kubectl get nodes --as bob
NAME STATUS ROLES AGE VERSION
minikube Ready master 52m v1.15.2
本篇教程的目的是为了帮助你理解角色以及角色绑定如何在Kubernetes中工作的。在本系列下一篇文章中,我们将来看看service account,保持关注哟~
相关推荐
内容概要:本文档是一份详尽的HBase学习教程,涵盖从安装配置、基础操作到实战项目的全方位内容。首先介绍了HBase的基本概念和特点,接着详细讲解了HBase的安装与配置步骤,包括环境准备、下载与解压、配置文件修改...
anaconda安装本文介绍了Anaconda的安装过程和使用方法,并给出了一些实用建议。通过Anaconda,你可以轻松管理Python环境和包,提高开发效率。希望本文能帮助你更好地使用Anaconda进行Python数据分析与机器学习工作。
#### 标题:Kubernetes Python API 文档 此文档为 Kubernetes 的 Python API 提供了全面的指南,涵盖所有可用的 Python API 接口,旨在帮助开发者更好地理解和使用这些接口来与 Kubernetes 集群进行交互。 #### ...
【kubernetes入门】快速了解和上手容器编排工具k8s
Linux驱动开发Ubuntu环境搭建全攻略:安装交叉编译工具链,网络文件系统,Qt5.6.2移植与编译,Ubuntu 14.04环境轻松上手,Linux驱动开发环境Ubuntu,已经制作好网络文件系统和zImage内核,已经交叉编译好Qt5.6.2 ...
在当今的编程世界中,GoLang 凭借其高效、简洁、并发性强等优势,越来越...无论是想踏入 GoLang 编程领域的新手,还是寻求技术提升的开发者,都能从这篇全攻略中汲取到宝贵的知识和经验,开启属于自己的高效编程之旅。
本文《MATLAB 全攻略:从入门到精通的实战指南》全方位剖析 MATLAB,帮助读者系统掌握其应用技巧。 文章从基础入门讲起,详细介绍 MATLAB 的安装与环境设置,阐述基本语法、矩阵数组操作及绘图基础,让初学者快速...
本资源包“k8s-1.16.1-搭建和操作-kubernetes安装包和详细文档笔记整理”提供了针对Kubernetes 1.16.1版本的详细指南,包括安装和操作步骤,对于学习和实践Kubernetes的用户来说,是一份非常宝贵的参考资料。...
Kubernetes 提供了多种应用示例和解决方案,帮助用户快速上手和部署应用程序。 Kubernetes 集群操作 Kubernetes 集群操作包括查看集群信息、创建名称空间、发布第一个容器化应用程序、配置启动 Kubernetes 等。...
- **Service Accounts**:为Pods提供身份验证和授权。 ##### 5. 扩展与监控 - **Horizontal Pod Autoscaling (HPA)**:根据CPU使用率或其他指标自动调整Pod的数量。 - **Cluster Autoscaling**:根据需求自动调整...
5. 安全管理:介绍安全管理的方法和注意事项,包括身份验证、授权、加密等。 此外,该指南还提供了法律声明、通用约定、目录等内容,旨在帮助用户更好地理解和使用阿里云容器服务Kubernetes版。 法律声明部分涵盖...
4. **标准库**:Go的标准库强大且全面,特别是在网络编程、并发控制和I/O操作方面,为构建Kubernetes组件提供了强大的支持。 5. **跨平台编译**:Go可以很容易地在不同操作系统和架构上编译,这对于Kubernetes这种...
- **认证与授权**:整合Go的加密库如`crypto/tls`,实现安全的身份验证和授权机制。 通过这样的设计,我们可以构建出一个既满足基本Kubernetes功能,又能在有限资源下高效运行的管理器。对于那些希望在边缘设备或低...
`kubernetes-vagrant-coreos-cluster`项目为Kubernetes初学者和开发者提供了一个快速上手的平台,通过Vagrant和CoreOS的结合,简化了集群的创建和管理过程。这个环境不仅可以用于测试新功能,还可以作为学习...
2.上手Kubernetes:基本概念、安装和命令行工具kubctl 介绍K8s在不同场景下的安装方式。并通过命令行工具kubectl的介绍和Demo帮助听众了解Kubernetes的主要功能和基本使用场景 3.Kubernetes的资源调度 介绍K8s中...
总的来说,Go-Compose on Kubernetes是Docker Compose和Kubernetes之间的一座桥梁,它使开发者能够利用熟悉的Docker Compose语法来管理Kubernetes集群,降低了学习和使用的门槛,提高了开发效率。对于那些已经习惯于...
本指南旨在帮助用户快速上手阿里云容器服务Kubernetes版,涵盖了容器服务的基本概念、规划和准备、快速入门、Kubernetes集群管理等方面的内容。 规划和准备 在使用阿里云容器服务Kubernetes版之前,用户需要进行...
**Kuboard:Kubernetes 的可视化界面** Kuboard 是一个针对 Kubernetes 的轻量级微服务管理界面,旨在为用户提供友好的图形用户界面(GUI),以便于更直观地管理和操作 Kubernetes 集群。与命令行工具相比,Kuboard...