k8s之ServiceAccount_k8s serviceaccount-程序员宅基地

技术标签: kubernetes  Kubernetes  


导读

上一篇说了k8s的RBAC授权模式,今天就来简单看一下其中涉及到的ServiceAccount。

简介

k8s创建两套独立的账号系统,原因如下:

(1)User账号给用户用,Service Account是给Pod里的进程使用的,面向的对象不同

(2)User账号是全局性的,Service Account则属于某个具体的Namespace

(3)User账号是与后端的用户数据库同步的,创建一个新用户通常要走一套复杂的业务流程才能实现,Service Account的创建则需要极轻量级的实现方式,集群管理员可以很容易地为某些特定任务创建一个Service Account

(4)对于一个复杂的系统来说,多个组件通常拥有各种账号的配置信息,Service Account是Namespace隔离的,可以针对组件进行一对一的定义,同时具备很好的“便携性”

Controller Manager创建了ServiceAccount Controller和Token Controller这两个安全相关的控制器。其中ServiceAccount Controller一直监听Service Account和Namespace的事件,如果在一个Namespace中没有default Service Account,那么Service Account会给Namespace创建一个默认(default)的Service Account。

如果Controller manager进程在启动时指定API Service私钥(service-accountprivate-key-file参数),那么Controller manager会创建Token Controller,Token Controller也监听Service Account事件。

当我们在API Server的鉴权过程中启用了Service Account类型的准入控制器,即在kube-apiserver启动参数中包括下面的内容时:

--admission_control=ServiceAccount

则针对Pod新增或修改的请求,Service Account准入控制器会验证Pod里的Service Account是否合法:

(1)如果spec.serviceAccount域没有被设置,则Kubernetes默认为其指定名称为default的Service Account。

(2)如果指定了spec.serviceAccountName并且不是default,如果此Service Account不存在,则该Pod操作失败。

(3)如果在Pod中没有指定ImagePullSecrets,那么这个spec.serviceAccount域指定的Service Account的ImagePullSecrets会自动加入到该Pod中。

(4)给Pod添加一个特殊的Volume,在该Volume中包含ServiceAccount Secret中的Token,并将Volume挂载到Pod中所有容器的指定目录下(/var/run/secrets/kubernetes.io/serviceaccount)。

ServiceAccount

ServiceAccount是一种账号,给运行在Pod里面的进程提供必要的身份证明。

做过业务系统的同学应该都知道系统中会有一种叫做角色的定义,角色是拥有某些权限的集合,而上一篇说到的Role就是这个角色,而这个ServiceAccount就相当于是拥有某个角色的账号,也就拥有了某些权限。

 

为了确保k8s集群的安全,API Server都会对客户端进行安全认证。在Pod中访问API Server服务时,是以Service方式访问名为Kubernetes这个服务的,是以类似HTTP Token的新认证方式:Service Account Auth,Pod在调用API Server时,在Http Header中传递了一个Token字符串,类似于之前提到的Http Token认证方式,有以下几处不同:

(1)Token内容来自Pod指定路径下的一个文件(文件名为token),由Kubernetes Controller进程用API Server的私钥(--service-account-private-zkey-file指定的私钥)签名指定生成的一个JWT Secret。

(2)通过HTTPS方式与API Server建立连接后,会用Pod里指定路径下的一个CA证书(文件名为ca.crt)验证API Server发来的证书,验证是否为CA证书签名的合法证书。

(3)API Server收到Token后,采用自身私钥(service-accountkey-file指定,如果没有指定,则默认采用tls-private-key-file指定的参数)对Token进行合法性验证。

上面的认证过程中所涉及的Pod中的以下三个文件:token、ca.crt、namespace,三个文件都在/run/secrets/kubernetes.io/serviceaccount目录下

 

这三个文件由于参与到Pod进程和API Server认证的过程中,起到了类似Secret(私密凭据)的作用,所以被称为Kubernetes Secret对象,Secret从属于Service Account资源对象,一个Service Account对象里面可以包括多个不同的Secret对象,分别用于不同目的的认证活动。

一个Secret也是有这三样东西:

 

查看Service Account详细信息

kubectl describe serviceaccounts

查看Secret

kubectl get secrets

