kubernetes为何需要默认的serviceaccount?

news2024/11/17 21:19:16

文章目录

    • 什么是k8s的serviceAccount?
    • 为什么每一个ns下都有默认的sa?
      • default sa yaml
    • 默认的sa下都会挂一个secret,这个secret是从哪里来的?
    • 一道关于RBAC的CKA考题
      • 1、创建一个新的 ServiceAccount
      • 2、创建一个新的 Role
      • 3、创建一个新的 RoleBinding
      • 4、在 Pod 中使用 ServiceAccount
    • role和rolebinding的核心
    • 练习一
    • 练习二

什么是k8s的serviceAccount?

在 Kubernetes 中,ServiceAccount 是一种用于身份验证和授权的对象。它为 Pod 提供了一种身份,以便它们可以与 Kubernetes API 交互,并且可以通过 Role 和 RoleBinding 为它们分配特定的权限。

ServiceAccount 是 Kubernetes 中的一种重要概念,它的实际使用场景包括:

  • 访问 Kubernetes API:ServiceAccount 为 Pod 提供了访问 Kubernetes API 的凭据,使得它们可以查询和修改 Kubernetes 中的资源。例如,一个 Pod 可以使用 ServiceAccount 访问 Kubernetes API 获取其他 Pod 的信息,或者创建、更新、删除其他资源。

  • 认证和授权:ServiceAccount 为 Pod 提供了一种身份,使得 Kubernetes 可以对其进行认证和授权。例如,Kubernetes 可以使用 ServiceAccount 来验证 Pod 是否有权限访问某个资源,并根据 Role 和 RoleBinding 为其分配特定的权限。

  • 安全性:ServiceAccount 可以帮助提高 Kubernetes 集群的安全性。通过为每个 Pod 分配一个独立的 ServiceAccount,并为其分配最小特权的权限,可以降低潜在的安全风险。

  • 多租户:ServiceAccount 可以帮助实现 Kubernetes 中的多租户。通过为每个 Namespace 创建一个独立的 ServiceAccount,并为其分配特定的权限,可以实现不同 Namespace 之间的隔离和安全性。

为什么每一个ns下都有默认的sa?

在 Kubernetes 中,每个 namespace 下都有一个默认的 ServiceAccount,原因如下:

简化配置:默认的 ServiceAccount 使得用户无需为每个 Pod 创建一个新的 ServiceAccount,从而简化了配置。如果 Pod 没有指定 ServiceAccount,它将自动关联到默认的 ServiceAccount。

容器运行时身份:ServiceAccount 提供了一种将身份信息(如 API 访问凭据)与 Pod 关联的方法。默认的 ServiceAccount 为 Pod 提供了基本的身份信息,以便它们可以与 Kubernetes API 交互。

安全性:默认的 ServiceAccount 通常具有较少的权限,这有助于遵循最小特权原则。这意味着,如果 Pod 不需要访问 Kubernetes API 的特定资源,它可以使用默认的 ServiceAccount,从而降低潜在的安全风险。

易于管理:默认的 ServiceAccount 使得集群管理员可以更轻松地管理和控制对 Kubernetes API 的访问。例如,管理员可以通过修改默认 ServiceAccount 的权限来限制或扩展某个 namespace 下所有 Pod 的访问权限。

总之,默认的 ServiceAccount 是 Kubernetes 中的一种设计,旨在简化配置、提供基本的身份信息、增强安全性并便于管理。然而,在实际应用中,根据需要创建特定的 ServiceAccount 并为其分配适当的权限是一种更好的做法。

default sa yaml

k get secret default-token-lnzs9 -oyaml
apiVersion: v1
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR2akNDQXFhZ0F3SUJBZ0lVVFZZeWZ0VDFBdnQ1ZHlORmM4WUN...
  HU4NkZ0bTNyRkNaNUY3N1FmTVpCNU9hYXE2TkRDRwp3ems9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
  namespace: ZGVmYXVsdA==
  token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNkltcEdjRkkwWlRSRU55MW1NeTF4YWt0U1pYQm9Sems0U1dJd2RHMTV
。。。
  xQUJsdVlnSGJva3ZB
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: default
    kubernetes.io/service-account.uid: b90818be-0587-4a7a-8abb-c0b214cdaba0
  creationTimestamp: "2022-06-26T07:04:38Z"
  name: default-token-lnzs9
  namespace: default
  resourceVersion: "11436"
  uid: 37c38aaa-bd9d-4beb-abf9-cdc94bcc697a
