当前位置: 首页 > news >正文

k8s学习-Service Account和RBAC授权

1.1 ServiceAccount 介绍

首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) 两种,它们的设计及用途如下:
UserAccount是给kubernetes集群外部用户使用的,例如运维或者集群管理人员,使用kubectl命令时用的就是UserAccount账户。
UserAccount是全局性,在集群所有namespaces中,名称具有唯一性,默认情况下用户为admin;
用户名称可以在kubeconfig中查看

[root@k8s-master ~]# cd ~/.kube/
[root@k8s-master .kube]# ls
cache  config  http-cache
[root@k8s-master .kube]# cat config
users:
- name: kubernetes-adminuser:

ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户;当你创建 pod 的时候,如果你没有指定一个 ServiceAccount,系统会自动的在与该 pod 相同的 namespace 下为其指派一个 default ServiceAccount。

1.2 Secret 与 SA(ServiceAccount) 的关系

Kubernetes设计了一种Secret资源,分为两类,一种是用于 ServiceAccount 的 kubernetes.io/ service-account-token,就是上边说的 SA,每创建一个SA,就会随之创建一个Secret;另一种就是用户自定义的保密信息Opaque。

1.3 默认的Service Account

ServiceAccount仅局限它所在的namespace,所以在创建namespace时会自动创建一个默认的 SA,而 SA 创建时,也会创建对应的 Secret,下面操作验证下:

[root@k8s-master ~]# kubectl create namespace spacex #创建名称空间
namespace/spacex created
[root@k8s-master ~]# kubectl get sa -n spacex #名称空间创建完成后会自动创建一个sa
NAME      SECRETS   AGE
default   1         19s
[root@k8s-master ~]# kubectl describe sa default -n spacex #查看sa描述
Name:                default
Namespace:           spacex
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   default-token-gpvrn
Tokens:              default-token-gpvrn
Events:              <none>
[root@k8s-master ~]# kubectl get secret -n spacex #同时也会自动创建一个secret
NAME                  TYPE                                  DATA   AGE
default-token-gpvrn   kubernetes.io/service-account-token   3      69s

在创建的名称空间中新建一个pod
vi sa-pods.yaml

apiVersion: v1
kind: Pod
metadata:name: test-sanamespace: spacex
spec:containers:- name: nginximage: ikubernetes/myapp:v1ports:- containerPort: 80name: www

查看 pod

[root@k8s-master ~]# kubectl create -f sa-pods.yaml
pod/test-sa created
[root@k8s-master ~]# kubectl get pod -n spacex
NAME      READY   STATUS    RESTARTS   AGE
test-sa   1/1     Running   0          112s

名称空间新建的pod如果不指定sa,会自动挂载当前名称空间中默认的sa(default)

[root@k8s-master ~]# kubectl describe pod test-sa -n spacex
Name:         test-sa
Namespace:    spacex
Priority:     0
Node:         k8s-node2/192.168.200.130
Start Time:   Mon, 05 Feb 2024 14:14:20 +0800
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.244.2.192
IPs:IP:  10.244.2.192
Containers:nginx:Container ID:   docker://2a35e0adf4127115fc1be32ba59800a03e81cfd0852253db9f4d5f3658b41d6bImage:          ikubernetes/myapp:v1Image ID:       docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513Port:           80/TCPHost Port:      0/TCPState:          RunningStarted:      Mon, 05 Feb 2024 14:14:20 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-gpvrn (ro)

1.4 自定义serviceaccount(以下简称sa)

创建一个sa 名称为admin

[root@k8s-master ~]# kubectl create  serviceaccount admin
serviceaccount/admin created
[root@k8s-master ~]# kubectl get sa
NAME                   SECRETS   AGE
admin                  1         9s
default                1         17d
kindly-robin-mychart   1         24h

查看名称为admin的sa的信息,系统会自动创建一个token信息

[root@k8s-master ~]# kubectl describe sa admin
Name:                admin
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   admin-token-79qdr
Tokens:              admin-token-79qdr
Events:              <none>

会自动创建一个secret(admin-token-rxtrc),用于当前sa连接至当前API server时使用的认证信息,1.24及之后因为安全原因不会自动再创建