在每个Namespace下都有一个名为default的默认Service Account对象,在这个ServiceAccount里面有一个名为Tokens的可以当做Volume被挂载到Pod里的Secret,当Pod启动时,这个Secret会自动被挂载到Pod的指定目录下,用来协助完成Pod中的进程访问API Server时的身份鉴权。

 

 

一个ServiceAccount可包含多个Secret

其中

(1)名为Tokens的Secret用于访问API Server的Secret,也被称为Service Account Secret。

(2)名为imagePullSecrets的Secret用于下载容器镜像时的认证过程,通常镜像库运行在Insecure模式下,所以这个为空

(3)用户自定义的其他Secret,用于用户的进程。

如果一个Pod在定义时没有指定spec.serviceAccountName属性,则会默认赋值为default,可进行如下指定:

apiVersion: v1
kind: Pod
metadata:
  name: pod
spec:
  containers:
  - name: podtest
    image: nginx
  serviceAccountName: myServiceAccount

创建ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-admin
  namespace: kube-system

将这个ServiceAccount跟ClusterRole进行绑定:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-admin
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard-admin
  namespace: kube-system

这样ServiceAccount就拥有了ClusterRole的权限

在Pod中使用ServiceAccount

apiVersion: v1
kind: Pod
metadata:
  name: pod
  namespace: kube-system
spec:
  containers:
  - name: podtest
    image: nginx
  serviceAccountName: kubernetes-dashboard-admin

===============================

我是Liusy,一个喜欢健身的程序员。

欢迎关注微信公众号【上古伪神】,一起交流Java技术及健身,获取更多干货,领取Java进阶干货,领取最新大厂面试资料,一起成为Java大神。

来都来了,关注一波再溜呗。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_37337210/article/details/112757500

智能推荐

Textureview+Mediplay 播放视频时无画面有声音_硬件加速问题:许多第三方播放器在使用textureview时,如果不开启硬件加速,可能-程序员宅基地

文章浏览阅读927次。公司最近需要我们做个播放器,需要根据横竖屏自动切换视频的播放方向;刚开始我是用surfaceview控件+Mediplay来做播放器的,后面发现surfaceview不能对视频进行旋转,只能把surfaceview替换成Textureview;这里我补充一下surfaceview与Textureview有哪些区别surfaceview:优点:可以在一个独立的线程中进行绘制,不会影响主线程,使用双缓冲机制,播放视频时画面更流畅缺点:Surface不在View hierachy中,它的显示也不受V_硬件加速问题:许多第三方播放器在使用textureview时,如果不开启硬件加速,可能

python的两种执行方式,python的两种运行方式-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏13次。python有两种运行方式,第一种是交互式,另一种是脚本式,这里可能郁闷了,啥叫脚本??脚本可能会想到不重要的,边角料啥的,我们可以认为是一个大型文件,最后有点不足,加进去的补丁,让程序更加完善吧,脚本(Script)是一种批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑。那先看一下交互式的界面啥样子。如下图..._运行python程序的两种方法

洛阳理工学院计算机类分数线,2010洛阳理工学院招生对口计算机吗?分数线大概是多少...-程序员宅基地

文章浏览阅读360次。就上大学网为您推荐类似问题答案问题1:2010年唐山职业技术学院招收计算机对口分数线大概是多少?你的分数查不多,报第一纸鸢问题不大!问题2:2010年河南省洛阳市理工学院大专录取分数线是多少?洛一高600分,市三中560分,市一中540分,市二中539分,市外国语学校543分,市十九中525分,市四中468分,市四十六中480分,市第二实验中学448分,中信重机中学485分,市四十三中447分,市..._洛阳理工学院对口升学计算机

Branch-and-Cut(CVRP问题)_branch and cut-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏33次。Branch and cut 是一个基于线性规划的branch and bound 方法,通过有效不等式来加强线性松弛..._branch and cut

bzoj2245 [SDOI2011]工作安排_你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之-程序员宅基地