type: kubernetes.io/service-account-token

默认的sa下都会挂一个secret,这个secret是从哪里来的?

在 Kubernetes 中创建一个新的 Namespace 时,系统会自动为该 Namespace 下的默认 ServiceAccount 创建一个关联的 Secret。这个 Secret 是用于存储访问 Kubernetes API 的凭据的,通常包含一个 token 和一个 CA 证书。这个 Secret 的来源如下:

Kubernetes 控制平面的 Token Controller 自动创建并管理这个 Secret。当创建一个新的 ServiceAccount 时,Token Controller 会生成一个新的 token,并将其存储在一个新的 Secret 中。

该 Secret 会被自动关联到对应的 ServiceAccount。Secret 的类型为 kubernetes.io/service-account-token,并且在 Secret 的 annotations 字段中包含了关联的 ServiceAccount 信息。

当创建一个使用该 ServiceAccount 的 Pod 时,Kubernetes 会自动将这个 Secret 挂载到 Pod 的容器中。默认情况下,Secret 会被挂载到 /var/run/secrets/kubernetes.io/serviceaccount 目录下。容器内的应用程序可以使用这个 token 和 CA 证书与 Kubernetes API 交互。

要查看默认 ServiceAccount 关联的 Secret,可以使用以下命令:

kubectl get serviceaccounts default -o jsonpath='{.secrets[0``].name}' -n <namespace>

将 替换为实际的 Namespace 名称。然后,使用以下命令查看 Secret 的详细信息:

kubectl get secret <secret_name> -o yaml -n <namespace>

将 <secret_name> 替换为上一步获取到的 Secret 名称,将 替换为实际的 Namespace 名称。

一道关于RBAC的CKA考题

假设我们有一个运行在 Kubernetes 中的 Web 应用程序,它需要访问 Kubernetes API 来获取其他 Pod 的信息。

为了实现这个功能,我们可以创建一个 ServiceAccount,并为其分配访问 Kubernetes API 的权限。具体步骤如下:

1、创建一个新的 ServiceAccount

kubectl create serviceaccount myapp-sa

2、创建一个新的 Role

用于授予 ServiceAccount 访问 Kubernetes API 的权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: myapp-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"] # 注意只有get和list的权限,并不需要update的权限

3、创建一个新的 RoleBinding

将 ServiceAccount 和 Role 关联起来:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: myapp-rolebinding
subjects:
- kind: ServiceAccount
  name: myapp-sa
roleRef:
  kind: Role
  name: myapp-role
  apiGroup: rbac.authorization.k8s.io

4、在 Pod 中使用 ServiceAccount

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  serviceAccountName: myapp-sa
  containers:
  - name: myapp-container
    image: myapp-image

在这个例子中,我们创建了一个名为 myapp-sa 的 ServiceAccount,并为其分配了访问 Kubernetes API 的权限。然后,我们创建了一个名为 myapp-role 的 Role,并将其与 ServiceAccount 关联起来。最后,我们在 Pod 中使用了这个 ServiceAccount。

这样,我们的 Web 应用程序就可以使用这个 ServiceAccount 访问 Kubernetes API,获取其他 Pod 的信息。同时,由于我们为 ServiceAccount 分配了最小特权的权限,可以降低潜在的安全风险。

role和rolebinding的核心

role是定义一组权限列表

rolebinding有两个obj:

  • roleRef : 绑定哪个role?
  • subjects: 给谁绑定的问题 可以是user、可以是sa也可以是group

如果遇到不懂怎么写就是explain。
在这里插入图片描述

练习一

只能使用官网的情况下,完成下面和这个需求:

Create a new ServiceAccount processor in Namespace project-hamster. Create a Role and RoleBinding, both named processor as well. These should allow the new SA to only create Secrets and ConfigMaps in that Namespace.

提示; 可以使用kubectl 命令create role、create rolebinding

练习二

让alice这个用户可以创建sa:

创建一个新的 Role,用于控制 ServiceAccount 的创建:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: serviceaccount-creator
rules:
- apiGroups: [""]
  resources: ["serviceaccounts"]
  verbs: ["create"]

