【Kubernetes】服务账号 Service Account

news2024/11/15 19:34:33

K8s 的安全认证》系列,共包含以下文章:

  • K8s 的安全框架和用户认证
  • K8s 的鉴权管理(一):基于角色的访问控制(RBAC 鉴权)
  • K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制
  • 服务账号 Service Account

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

服务账号 Service Account

  • 1.服务账号与用户账号
  • 2.【实战】创建和使用服务账号
    • 2.1 创建命名空间
    • 2.2 创建 Pod
    • 2.3 创建 Service Account
    • 2.4 使用 RoleBinding 将 Service Account 与 Role 进行绑定
    • 2.5 使用 ClusterRoleBinding 将 ServiceAccount 与 ClusterRole 进行绑定
  • 3.服务账号的工作机制

服务账号Service Account)是为了方便 Pod 中的进程调用 Kubernetes API 资源或访问其他外部服务而设计的。

1.服务账号与用户账号

服务账号Service Account)和 用户账号User Account)有着以下的不同:

  • 服务账号 是为 Pod 而设计的,目的是让 Pod 中的进程能够访问 Kubernetes APl 的资源;用户账号 是为用户而设计的,目的是让用户能够访问 Kubernetes 集群。
  • 服务账号 仅作用在当前的命名空间中;用户账号 是全局性的,可以跨越不同的命名空间。
  • 服务账号 的创建应遵循权限最小化的原则,Kubernetes 允许为实现某个具体任务而创建服务账号;而创建 用户账号 通常需要使用外部的数据库,且可能需要组合不同的权限。
  • 服务账号 属于轻量级配置,只作用在当前命名空间中,因此,在一个复杂系统中可能包含各种服务账号的定义;用户账号 的创建规则比较复杂,且可能涉及复杂的业务流程。由于服务账号和用户账号的使用对象不同,因此对二者的监控也不同。

2.【实战】创建和使用服务账号

下面来演示如何创建和使用服务账号。

2.1 创建命名空间

创建一个新的命名空间 sa-demo

kubectl create namespace sa-demo

查看新命名空间中的 Service Account。

kubectl get sa -n sa-demo

输出的信息如下:

在这里插入图片描述

🚀 对于每一个命名空间会自动创建一个默认的 Service Account。

2.2 创建 Pod

编辑 pod-sa-demo1.yaml 文件在新创建的命名空间中新建一个 Pod。

kind: Pod
apiVersion: v1
metadata:
  name: pod-sa-demo1
  namespace: sa-demo
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
     - containerPort: 80
       name: http

创建 Pod,并查看 Pod 的信息。

kubectl apply -f pod-sa-demo1.yaml
kubectl get pod pod-sa-demo1 -o yaml -n sa-demo

输出的信息如下:

在这里插入图片描述

🚀 可以看出,对于每一个新创建的 Pod 来说,如果没有指定 Service Account,则它会自动挂载默认的 Service Acount,即其值为 default

2.3 创建 Service Account

sa-demo 命名空间中创建一个名称为 mysa 的 Service Account,并查看当前命名空间中存在的 Service Account。

kubectl create serviceaccount mysa -n sa-demo
kubectl get sa -n sa-demo

输出的信息如下:

在这里插入图片描述

查看新创建的 Service Account。

kubectl get serviceaccount mysa -n sa-demo -o yaml

在这里插入图片描述

🚀 在 Service Account 创建成功后,可以使用 RoleBinding 将 Service Account 与 Role 进行绑定,使用 ClusterRoleBinding 将 ServiceAccount 与 ClusterRole 进行绑定。

在这里插入图片描述

2.4 使用 RoleBinding 将 Service Account 与 Role 进行绑定

编辑 sa-demo-role.yaml 文件创建 Role。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  #限定可访问的命名空间为sa-demo
  namespace: sa-demo
  #角色名称
  name: sa-demo-role
rules:
  #空字符串表示使用core API group
- apiGroups: [""]
  resources: ["namespaces","pods","pods/log"]
  verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]
- apiGroups: [ "apps"]
  resources: ["deployments", "daemonsets"]
  verbs: ["get", "list", "watch"]

编辑 sa-demo-rolebinding.yaml 文件创建 RoleBinding。

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: sa-demo
  name: sa-demo-rolebinding
subjects:
- kind: ServiceAccount
  namespace: sa-demo
  # Service Account的名称
  name: mysa
roleRef:
  kind: Role
  # 角色名称
  name: sa-demo-role
  apiGroup: rbac.authorization.k8s.io

🚀 这里将命名空间 sa-demo 中名为 mysa 的 Service Account 绑定到 sa-demo-role 角色上了。

创建 Role 和 RoleBinding。

kubectl apply -f sa-demo-role.yaml
kubectl apply -f sa-demo-rolebinding.yaml

