时隔16年Jeff Barr重返10.23-25 QCon上海站,带你看透AI如何重塑软件开发! 了解详情
写点什么

Kubernetes 身份认证和授权操作全攻略:上手操作 Kubernetes 授权

  • 2020-05-16
  • 本文字数:2477 字

    阅读完需:约 8 分钟

Kubernetes身份认证和授权操作全攻略:上手操作Kubernetes授权

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


在文章正式开始之前,我们先快速回顾一下我们实操过程中的环境和场景。我们正在处理生产环境中的集群,其中每个部分都与命名空间相关联。现在,组里新来了一位同事叫 Bob,我们在上篇教程中帮助 Bob 以 engineering 命名空间管理员的身份加入集群。并且他已经获得私钥以及签名证书来访问集群。


如果你还没有完成上述操作,请查看上篇教程,运行其中的命令以完成环境设置以及为 Bob 配置证书。


好,我们正式开始本篇教程。


现在我们要给 Bob 授权,以控制属于 engineering 命名空间的资源。


首先,我们要为 kubectl 创建一个上下文(context),方便它在不同的环境之间切换。


kubectl config set-context eng-context \  --cluster=minikube \  --namespace=engineering \  --user=bobContext "eng-context" created.
复制代码


上面的命令使用 Bob 在 minikube 集群中的凭据创建了一个指向 engineering 命名空间的新上下文。这会导致在〜/ .kube / config 文件中添加一个新的部分。



我们现在在 engineering 命名空间中创建一个简单的 pod:


apiVersion: v1kind: Podmetadata:  name: myapp  namespace: engineering  labels:    app: myappspec:  containers:  - name: myapp    image: busybox    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
复制代码


 kubectl create -f myapp.yamlpod/myapp created
复制代码


kubectl get pods -n=engineeringNAME    READY   STATUS    RESTARTS   AGEmyapp   1/1     Running   0          89s
复制代码


虽然您可以作为集群管理员在工程命名空间中创建和操作 pod,但 Bob 甚至无法在同一名称空间中列出 pod。


kubectl get pods --namespace engineering --as bobError from server (Forbidden): pods is forbidden: User "bob" cannot list resource "pods" in API group "" in the namespace "engineering"
复制代码


为了使得 Bob 可以在 engineering 命名空间中访问资源,我们需要给他授权。这可以通过创建具有适当权限的角色然后将其绑定到用户 Bob 来完成。实质上,我们使用的是基于角色访问控制(RBAC)来允许 Bob 对 engineering 命名空间中的某些 Kubernetes 资源执行特定操作。


创建一个名为 eng-reader 的 Kubernetes 角色,允许其在 engineering 命名空间中列出 pod。


apiVersion: rbac.authorization.k8s.io/v1metadata:  namespace: engineering   name: eng-readerrules:- apiGroups: [""] # "" indicates the core API group  resources: ["pods", "services", "nodes"]  verbs: ["get", "watch", "list"]
复制代码


kubectl create -f role.yamlrole.rbac.authorization.k8s.io/eng-reader created
复制代码


kubectl get roles --namespace=engineeringNAME         AGEeng-reader   58s
复制代码


注意,这一角色目前和 Bob 毫无关联。我们需要通过角色绑定将角色中指定的权限应用于 Bob。


kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: eng-read-access  namespace: engineeringsubjects:- kind: User  name: bob # Name is case sensitive  apiGroup: rbac.authorization.k8s.ioroleRef:  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.yamlrolebinding.rbac.authorization.k8s.io/eng-read-access created
复制代码


kubectl get rolebindings --namespace=engineeringNAME              AGEeng-read-access   31s
复制代码


让我们来检查一下 Bob 现在是否可以访问 pod。


kubectl get pods --namespace engineering --as bobNAME    READY   STATUS    RESTARTS   AGEmyapp   1/1     Running   0          11m
复制代码


既然他现在已经关联了 eng-reader 角色,那么他就获得了 pod 列表的权限。


此时,Bob 在集群中的访问权限依旧十分有限。他所能做的只是在 engineering 命名空间中列出 pod。这对 Bob 帮助不大。他想要检查集群中的节点数量,但是令他失望的是,他遇到了 forbidden error。


kubectl get nodes --as bobError from server (Forbidden): nodes is forbidden: User "bob" cannot list resource "nodes" in API group "" at the cluster scope
复制代码