创建一个新的 RoleBinding,将 Role 和用户或组关联起来:


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: serviceaccount-creator-binding
subjects:
- kind: User
  name: alice
roleRef:
  kind: Role
  name: serviceaccount-creator
  apiGroup: rbac.authorization.k8s.io

在这个例子中,我们创建了一个名为 serviceaccount-creator 的 Role,用于控制 ServiceAccount 的创建。然后,我们创建了一个名为 serviceaccount-creator-binding 的 RoleBinding,将 Role 和用户 alice 关联起来。

这样,用户 alice 就可以使用 kubectl create serviceaccount 命令创建新的 ServiceAccount。其他用户或组如果没有被授权,将无法创建新的 ServiceAccount。

需要注意的是,RBAC 可以用于控制 ServiceAccount 的创建和使用,但不能直接控制 ServiceAccount 的访问权限。要为 ServiceAccount 分配访问权限,需要使用 Role 和 RoleBinding。

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

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

相关文章

ChatGPT测试-吴彦祖帅不帅

GPT3.5 我是一个xxx职业&#xff0c;女性&#xff0c;平常喜欢xxxx&#xff0c;喜欢类似 xxx&#xff0c;肖战&#xff0c;王一博&#xff0c;一类的男明星&#xff0c;对于我这种女生来说的话&#xff0c;这种审美方向&#xff0c;吴彦祖帅不帅&#xff0c;请给我具体回答&…

免费ChatGPT接入网站-网站加入CHATGPT自动生成关键词文章排名

网站怎么接入chatGPT 要将ChatGPT集成到您的网站中&#xff0c;需要进行以下步骤&#xff1a; 注册一个OpenAI账户&#xff1a;访问OpenAI网站并创建一个账户。这将提供访问API密钥所需的身份验证凭据。 获取API密钥&#xff1a;在您的OpenAI控制台中&#xff0c;您可以找到您…

国赛超强自学素材!飞桨系列国赛课程集锦发布

自2023年3月以来&#xff0c;飞桨在“中国软件杯”大学生软件设计大赛和全国大学生智能汽车竞赛两大赛事中&#xff0c;陆续发布了六项赛题。我们整理了一份当前阶段的竞赛培训课程合集&#xff0c;为同学们的学习和备赛保驾护航&#xff01;出发的号角已然吹响&#xff0c;欢迎…

