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

这是本系列文章中的第三篇,前两篇文章分别介绍了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

public class ValuesController : ControllerBase
{
private readonly MyOptions _options1;
private readonly MyOptions _options2;
private readonly MyOptions _options3;
private readonly IConfiguration _configurationRoot;

public ValuesController(IConfiguration configurationRoot, IOptionsMonitor<MyOptions> options1, IOptionsSnapshot<MyOptions> options2,
IOptions<MyOptions>www.jintianxuesha.com options3 )
{
//IConfiguration(ConfigurationRoot)随着配置文件进行更新(需要IConfigurationProvider监听配置源的更改)
_configurationRoot www.chengsyl.cn= configurationRoot;
//单例,监听IConfiguration的IChangeToken,在配置源发生改变时,自动删除缓存
//生成新的Option实例并绑定,加入缓存
_options1 = options1.CurrentValue;
//scoped,每次请求重新生成Option实例并从IConfiguration获取数据进行绑定
_options2 = options2.Value;
//单例,从IConfiguration获取数据进行绑定,只绑定一次
_options3 = options3.Value;
}
}
二、源码解读
首先看看Configure扩展方法,方法很简单,通过DI注入了Options需要的依赖。这里注入了了三种访问强类型配置的方法所需的所有依赖,接下来我们按照这三种方法去分析源码。

public static IServiceCollection Configure<TOptions>(this IServiceCollection services, IConfiguration config) where TOptions : class
=> services.Configure<TOptions>www.hongyaoyuL.cn(Options.Options.DefaultName, config, _ =www.javachenglei.com > { });

public static IServiceCollection Configure<www.yuanhuapt.cn TOptions>(this IServiceCollection services, string name, IConfiguration config, Action<BinderOptions> configureBinder)
where TOptions : class
{
services.AddOptions(www.haishenyul.com);

services.AddSingleton<www.tongyayuLe.cn IOptionsChangeTokenSource<TOptions>>(new ConfigurationChangeTokenSource<TOptions>(name, config));

return services.AddSingleton<IConfigureOptions<TOptions>>(new NamedConfigureFromConfigurationOptions<TOptions>(name, config, configureBinder));
}
/// 为IConfigurationSection实例注册需要绑定的TOptions
public static IServiceCollection AddOptions(this IServiceCollection services)
{
services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<www.jiuhaoyulept.com>), typeof(OptionsManager<>)));
//创建以客户端请求为范围的作用域
services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>)));
services.TryAdd(ServiceDescriptor.Singleton(typeof(www.pingguoyul.cn IOptionsMonitor<>), typeof(OptionsMonitor<>)));
services.TryAdd(ServiceDescriptor.Transient(typeof(IOptionsFactory<>), typeof(OptionsFactory<>)));
services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitorCache<>), typeof(OptionsCache<>)));
return services;

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

kubectl get nodes --as bob
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   52m   v1.15.2

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

原文地址:https://www.cnblogs.com/qwangxiao/p/11426842.html

时间: 2024-10-10 09:32:24

Kubernetes身份认证和授权操作全攻略:上手操作Kubernetes授权的相关文章

webBrowser中操作网页元素全攻略

webBrowser中操作网页元素全攻略 2012-12-20 14:21 188人阅读 评论(0) 收藏 举报 1.获取非input控件的值: webBrowser1.Document.All["控件ID"].InnerText; 或webBrowser1.Document.GetElementById("控件ID").InnerText; 或webBrowser1.Document.GetElementById("控件ID").GetAttr

.Net常用技巧_VS2005[C#] 操作 Excel 全攻略(转)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; using System.Data.SqlClient; using System.Data.

javascript 操作 excel 全攻略

最近做一个项目,用到了javascript操纵excel以生成报表,下面是标有详细注解的实例 <html> <head><script language="javascript" type="text/javascript"> </script><script language="javascript" type="text/javascript">function

独孤九篇之运维进阶:文件共享服务全攻略完结篇

一.了解一下 1.NFS NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样. 好处: 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用.用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上

Docker全攻略完全解析电子版pdf下载

Docker全攻略完全解析 链接:https://pan.baidu.com/s/1_ltvH7-jqbranqQ5TnH46w 提取码:z0qt Docker全攻略完整电子书分享,有需要的朋友们可以收下,(#.#)! 作品目录 前言 第一篇 Docker简介 第1章 Docker的前世今生 1.1 什么是LXC 1.2 Docker为什么选择了AUFS 1.3 Docker是如何产生的 第2章 Docker现状 2.1 Docker应用范围 2.2 Docker的优缺点 1.Docker资源利

拿nodejs快速搭建简单Oauth认证和restful API server攻略

拿nodejs快速搭建简单Oauth认证和restful API server攻略:http://blog.csdn.net/zhaoweitco/article/details/21708955 最近一直在鼓捣这个东西,拿出来分享下一下经验吧,其实很简单,一点也不难. 首先需求是这样,给自己的网站要增加API服务,API分为两种,公共的和私有授权的,授权的使用Oauth方法认证身份,API格式均为JOSN和JSONP. 嗯,别的语言我也没怎么学过,首先是找合适的框架进行实现吧.本身网站使用的e

Tomcat全攻略

tomcat全攻略 1.tomcat是什么? Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,它早期的名称为catalina,后来由Apache.Sun 和其他一些公司及个人共同开发而成,并更名为Tomcat.Tomcat是应用(java)服务器,它是一个servlet容器,是Apache的扩展,但它是独立运行的.tomat应用于Java Servlet, JavaServer Pages,Java Expression Language以及其他的Javaweb开发的技术. Th

Linux(CentOS)搭建SVN服务器全攻略

虽然在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,所以今天这篇文章就来一步一步教您如何在Centos上搭建SVN 安装#yum install subversion 1)创建svn用户#groupadd svn#useradd -g sky user//是将user加入到sky組內切换用户#su svn以后代码库的创建维护等,都用这个帐户来操作. 2)创建版本库编辑.bash_profile 加上如下配置SVN_HOME=

从小工到专家 ——读《Java程序员职场全攻略》有感

从小工到专家 ——读<Java程序员职场全攻略>有感   <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一位业界高人,而书中的主人公蔡佳佳则是一名计算机专业的大三学生,作为师兄的牛开复一步一步指引蔡佳佳从学校走入职场,开始他的职业生涯.书中多采用二人对话的形式,谈到了职场中可能会遇到的各种问题,语言形式也非常轻松活泼,生动有趣,通俗易懂. 初窥门径——行业揭秘 相信很多同学都急切的想了解IT这个行业在国内的现状以