在 Kubernetes 中角色和角色绑定既可以应用在命名空间层面也可以应用在集群层面。我们现在创建一个集群角色以及一个与 Bob 关联的角色绑定,以使他能够列出节点。


kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:  # "namespace" omitted since ClusterRoles are not namespaced  name: cluster-node-readerrules:- apiGroups: [""]  resources: ["nodes"]  verbs: ["get", "watch", "list"]
复制代码


kubectl create -f cluster-role.yamlclusterrole.rbac.authorization.k8s.io/cluster-node-reader created
复制代码


kubectl get clusterroles cluster-node-readerNAME                  AGEcluster-node-reader   49s
复制代码


kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: read-cluster-nodessubjects:- kind: User  name: bob # Name is case sensitive  apiGroup: rbac.authorization.k8s.ioroleRef:  kind: ClusterRole  name: cluster-node-reader  apiGroup: rbac.authorization.k8s.io
复制代码


kubectl create -f cluster-role-binding.yamlclusterrolebinding.rbac.authorization.k8s.io/read-cluster-nodes created
复制代码


kubectl get clusterrolebindings read-cluster-nodesNAME                 AGEread-cluster-nodes   35s
复制代码


现在,Bob 已经设置为可以在集群中列出节点。


kubectl get nodes --as bobNAME       STATUS   ROLES    AGE   VERSIONminikube   Ready    master   52m   v1.15.2
复制代码


本篇教程的目的是为了帮助你理解角色以及角色绑定如何在 Kubernetes 中工作的。在本系列下一篇文章中,我们将来看看 service account,保持关注哟~


2020-05-16 17:181046

评论

发布
暂无评论
发现更多内容

中国信创:以「AI+」为翼,铸科技强国底气

脑极体

AI

如何设置YashanDB的性能指标监控系统

数据库砖家

Algoriddim Neural Mix Pro for mac(mac音乐编辑器)

春天的风暖暖的

FreeBSD 14发布后的技术问题解析

qife122

EC2 freebsd

AI得贤招聘官第六代AI面试智能体“零成本”开放试用,重塑人才选拔

AI得贤招聘官

如何利用YashanDB支持企业的数字转型

数据库砖家

如何评估YashanDB的技术支持与客户服务

数据库砖家

如何评估YashanDB数据库的安全性与合规性

数据库砖家

儿童与青少年数据安全及体育发展新方向会议

qife122

隐私保护 数据安全

如何利用YashanDB提升业务系统的响应速度

数据库砖家

如何评估YashanDB的数据库安全性

数据库砖家

如何评估YashanDB的性能与稳定性

数据库砖家

YashanDB 数据检索系统

数据库砖家

zkSync Era在ETHDenver的技术盛宴:zkEVM与Layer2创新实践

qife122

区块链 layer2

如何利用YashanDB数据查询性能的6个方法

数据库砖家

如何利用YashanDB支持企业的数据治理

数据库砖家

如何确保YashanDB的高可用性与容错性

数据库砖家

量子迁移计划启动:应对未来密码学挑战

qife122

网络安全 量子计算

漏洞赏金入门指南:从零开始的实战方法论

qife122

渗透测试 漏洞挖掘

中国信创:以「AI+」为翼,铸科技强国底气

白洞计划

AI

如何利用YashanDB优化数据存储与访问速度

数据库砖家

如何评估YashanDB的行业适应性与灵活性

数据库砖家

如何评估YashanDB数据库的实施效果与风险

数据库砖家

如何设计高效的YashanDB数据库数据模型

数据库砖家

识别和解决 YashanDB 数据库性能瓶颈

数据库砖家

iWork Converter for mac(简单易用的iWork文件转换工具)

春天的风暖暖的

zkSync Era主网上线:首个zkEVM全面开放的技术突破

qife122

区块链 以太坊扩容

大数据-115 - Flink DataStream Transformation Map、FlatMap、Filter 到 Window 的全面讲解

武子康

Java 大数据 flink spark 分布式

如何实现YashanDB数据库的多租户架构

数据库砖家

如何实现YashanDB数据库的高效权限管理体系

数据库砖家

如何使用YashanDB创建高效的数据库架构

数据库砖家

Kubernetes身份认证和授权操作全攻略:上手操作Kubernetes授权_文化 & 方法_Rancher_InfoQ精选文章