AODV路由算法在无线传感器网络中的设计与仿真(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 此代码用于MATLAB GUI&#xff0c;其中为WSN实现了AODV路由协议。源节点每次都会随着数据包的数量而变化。GUI的快照已附加。它…

Qt5下Qxlsx模块安装及使用

Qt5下Qxlsx模块安装及使用 1. 未安装Qxlsx的程序效果2. 安装Perl&#xff08;编译Qxlsx源码用&#xff09;2.1 下载 ActivePerl 5.282.2 安装 ActivePerl 5.28 3. 下载并编译Qxlsx源码3.1 下载Qxlsx源码3.2 编译Qxlsx源码 4. 将编译好的文件复制到Qt路径下4.1 bin 路径文件复制…

git报错处理:ssh:connect to host github.com port 22: Connection timed out

一、背景 git 在上传、下载 文件的时候&#xff0c;报错。 报错信息&#xff1a; ssh:connect to host github.com port 22: Connection timed out 提示这个域名github.com port 的22 端口&#xff0c;链接超时。 我直接访问github.com 这个域名是可以访问的&#xff0c;pi…

python+vue 风俗文化管理系统

管理员可以根据系统给定的账号进行登录&#xff0c;登录后可以进入风俗文化管理系统对风俗文化管理所有模块进行管理。包括查看和修改自己的个人信息以及登录密码&#xff0c;用户信息等。 用户通过注册账号的登录可以在系统中查看风俗文化管理信息及对个人信息进行修改等功能。…

华为OD机试(JAVA)真题 2023(汽水瓶\随机数\进制转换)

系列文章目录 文章目录 系列文章目录前言一、 1.汽水瓶二 明明的随机数 前言 一、 1.汽水瓶 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水&#xff0c;允许向老板借空汽水瓶&#xff08;但是必须要归还&#xff09;。 小张手上有n个空汽水瓶&#xff0c;她想知道自己最多…

git版本本地远程分支管理测试

只为搞清楚一些基本的git的本地提交、分支&#xff0c;远程分支的概念。 创建git库。 在本地首次建立一个001文件&#xff0c;首次提交到本地master&#xff0c;不提交&#xff08;push&#xff09;到远程master&#xff08;gitee&#xff09;。 add 增加001文件到库。 Git-co…

【UML建模】状态图(State Machine Diagram)

文章目录 1.概述2. 状态图的使用2.1.状态图中的元素2.2.状态图的使用案例2.3.组合状态及其使用案例 3.总结 1.概述 状态图&#xff0c;又称为状态机图&#xff0c;是一种用于描述对象的生命周期和状态转换的UML图示&#xff0c;它是一种行为图&#xff0c;用于描述对象的状态和…

Django 4.2发布,主要变化小结!

2023年4月&#xff0c;Django 4.2正式发布&#xff0c;此版本已被指定为长期支持 (LTS) 版本&#xff0c;发布3年后都会收到安全更新&#xff0c;将成为未来3年的主流版本。今天就来一起看看新版本有哪些变化吧&#xff1f; Python 兼容性 Django 4.2 支持 Python 3.8、3.9、3.…

Golang Gin 局部、全局 中间件使用

中间件 中间件是放在客户端和服务端的中间。 当你的客户端对某个接口发起一个请求&#xff0c;但是在到达接口2之前&#xff0c;这里是有一层中间件的处理。 一般常用的就是处理跨域&#xff0c;比如处理登入的验证token&#xff0c;接口返回的信息比较敏感&#xff0c;说白…

Sample语言上下文无关文法

<表达式>: <表达式>-<算术表达式>|<关系表达式>|<布尔表达式>|<赋值表达式> <算术表达式> <算术表达式> -> <算术表达式> <项> | <算术表达式> - <项>|<项> <项> -> <项>* …

为什么企业要做大规模敏捷?

背景 软件工程里一个重要的指标就是“可用的软件”&#xff0c;敏捷宣言里也同样告诉我们“工作的软件高于详尽的文档”&#xff0c;那“可用的软件”、“工作的软件”意味着什么呢&#xff1f;在我的理解里&#xff0c;可以经历用户 “千锤百炼”的软件就是一个“可用的软件”…

Linux 共享库 静态库 动态库

一、 静态库(后缀.a)&#xff1a;程序执行前&#xff08;编译&#xff09;就加入到目标程序中去了 优点&#xff1a;运行速度快&#xff0c;发布程序无需提供静态库&#xff0c;因为已经在编译到目标程序中&#xff0c;运行的时候可以直接运行&#xff0c;移植方便 缺点&…

【Java】Eclipse的安装和JDK的安装与配置教程

Java是能够跨越多平台的、可移植性高的一种面向对象的编程语言&#xff0c;其简单易学、功能强大&#xff0c;越来越多的程序员喜欢加入Java的阵营之中。 一、前言 Java具有以下功能特点&#xff1a; 跨平台性&#xff1a;Java程序可以在任何支持Java虚拟机&#xff08;JVM&am…

C. Increasing by Modulo(贪心 + 二分)

Problem - C - Codeforces Toad Zitz有一个整数数组&#xff0c;每个整数都在0到m-1的范围内。这些整数是a1,a2...an。 在一次操作中,,iz可以选择一个整数k和k个萦引1..k&#xff0c;使得1si i2. ..fiksn。然后他应该将每个选定的整数a刘j 更改为(aj 1lmodm)。整数m对于所有操作…

初识STL

长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西&#xff0c;以及一种得以制造出”可重复运用的东西”的方法&#xff0c;从函数(functions)&#xff0c;类别(classes),函数库(function libraries),类别库(class libraries)、各种组件&#xff0c;从模块化设计&am…

(C语言版)力扣(LeetCode)27.移除元素三种解法分析

移除元素 题目第一种解法&#xff1a;有效值前移第二种解法&#xff1a;双指针第三种解法&#xff1a;双指针优化结语 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空…

【C++】vector OJ练习

文章目录 1. 只出现一次的数字思路讲解AC代码 2. 杨辉三角思路讲解AC代码 3. 只出现一次的数字 III思路讲解AC代码 4. 只出现一次的数字 II思路讲解AC代码 5. 删除有序数组中的重复项思路讲解AC代码 6. 数组中出现次数超过一半的数字思路讲解AC代码 这篇文章我们来做几道vector…