查看 sa-demo 命名空间中的 Role 和 RoleBinding。

kubectl get role,rolebinding -n sa-demo -o wide

输出的信息如下:

在这里插入图片描述

🚀 从输出信息可以看出,命名空间中的 mysa 服务账号通过 sa-demo-rolebinding 绑定到 sa-demo-role 了。

2.5 使用 ClusterRoleBinding 将 ServiceAccount 与 ClusterRole 进行绑定

编辑 sa-demo-clusterrole.yaml 文件创建 ClusterRole。

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # 由于ClusterRole针对的是集群范围对象,因此不需要定义namespace字段
  name: sa-demo-clusterrole
rules:
  # 空字符串""表明使用core API group
- apiGroups: ["rbac.authorization.k8s.io",""]
  resources: ["pods","pods/log"]
  verbs: ["get", "watch", "list"]
- apiGroups: ["apps"]
  resources: ["namespaces"]
  verbs: ["get", "list", "watch"]

编辑 sa-demo-clusterrolebinding.yaml 文件创建 ClusterRoleBinding。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: sa-demo-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: sa-demo-clusterrole
subjects:
- apiGroup: ""
  kind: ServiceAccount
  namespace: sa-demo
  name: mysa

创建 ClusterRole 和 ClusterRoleBinding。

kubectl apply -f sa-demo-clusterrole.yaml
kubectl apply -f sa-demo-clusterrolebinding.yaml

🚀 这里将命名空间 sa-demo 中名为 mysa 的 Servicc Account 绑定到 sa-demo-clusterrole 角色上了。

查看 ClusterRole 的信息。

kubectl get clusterrole

输出的信息如下:

在这里插入图片描述

查看 ClusterRoleBinding 的信息。

kubectl describe clusterrolebinding sa-demo-clusterrolebinding

在这里插入图片描述

另外一种查询方法:

kubectl get clusterrolebinding -o \
custom-columns=NAME:.metadata.name,ROLE:.roleRef.name,SERVICEACCOUNT:.subjects[0].name | grep sa-demo

在这里插入图片描述

3.服务账号的工作机制

Kubernetes 的 APl Service 默认开启了 Service Account 的准入控制功能。因此,在创建 Service Account 后,服务账号将按照以下方式运行。

🚀 如果 API Server 没有启用 Service Account 的准入控制功能,则可以在启动 API Server 时加入以下参数:--admission_control-ServiceAccount

  • 1️⃣ 在 Pod 创建时,通过 spec.serviceAccount 字段挂载指定的 Service Account。如果没有指定该字段,则挂载命名空间中的默认 Service Account,即 default 的 Service Account。
  • 2️⃣ API Server 验证挂载的 Service Account 是否存在。如果存在,则创建 Pod;否则拒绝创建 Pod。
  • 3️⃣ 如果在 Pod 中没有指定 ImagePullSecrets,则把 Service Account 中的 ImagePullSecrets 字段加载到 Pod 中。

🚀 在拉取私有镜像仓库中的镜像时,往往需要先进行用户认证。ImagePullSecrets 字段用于指定拉取镜像时用户的 Secret 信息。

  • 4️⃣ 在 Pod 创建成功并启动容器后,会将 Service Account 的 Token 挂载到 /var/run/secrets/kubernetes.io/serviceaccount/ 目录下。

🚀 可以通过 kubectl describe pod 命令查看到挂载的信息。

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

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

相关文章

Mac导入iPhone的照片怎么删除?快速方法讲解

随着Apple生态系统的高度整合,Mac与iPhone之间的照片同步和导入变得异常便捷。但这种便利有时也会带来一些管理上的困扰,比如Mac导入iPhone的照片怎么删除? 从iPhone直接删除照片 Mac导入iPhone的照片怎么删除?如果你的照片是通…

思维商业篇(1)—如何判断商业效率

思维商业篇(1)—如何判断商业效率 我们评价一个公司,很大程度上其实就是看其商业效率高不高以及规模大不大。 规模是一个企业的大小,效率是一个企业的节奏。 一个小企业如果效率很高,在未来就会有很多的机会。只要其所在行业在&#xff0c…

深入理解Python中的魔法参数 *args 和 **kwargs

在Python编程中,函数的灵活性是其强大之处之一。其中,*args 和 **kwargs 是实现函数参数可变性的重要工具。 无论我们是Python初学者还是经验丰富的开发者,充分理解这两个概念都有助于编写更加灵活、高效的代码。 本文将深入探讨*args和**kw…

【JavaScript】数据结构之树

什么是树形结构? 一种分层数据的抽象模型,用来分层级关系的。虚拟dom它所组织的那个数据原理就是树形结构 深度优先搜索(遍历)- 递归 从根出发,尽可能深的搜索树的节点技巧 访问根节点对根节点的children挨个进行深…

