首页 > 其他分享 >关于ServiceAccount以及在集群内访问K8S API

关于ServiceAccount以及在集群内访问K8S API

时间:2023-05-26 09:24:21浏览次数:50  
标签:default ServiceAccount API 集群 Pod K8S

写在开篇

在之前的两篇文章中提到,有4种方式使用 ConfigMap 配置 Pod 中的容器,关于之前的两篇可参考:

本篇的实战场景就以访问API的方式读取 ConfigMap,也就是编写代码在 Pod 中运行,然后使用 K8S API 来读取 ConfigMap的内容。但是,这个场景涉及到服务账号、K8S集群内身份验证的相关知识点。为了控制篇幅(主要是文章太长,担心没人看到最后),打算再拆分两篇。本篇尽力先把涉及到的知识点搞清楚,下一篇再真正进入实战环节,例如写代码,制作镜像等等。

其实,这个实战场景,也刚好弥补了在之前分享过的 下篇(开始写代码):运维开发人员不得不看的K8S API实战》 中缺少的 “集群内进行身份验证” 的内容。

在继续之前,如果对K8S API的使用套路还一无所知,可结合参考:

K8S的账号类型

在K8S中,主要有两种账号类型:

  1. User Accounts(用户账号):用户账号用于标识和验证 Kubernetes 集群的用户。用户账号通常由集群管理员创建,并与相应的身份验证凭据(如用户名和密码、令牌等)关联。用户账号用于进行集群管理操作,如创建、删除和更新资源,以及访问集群中的敏感信息。
  2. Service Accounts(服务账号):服务账号是用于身份验证和授权 Pod 内的应用程序的一种机制。每个 Pod 都可以与一个 Service Account 相关联,并使用该 Service Account 进行与 Kubernetes API Server 的通信。服务账号通常用于在 Pod 内的应用程序与集群中的其他资源进行交互,如读取 ConfigMap、访问 Secrets 等。

更多信息可参考官方文档:authentication

关于ServiceAccount和在K8S集群内身份验证

上次的实战场景 《下篇(开始写代码):运维开发人员不得不看的K8S API实战》 主要是在K8S集群外进行身份验证,因为调用K8S API的代码是运行在集群外部。而这次的场景是:调用K8S API的代码运行在POD容器里,也就是要在K8S集群内部进行身份验证。

当调用K8S API的代码(应用程序代码)运行在POD里的容器时,Pod中的应用程序可以使用其关联的 ServiceAccount 去访问 API Server 中的 Kubernetes 资源(比如访问ConfigMap资源)。在访问资源时,ServiceAccount 会使用其所分配的 RBAC 角色来确定它有哪些权限。为了方便理解,我简单画了个图,如下:

图片

  • 身份认证:应用程序可以使用与之关联的 ServiceAccount 进行身份认证,以证明其对 Kubernetes 集群中的资源的合法访问权限。
  • 访问授权:通过与访问控制策略(如 Role、ClusterRole)结合使用,可以为 ServiceAccount 分配特定的角色和权限,从而限制应用程序对资源的访问范围和操作权限。

关于ServiceAccount的更多信息可参考官方文档:service-accounts

关于每个命名空间下默认的服务账号:default

官方文档提到:默认服务账户是Kubernetes在创建集群时自动为每个命名空间创建的一个ServiceAccount对象。每个命名空间中的服务账户默认情况下没有任何权限,除非启用了基于角色的访问控制(RBAC),此时Kubernetes会授予所有经过身份验证的主体默认的API发现权限。如果在一个命名空间中删除了ServiceAccount对象,控制平面会自动替换为一个新的ServiceAccount对象。如果在一个命名空间中部署一个Pod,并且没有手动为Pod分配一个ServiceAccount,Kubernetes会将该命名空间的默认ServiceAccount分配给该Pod。

接下来,查看一下默认命名空间(default)下的serviceaccount:

[root@k8s-b-master ~]# kubectl get serviceaccount
NAME      SECRETS   AGE
default   0         16d
[root@k8s-b-master ~]# kubectl get serviceaccount default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2023-04-30T03:24:16Z"
  name: default
  namespace: default
  resourceVersion: "359"
  uid: 47c8dccd-2d91-47cf-b0b7-ce4d02b610a8
[root@k8s-b-master ~]# 

创建一个名为goweb的自定义命名空间,创建后,在该命名空间下已经自动创建了一个名为default的serviceaccount对象:

[root@k8s-b-master ~]# kubectl create ns goweb
namespace/goweb created
[root@k8s-b-master ~]# kubectl get serviceaccount -n goweb
NAME      SECRETS   AGE
default   0         8s
[root@k8s-b-master ~]# kubectl get serviceaccount default -n goweb -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: "2023-05-17T03:26:41Z"
  name: default
  namespace: goweb
  resourceVersion: "284809"
  uid: c0254d59-c625-4ef9-a619-1c51fdcfeef6
[root@k8s-b-master ~]# 

到了这里,可能会提出这样的问题:创建自定义的命名空间后,为什么会自动创建一个名为default的ServiceAccount?

这是因为ServiceAccount是用于身份验证和授权的一种机制,每个Pod都需要与一个ServiceAccount关联,以确定Pod在集群中的身份和权限。