文章浏览阅读175次。(http://www.elijahqi.win/2017/12/11/bzoj2245-sdoi2011%E5%B7%A5%E4%BD%9C%E5%AE%89%E6%8E%92/%20%E2%80%8E) Description你的公司接到了一批订单。订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件。公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所_你的任务是制定出一个产品的分配方案,使得订单条件被满足,并且所有员工的愤怒值之

软件测试作业(一)-程序员宅基地

文章浏览阅读86次。说起程序中的bug,真是一个令所有程序员深恶痛绝的东西,然而大部分都是源于接触少,缺乏经验。在上学期javaWeb大作业中,在写一个jsp的时候,由于一个button的功能是提交,于是把这个button的name赋值为submit,然而这个值和jsp中form(表单)的提交函数重名了。部分代码如下1 <p align="center">2 <input typ..._选择一个测试要素,以你做过的一个软件作品为例,分别讨论该要 素在软件生命周期的

随便推点

Java面试题之:http 响应码 301 和 302 代表的是什么?有什么区别?_java http get code 301-程序员宅基地

文章浏览阅读1.2k次。http 响应码 301 和 302 代表的是什么?有什么区别?一、http 响应码 301 和 302 代表的是什么?有什么区别?一、http 响应码 301 和 302 代表的是什么?有什么区别?  答:301,302 都是HTTP状态的编码,都代表着某个URL发生了转移。  区别:  301 redirect: 301 代表永久性转移(Permanently Moved)。  302 redirect: 302 代表暂时性转移(Temporarily Moved )。..._java http get code 301

《计算机组成原理》课程学习(12)——计算机组成原理作业1-10章思考题与习题答案_画出主机框图,分别以存数-程序员宅基地

文章浏览阅读9k次,点赞24次,收藏213次。第1章 计算机系统概论1. 什么是计算机系统、计算机硬件和计算机软件?硬件和软件哪个更重要?解:P3计算机系统:由计算机硬件系统和软件系统组成的综合体。计算机硬件:指计算机中的电子线路和物理装置。计算机软件:计算机运行所需的程序及相关资料。硬件和软件在计算机系统中相互依存,缺一不可,因此同样重要。2. 如何理解计算机的层次结构?答:计算机硬件、系统软件和应用软件构成了计算机系统的三个层次结构。(1)硬件系统是最内层的,它是整个计算机系统的基础和核心。(2)系统软._画出主机框图,分别以存数

Oracle 11g报错"ORA-00845: MEMORY_TARGET not supported on this system"-程序员宅基地

文章浏览阅读160次。在通过RMAN恢复数据库,启动数据库时报错RMAN> STARTUP FORCE NOMOUNT PFILE='/opt/oracle/11.2.0/dbs/initSPDB2.ora';RMAN-00571:..._rman-04014: startup failed: ora-00845: memory_target not supported on this s

pycharm中的flask项目如何开启debug模式_pycharm怎么flask 路由怎么debug-程序员宅基地

文章浏览阅读1.1k次。pycharm中的flask项目如何开启debug模式flask项目如果在开发的时候不打开Debug模式的话,我们想要看项目中的报错信息就只能去控制台查看,会比较麻烦,而且如果不开启debug模式,我们每一次调整代码都需要将服务器重新启动,是非常麻烦的一件事,所以我们最好是将debug模式打开但是我在pycharm中使用代码开启debug模式总是打不开。使用代码打开debug模式的教程可以参考..._pycharm怎么flask 路由怎么debug

java包装类引用比较_Java基本类型与包装类的比较-程序员宅基地

文章浏览阅读192次。我总结了Java数据比较主要有以下要点:1.基本类型和基本类型对比;2.基本类型和包装类型比较;3.包装类型和包装类型比较;4.”==“与”equal“比较方式;5.[-128,127]与非[-128,127]范围的数据比较;6.String包装类型的比较。基本类型和基本类型对比基本类型和基本类型的比较,因为不是对象所以没有equal方法也没有所谓的引用地址,所以只能”==“来比较它们本身的值。i..._java 引用类型和包装类型对比

圣杯布局和双飞翼布局的区别,作用以及优缺点_圣杯布局和双飞翼布局的优缺点-程序员宅基地

文章浏览阅读799次,点赞3次,收藏4次。作用:圣杯布局和双飞翼布局解决的问题是相同的,就是两边顶宽,中间自适应的三栏布局,中间栏要在放在文档流前面以优先渲染。圣杯布局:为了让中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position: relative并分别配合right和left属性,以便左右两栏div移动后不遮挡中间div。优缺点:不需要添加dom节点缺点:如果将浏览器无线放大时,「圣杯」将会「破碎」掉。当middle部分的宽小于le_圣杯布局和双飞翼布局的优缺点