[root@k8s-master ~]# kubectl get secret
NAME                               TYPE                                  DATA   AGE
admin-token-79qdr                  kubernetes.io/service-account-token   3      47s
default-token-pj9g7                kubernetes.io/service-account-token   3      17d
kindly-robin-mychart-token-54rjt   kubernetes.io/service-account-token   3      24h
mysecret                           Opaque                                2      3d21h
tomcat-ingress-secret              kubernetes.io/tls                     2      3h49m

创建一个pod应用刚刚创建的sa
vi deploy-sa.yaml

apiVersion: v1
kind: Pod
metadata:name: sa-demolabels:app: myapprelease: canary
spec:containers:- name: myappimage: ikubernetes/myapp:v2ports:- name: httpdcontainerPort: 80

pod会自动挂载自己sa的证书

[root@k8s-master ~]# kubectl create -f deploy-sa.yaml
pod/sa-demo created
[root@k8s-master ~]# kubectl describe pod sa-demo
Name:         sa-demo
Namespace:    default
Priority:     0
Node:         k8s-node1/192.168.200.129
Start Time:   Mon, 05 Feb 2024 14:25:44 +0800
Labels:       app=myapprelease=canary
Annotations:  <none>
Status:       Running
IP:           10.244.1.178
IPs:IP:  10.244.1.178
Containers:myapp:Container ID:   docker://05b13f4e4029037626f2e2407d3379ed6e0beb5ac02396ae9d1268f1778b89bbImage:          ikubernetes/myapp:v2Image ID:       docker-pullable://ikubernetes/myapp@sha256:85a2b81a62f09a414ea33b74fb8aa686ed9b168294b26b4c819df0be0712d358Port:           80/TCPHost Port:      0/TCPState:          RunningStarted:      Mon, 05 Feb 2024 14:25:44 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from admin-token-79qdr (ro)

1.5 RBAC

RBAC介绍
在Kubernetes中,所有资源对象都是通过API对象进行操作,他们保存在etcd里。而对etcd的操作我们需要通过访问 kube-apiserver 来实现,上面的Service Account其实就是APIServer的认证过程,而授权的机制是通过RBAC:基于角色的访问控制实现。

在 RBAC API 中,一个角色包含了一套表示一组权限的规则。权限以累加形式累积(没有”否定”的规则)。Role 是定义在一个 namespace 中,而 ClusterRole 是集群级别的。
Role and ClusterRole
一个 Role 对象只能用于授予对某一单一命名空间中资源的访问权限。以下示例描述了”default”命名空间中的一个 Role 对象的定义,用于授予对 pod 的读访问权限:
下面我们定义一个Role:

vim roles.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: test-rolenamespace: spacex
rules:
- apiGroups: [""]  # 为空表示为默认的core api groupresources: ["pods"] # 数据源类型verbs: ["get","watch","list"] #赋予的权限

ClusterRole 具有与 Role 相同权限角色控制能力,不同的就是 Cluster Role是集群级别,它可以用于:

集群级别的资源控制(例如 node 访问权限)
非资源型 endpoints(例如对某个目录或文件的访问:/healthz)
所有命名空间资源控制(Pod、Deployment等)
vim clusterroles.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: test-clusterrole
rules:
- apiGroups: [""]resources: ["services"]verbs: ["get","create","list"]

以上Cluster role策略表示,有get,create,list整个集群service的权限

下面开始创建

[root@k8s-master ~]# kubectl create -f roles.yaml
role.rbac.authorization.k8s.io/test-role created
[root@k8s-master ~]# kubectl create -f clusterroles.yaml
clusterrole.rbac.authorization.k8s.io/test-clusterrole created
[root@k8s-master ~]# kubectl get role -n spacex
NAME        CREATED AT
test-role   2024-02-05T07:05:01Z
[root@k8s-master ~]# kubectl get clusterrole -n spacex
NAME                                                                   CREATED AT
test-clusterrole                                                       2024-02-05T07:06:29Z

可以看到,role和cluster role都已经创建成功,但是clusterrole除了这次创建的还有许多,其中以system开头的全部是系统所用的,其他的都是在装一些插件时自动添加的,也要注意,我们自己创建cluster role时不要以system开通,以免分不清楚.
RoleBinding and ClusterRoleBinding
角色绑定将一个角色中定义的各种权限授予一个或者一组用户。角色绑定包含了一组相关主体(即 subject,包括用户 ——User、用户组 ——Group、或者服务账户 ——Service Account)以及对被授予角色的引用。在命名空间中可以通过 RoleBinding 对象授予权限,而集群范围的权限授予则通过 ClusterRoleBinding 对象完成。

