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内的资源权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机二级考试C语言】C内存管理

C 内存管理 本章将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在 C 语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整…

测试用例流程设计

测试用例流程设计 简介 测试用例流程设计是指在进行软件测试时&#xff0c;对测试用例的整体规划和组织的过程。它涉及到制定一系列测试用例&#xff0c;以确保对软件系统的各个方面进行全面、系统和有效的测试。 现有测试用例的问题 可维护性不高 低模块化性&#xff1a;测…

re:从0开始的CSS学习之路 2. 选择器超长大合集

0. 写在前面 虽然现在还是不到25的青年人&#xff0c;有时仍会感到恐慌&#xff0c;害怕不定的未来&#xff0c;后悔失去的时间&#xff0c;但细细想来&#xff0c;只有自己才知道&#xff0c;再来一次也不会有太多的改变。 CSS的选择器五花八门&#xff0c;而且以后在JavaScr…

docker部署docker管理工具easydockerweb

重要提示 功能比较少,建议体验一下即可 安装 docker run -it -d -p 10041:3000 -e EDW_USERNAMEadmin -e EDW_PASSWORDadmin -v /var/run/docker.sock:/var/run/docker.sock qfdk/easydockerweb 使用 概览 镜像管理 容器管理

vue - 指令(一)

看文章可以得到什么&#xff1f; 1.可以快速的了解并会使用vue的指令 2.可以加深你对vue指令的理解&#xff0c;知道每个指令代表什么功能​​​​​​​ 目录 什么是vue的指令&#xff1f;​​​​​​​ vue常见指令的使用 v-html v-show v-if v-else 和v-else-…

java多线程实现(二)Java并发容器和框架

一、CouncurrentHashMap 二、ConcurrentLinkedQueue 三、java中的阻塞队列 jdk7提供了7个阻塞队列 四、Fork / Join框架

SpringBoot日志插件log4J和slf4J的使用和比较含完整示例

点击下载《SpringBoot日志插件log4J和slf4J的使用和比较含完整示例》 1. 前言 本文主要介绍了在 Spring Boot 框架中如何使用 Log4j 和 Slf4j&#xff0c;并通过对比分析它们的优缺点&#xff0c;帮助读者更好地选择合适的日志记录工具。文章中提供了完整的示例代码&#xff…

Spring Data Envers 数据审计实战

随着各行各业信息化发展&#xff0c;决策者们越来越意识到数据版本追踪的重要性&#xff0c;尤其是上市公司&#xff0c;数据对于他们尤为重要。考虑到研发成本&#xff0c;对重要表单数据支持页面级的修改历史查看、对所有业务数据支持DB级的版本查看是一个不错的选择。 对于…

有奖调查 | @所有人,MatrixOne 有一份问卷邀您填写~

MO社区系统调查问卷 活动时间&#xff1a;即日起至2月17日 前言 PREFACE 在“信创”国产化操作系统的号召下&#xff0c;随着 CentOS 7 的维护周期接近尾声&#xff0c;社区很多小伙伴都在积极调研新的操作系统进行测试和更换。为最大程度的保障 MatrixOne 在社区使用场景下…

设计模式学习笔记(一):基本概念;UML

文章目录 参考面向对象的设计原则创建型模式结构型模式行为型模式 UML视图图&#xff08;Diagram&#xff09;模型元素(Model Element)通用机制类之间的关系关联关系复杂&#xff01;&#xff01;聚合关系组合关系 依赖关系泛化关系接口与实现关系 参考 https://github.com/fa…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本&#xff0c;本教程使用的 release 版本为3.4.14&#xff0c;下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz&#xff0c;看到如下界…

c#cad 创建-圆(二)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是一个AutoCAD插件&#xff0c;用于在模型空间中创建一个圆形。 首先&#xff0c;我们需要定义一个命令类CreateCircleCommand&#xff0c;并在命名空间CreateCircleInCad中声明。 在CreateCircleCommand类中&a…

h5页面内嵌到app,解决ios无法使用左右侧滑返回上一页

背景&#xff1a;vuevant组合开发的h5页面&#xff0c;嵌入多个app,其中安卓手机都可实现侧滑返回上一页&#xff0c;而苹果端不行&#xff0c;app本身不展示title顶部的返回箭头。 解决办法&#xff1a;判断机型&#xff0c;处理ios端监听左右滑动事件&#xff0c;结合transit…

Java中的深拷贝和浅拷贝

在 Java 中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是两种不同的对象复制方式&#xff0c;它们在处理对象复制时的行为有所不同。 一、定义 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对象…

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析&#xff0c;包括分支管理&#xff0c;Git标签&#xff0c;在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交&#xff0c;git tag -d只能删除本地标签&#xff0c;Mac系统的终端可以…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…

flutter使用webview_flutter在安卓和ios上打开网页

webview_flutter仓库地址&#xff1a;webview_flutter | Flutter package github地址&#xff1a;https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter 要打开非https协议的网页&#xff0c;需要在安卓平台上添加权限&#xff1a;andro…

C++ [NOIP2007 提高组] 矩阵取数游戏

有一个n行m列的矩阵&#xff0c;每个格子中有一个正整数。现在要从左上角的格子(1, 1)出发&#xff0c;每次只能向下或向右走一格&#xff0c;最后到达右下角的格子(n, m)。在走过的格子中取数&#xff0c;求取得的数的和的最大值。 输入&#xff1a; 第一行包含两个整数n和m&a…

若依整合mybatis-plus

文章目录 1.注释掉原本的MybatisConfig2. 将mybatis的配置文件改为mybatis-plus文件 ##前言 出先下列异常&#xff1a; 请求地址’/prod-api/user’,发生未知异常. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ruoyi.web.mapper.Us…

HP数组面试题

PHP数组面试题 问题&#xff1a; 如何创建一个空数组和一个带有初始值的数组&#xff1f; 答案&#xff1a; 创建空数组&#xff1a;可以使用array()函数或空数组语法[]来创建一个空数组&#xff0c;例如$arr array();或$arr [];。创建带有初始值的数组&#xff1a;可以在创建…