默认的ServiceAccount是为了确保在创建Pod时不会发生错误。如果没有显式地指定Pod要使用的ServiceAccount,Kubernetes会自动将命名空间的默认ServiceAccount分配给该Pod。这样,Pod就能够获得基本的权限和凭据,以便与集群中的其他组件进行通信。

默认的ServiceAccount通常没有具体的权限,除非通过其他方式为其分配了角色和权限。默认情况下,它只拥有基本的API发现权限,允许Pod发现集群中的其他API资源。

可以通过为Pod显式指定不同的ServiceAccount来覆盖默认行为,以满足特定的安全需求和访问控制策略,这也就是下篇要做的事情:为 Pod配置ServiceAccount。

为Pod配置ServiceAccount的步骤

为控制篇幅,为Pod配置ServiceAccount,以及编写使用Go调用K8S API的代码、制作镜像等等均放到下篇分享。

为Pod配置ServiceAccount的步骤很简单,下面仅给出步骤,如下:

  1. 创建ServiceAccount
  2. 创建Role:定义所需的权限
  3. 创建RoleBinding,将ServiceAccount和Role关联起来
  4. 将ServiceAccount对象分配给Pod

更多信息可参考官方文档:configure-service-account

本文转载于WX公众号:不背锅运维(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/1BbBLr4E564b6OdIpXjMjw

标签:default,ServiceAccount,API,集群,Pod,K8S
From: https://www.cnblogs.com/ttropsstack/p/17433583.html

相关文章

  • 不要将你的 API 设计得过于简单
    关于软件工程的真相框架永无止境有多少框架、库和服务的存在仅仅是为了让你编写更少的代码?几乎所有的框架都是如此。为什么我们有这么多框架,每年还会出现一个新的?这是因为一个框架试图让系统变得简单,在这个过程中却导致了性能问题或编码上的不便。一个沮丧的用户说:“我要写......
  • 【K8s二进制部署】再见Docker,基于容器轻量化工具containerd完成一套Kubernetes高可用
    Kubernetes高可用集群二进制部署(RuntimeContainerd)Kubernetes(简称为:k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务发现......
  • api/BlastModule
    1、介绍四种爆破模式(1)sniper样本中可以设置一个或多个待测参数点,记为x={x1,x2,..xn}只需要设置一个payload集合,记为y={y1,y2,...ym}测试过程是从唯一的payload集合中,逐个取出,对参数点x1替换。然后依次对参数点x2,..xn替换。总的测试请求个数是n*m(2)battering_ram样......
  • api/RadixModule
    1、介绍进制算法。2、代码"""进制算法,返回一个list,有两大类型1、单个集合从长度为m的单个集合中,一次性选择n个元素,各自索引按序组成list,作为结果list的元素。(1)先按进制计算遍历,获取所有可能的组合(2)标志1,如果为True,表示允许一次选择中,禁止重复选择某一索引(3)标志2,如......
  • api/MarkModule
    1、介绍关于标记的一些函数。2、代码fromapi.PropertiesClassesimportParams"""自动标记@url:str类型,表示url@message:str类型,表示请求报文@name_list:str类型,根据url的直接参数的名称标记其对应的值,name_list参数可以通过空格分隔多个参数名称@text_list:str类......
  • 淘宝API技术文档解析,从入门到实战
    探索淘宝数据的奥秘,淘宝是目前国内最大的B2C电商平台之一,每天都会产生海量的数据。借助淘宝API技术文档,我们可以轻松地获取到这些数据,从而为电商运营和数据分析提供有力支持。1.什么是淘宝API?淘宝API(ApplicationProgrammingInterface)是一组软件API接口,可以让第三方应用程序和淘宝......
  • api/Request
    1、介绍 对应http请求对象。两种设置方法:基于url设置基于请求报文message设置,伴随设置协议类型https_flag2、代码importreimporttimeimportrequestsfromapi.PropertiesClassesimportHeadersfromapi.ResponseClassimportResponsefromapi.UrlClassimport......
  • 淘宝天猫京东1688拼多多商品详情API接口(商品价格监控,商品上传等场景)代码对接
    抓取淘宝商品详情价格接口代码封装如下:请求方式:HTTPS POSTGET公共参数名称类型必须描述key String 是 调用key(必须以GET方式拼接在URL中)API接口 API接口secret String 是 调用密钥api_name String 是 API接口名称(包括在请求地址中)[item_search,item_get,item_search_......
  • express开发api指南--服务器发布
    8.1Linux服务器linux服务器相对简单。一般都自带node环境。没有的话apt-get或者yum安装一下。//查看node版本node-v//把文件除了node-modules文件夹都上传到服务器//以放在opt/express为例cd/opt/expressnpminstall//使用pm2包npminstall-gpm2//在项目文件夹下执......
  • express开发api指南--记录日志
    败笔,目前还是我的败笔。没有找到好的方法去记录。现在只能记录请求的记录,api的返回记录没有记录下来。用的morgan中间件。这个在项目创建时已安装。//首先安装轮询文件流插件和时间处理插件cnpminstall--saverotating-file-streamdayjs//修改app.js//引入插件varrfs=......