创建RoleBinding
vim rolebindings.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: test-rolebindingnamespace: spacex
subjects:
- kind: User # 权限资源类型name: spacex # 权限名称apiGroup: rbac.authorization.k8s.io
roleRef:kind: Role #要绑定的Role的类型(可以是Role或ClusterRole)name: test-role # Role的名称apiGroup: rbac.authorization.k8s.io

此策略表示,将名称为test-role的Role的权限资源赋予名为spacex的用户,仅作用于spacex namespace。
创建ClusterRoleBinding
vi clusterrolebindings.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: test-clusterrolebinding
subjects:
- kind: Groupname: spacex apiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: test-clusterroleapiGroup: rbac.authorization.k8s.io

以上策略表示,将name为test-clusterrole的ClusterRole的资源权限赋予给groupname为spacex 的用户组,此用户组下所有用户拥有对整个集群的 test-clusterrole内的资源权限。

相关文章:

k8s学习-Service Account和RBAC授权

1.1 ServiceAccount 介绍 首先Kubernetes中账户区分为&#xff1a;User Accounts&#xff08;用户账户&#xff09; 和 Service Accounts&#xff08;服务账户&#xff09; 两种&#xff0c;它们的设计及用途如下&#xff1a; UserAccount是给kubernetes集群外部用户使用的&am…...

SpringMVC-响应数据

一、引子 我们在上一篇文章SpringMVC-组件解析里介绍了SpringMVC框架执行一个请求的过程&#xff0c;并演示了快速使用Controller承接请求。本篇我们将深入介绍SpringMVC执行请求时&#xff0c;如何响应客户端。 二、响应类型 SpringMVC的数据响应方式主要分为两类&#xff…...

数学建模:数据相关性分析(Pearson和 Spearman相关系数)含python实现

相关性分析是一种用于衡量两个或多个变量之间关系密切程度的方法。相关性分析通常用于探索变量之间的关系&#xff0c;以及预测一个变量如何随着另一个变量的变化而变化。在数学建模中&#xff0c;这是常用的数据分析手段。   相关性分析的结果通常用相关系数来表示&#xff…...

使用pandas将excel转成json格式