三、(JS)JS中常见的表单事件

一、onfocus、onblur事件 这个很容易理解&#xff0c;就不解释啦。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

【JS|第27期】网页文件传输:Blob与Base64的对决

日期&#xff1a;2024年9月12日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【SQL】百题计划:SQL最基本的判断和查询。

[SQL]百题计划 Select product_id from Products where low_fats "Y" and recyclable "Y";

java重点学习-JVM组成

十二 JVM 12.1 JVM运行原理 Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 12.2 什么是程序计数器? 程序计数器:线程私有的&#xff08;不存在线程安全问题&#xff09;&…

美团图床设置教程

大厂图床&#xff0c;CDN加速 项目地址&#xff1a;https://github.com/woniu336/mt-img 使用方法 在mt.php填上你的token即可&#xff0c;然后打开index.html上传图片 获取token方法 注册https://czz.meituan.com/发布视频&#xff0c;上传封面&#xff0c;注意在上传封面后…

java项目之企业级工位管理系统源码(springboot)

项目简介 企业级工位管理系统实现了以下功能&#xff1a; 企业级工位管理系统的主要使用者管理员功能有个人中心&#xff0c;部门信息管理&#xff0c;工位信息管理&#xff0c;使用情况管理&#xff0c;工位分配管理。员工可以查看个人中心&#xff0c;部门信息&#xff0c;…

linux第二课(docker的安装使用)

目录 一.关于docker (1)背景引入 (2)docker介绍 (3)功能 (4)Docker架构 二.docker的安装及相关的命令 (1)docker的安装 (2)docker的配置 (3)docker镜像命令 (4)容器命令 三.docker安装myaql ​编辑 四.数据卷挂载 1.数据卷挂载引入 2.数据卷挂载图解 3.数据卷的安装…

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP服务端】

一、操作环境 服务端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;服务端包链接&#xff1a;https://download.csdn.net/download/AirIT/89747026&#xff09; 客户端&#xff1a;银河麒麟桌面操作系统V10SP1 &#xff08;客户端包链接&#xff1a;https://downloa…

List<Map<String, Object>>汇总统计排序

开发环境&#xff1a;jdk 1.8 需求一&#xff1a; 1、统计每个小时(升序)不同事件的产品产量 2、统计不同事件&#xff08;OK 、NG&#xff09;的总产量 public static void main(String[] args) {//数据源List<Map<String, Object>> list new ArrayList<Map…

微信小程序开发第三课

1 wxml语法 1.1 模版语法 # 1 在页面 xx.js 的 Page() 方法的 data 对象中进行声明定义 # 2 在xx.wxml 中使用 {{}} 包裹&#xff0c;显示数据 # 3 可以显示如下&#xff0c;不能编写js语句或js方法-变量-算数运算-三元运算-逻辑判断# 4 只是单纯通过赋值&#xff0c;js中…

[Python学习日记-22] Python 中的字符编码(下)

[Python学习日记-22] Python 中的字符编码&#xff08;下&#xff09; 简介 编码的战国时代 Unicode 和 UTF 现代计算机系统通用的字符编码工作方式 简介 在[Python学习日记-21] Python 中的字符编码&#xff08;上&#xff09;中我们讲了字符编码中的 ASCII 码和 GB2312/G…

算法刷题:300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143. 最长公共子序列

300. 最长递增子序列 1.dp定义&#xff1a;dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 2.递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 注意这里不是要dp[i] 与 dp[j] 1进行比较&#xff0c;而是我们要取dp[j] 1的最大值…

【前端】ref引用的作用

首先&#xff0c;我们要明确一点&#xff0c;使用vue的好处是&#xff1a; 想要减少开发者直接操作dom元素。使用组件模版&#xff0c;实现代码的服用。 ref的属性的实现是为了取代原生js中使用id、class等标识来获取dom元素。 helloworld组件 <template><div clas…

memset函数的使用

目录 1.头文件 2.memset函数讲解 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.头文件 memset函数的使用需要包括头文件 #include<string.h> 2.memset函数讲解 简述…

Java--图书管理系统(新版详细讲解)

前言&#xff1a; 对于初学者&#xff0c;自己写一个图书管理系统&#xff0c;会有效提高自己的代码能力&#xff0c;加深对Java中面向对象的理解&#xff0c;里面蕴含了Java中的类、接口、继承、多态等思想&#xff0c;接下来我们一起完成这一份"伟大的作品!" 注&am…

【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(一)

文章目录 一、项目背景介绍1、什么是帝可得&#xff1f;2、物联网3、售货机术语4、角色与功能5、业务流程&#xff08;1&#xff09;平台管理员&#xff08;2&#xff09;运维人员&#xff08;3&#xff09;运营人员&#xff08;4&#xff09;消费者 6、产品原型7、库表设计 二…