1.Excel数据 2.我们想要的JSON格式 {"0": {"raw_data1": "Sam","raw_data2": "Wong","raw_data3": "Good","layer": "12v1"},"1": {"raw_data1": "Lucy…...

双向链表的插入、删除、按位置增删改查、栈和队列区别、什么是内存泄漏

2024年2月4日 1.请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int datatype; enum{FALSE-1,SUCCSE}; typedef str…...

Linux 驱动开发基础知识——总线设备驱动模型(七)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…...

RTthread线程间通信(邮箱,消息队列,信号/软件中断)---03信号(软件中断)源码分析

信号 实际使用看这一个 #if defined(RT_USING_SIGNALS)rt_sigset_t sig_pending; /**< the pending signals 记录来了的信号 */rt_sigset_t sig_mask; /**< the mask bits of signal 记录屏蔽的信号 */rt_sigh…...

老版本labelme如何不保存imagedata

我的版本是3.16&#xff0c;默认英文且不带取消保存imagedata的选项。 最简单粗暴的方法就是在json文件保存时把传递过来的imagedata数据设定为None&#xff0c;方法如下&#xff1a; 找到labelme的源文件&#xff0c;例如&#xff1a;D:\conda\envs\deeplab\Lib\site-packages…...

vscode 如何修改c/c++格式化风格,大括号不换行

在Visual Studio Code&#xff08;VSCode&#xff09;中&#xff0c;若要修改C代码格式化的风格以实现大括号不换行&#xff0c;通常会借助于插件C/C扩展中的ClangFormat配置。以下是具体的步骤&#xff1a; 确保已安装了C/C扩展&#xff1a; 打开VSCode的扩展市场&#xff08;…...

IP协议(2) 和 数据链路层协议基础

IP协议续 1.路由选择 在复杂的网络结构中,我们需要找到一个通往终点的路线,这就是路由选择 举个例子:我们在没有手机导航之前,想去一个地方得是到一个地方问一下路的方式最终找到目的地 路由的过程,其实就是样子问路的过程 1.当IP数据包到达路由器的时候,会查看目的IP 2.路由器…...

Flink-1.18.1环境搭建

下载 下载flink安装包 Index of /dist/flink/flink-1.18.1 下载flink-cdc安装包 Release Release 3.0.0 ververica/flink-cdc-connectors GitHub 安装 添加环境变量 vi ~/.bash_profile export FLINK_HOME=/home/postgres/flink/flink-1.18.1 export PATH=$PATH:$FL…...

deepin20.9安装及配置

安装deepin20.9很简单&#xff0c;刻录u盘 安装 一路next apt install nginx global vim-nox debian11 使用apt安装php, 使php多版本共存_debain11 php5-CSDN博客 vim LeaderF安装问题 - 知乎 debian10安装vue环境, 包括安装node.js-CSDN博客 debian安装vue3 nodejs20-CSD…...

2-2 动手学深度学习v2-损失函数-笔记

损失函数&#xff0c;用来衡量预测值和真实值之间的区别。是机器学习里面一个非常重要的概念。 三个常用的损失函数 L2 loss、L1 loss、Huber’s Robust loss 均方损失 L2 Loss l ( y , y ′ ) 1 2 ( y − y ′ ) 2 l(y,y^{\prime})\frac{1}{2}(y-y^{\prime})^{2} l(y,y′)21…...

非springboot 使用aop 切面

在非Spring Boot应用中使用AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;的代码实现需要依赖Spring AOP库。由于Spring AOP库并不直接支持非Spring应用&#xff0c;你需要将Spring AOP库作为依赖项添加到项目中&#xff0c;并使用Spring AO…...

MongoDB 字段中数据类型不一致序列化异常排查与处理

MongoDB 字段中数据类型不一致序列化异常排查与处理 背景如下&#xff0c;因为项目迁移愿意&#xff0c;一个使用Mongodb的业务拥有C#和Java两组Api。Java Api开发和测试都很顺利。上线一段时间后&#xff0c;客服反馈记录都不见了。查看数据库发现&#xff0c;时间字段拥有两…...

网络安全简介

网络安全&#xff1a; ​ 网络安全攻击分为被动攻击和主动攻击。 1. 被动攻击&#xff1a;是指攻击者从网络上窃取了他人的通信内容&#xff0c;通常把这类的攻击称为截获&#xff0c;被动攻击只要有2种形式&#xff1a;消息内容泄漏攻击和流量分析攻击。由于攻击者没…...

【Docker】.NET Core 6.0 webapi 发布上传到Docker Desktop并启动运行访问,接口返回数据乱码解决方法

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…...

【Android Gradle 插件】自定义 Gradle 插件模块 ⑤ ( 完整总结 )

一、创建自定义插件类型模块 ( Java or Kotlin Library ) 选择 " 菜单栏 / New / New Module… " 选项 , 在 " Create New Module " 对话框中 , 选择 创建 " Java or Kotlin Library " 类型的依赖库 ; 二、手动导入相关依赖 ( Java | Groovy | …...

浅析现代计算机启动流程

文章目录 前言启动流程概述磁盘分区格式MBR磁盘GPT磁盘隐藏分区 传统BIOS引导传统BIOS启动流程 UEFI引导UEFI引导程序UEFI启动流程 引导加载程序启动操作系统相关参考 前言 现代计算机的启动是一个漫长的流程&#xff0c;这个流程中会涉及到各种硬件的配置与交互&#xff0c;包…...

七月论文审稿GPT第2.5和第3版:分别微调GPT3.5、Llama2 13B以扩大对GPT4的优势

前言 自去年7月份我带队成立大模型项目团队以来&#xff0c;我司至今已有5个项目组&#xff0c;其中 第一个项目组的AIGC模特生成系统已经上线在七月官网第二项目组的论文审稿GPT则将在今年3 4月份对外上线发布第三项目组的RAG知识库问答第1版则在春节之前已就绪至于第四、第…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

Python爬虫实战:研究Restkit库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...