K8S - Access Control 机制介绍

news2025/1/6 19:25:43

在这里插入图片描述
作为开发人员, 我们通常会直接用root 帐号操作 k8s master node 里的kubectl 命令,并不能感知k8s 多用户权限管理存在。

即使自动化, 我们也会考虑用ansible 来远程操作master node…

所以大部分开发人员默认上是不用深入研究k8s的Access control的

但是作为SRE 或者 DevOps 开发, 理解一下还是有好处, 当然本文也只是介绍个基本概念,也不会深入。



K8S 权限认证机制介绍

Kubernetes(K8s)的权限认证机制主要涉及认证(Authentication)和授权(Authorization)两个方面:

Authentication 包括用户验证与 服务帐号(SA) 认证

至于Authorization 授权方面, 就是我们常见的RBAC (Role-based Access Control)

如下图, 其实一切对k8s集群的管理操作都是通过api service 去调用nodes 的kubelet 去完成

而认证和授权是在api service 里完成的, 任何调用 api service 里的api之前都必须pass 认证和授权
在这里插入图片描述





K8S 的用户帐号

在 Kubernetes 中,用户账户(User Account)通常不是直接管理的资源,而是由身份验证插件和身份提供者处理的。这些身份提供者可以包括基本身份验证、证书认证、令牌认证、OpenID Connect 等。当用户成功进行身份验证后,Kubernetes 将使用其提供的身份信息调用集群中的授权插件来确定用户是否有权限执行请求的操作。

要创建用户账户,您通常需要依赖外部的身份提供者,比如 LDAP、Active Directory、OpenID Connect 等。这些身份提供者负责验证用户身份,并将验证成功的用户映射到 Kubernetes 中的特定用户账户。

总之, 一般情况下我们用不上它, 除非大型企业下的k8s 平台会考虑使用User 帐号。





K8S 的Service account 服务帐号

反而, k8s的sa 我们更应该重点关注, 因为sa 可以被k8s 本身管理, 包括sa 的创建和授权

通常1个namespace 被创建, 该namespace 会被自动创建1个名字叫default的 sa

我们可以下面命令来查看某个namespace 的sa

gateman@MoreFine-S500: conf$ kubectl get sa -n default
NAME      SECRETS   AGE
default   1         206d





K8S 的Service account 和 用户帐号的对比

  1. User 帐号是针对人的, 服务帐号针对POD 进程
  2. User 帐号是全局的, 在所有的namespace中 必须唯一, 而sa 是属于某个namespace的, 多个namespace 可以有同名的sa
  3. 通常User帐号与企业的用户数据库(例如LDAP)同步, 而sa 的创建和使用更加轻量化, 允许集群用户为特定任务创建sa
  4. 对于复杂系统的配置包(helm chart), 可以包括对该系统的各种组建的sa的定义





Service Account Admission Controller

这个控制器主要是管理POD 的sa 设置
它是 apiserver 的一部分。当1个POD 被创建和修改时

  1. 如果POD 没有被设置sa, 那么它会将POD 的sa 设为 default (default 是1个sa)
  2. 确保POD 引用的sa 存在, 否则会拒绝POD的创建和修改请求
  3. 如果POD 不包含任何 ImagePullSecret, 则将SA 的imagePullSecret 添加到POD中(前提是该SA 配置了ImagePullSecret
  4. 为包含API访问的token的POD添加了1个Volume, 挂载在/var/run/secrets/kubernetes.io/serviceaccount(容器里)

例子, 把default 的 token mount在pod里了

gateman@MoreFine-S500: conf$ kubectl exec -it deployment-cloud-order-5f46d97659-2d7nk /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.


bash-4.4# pwd
/var/run/secrets/kubernetes.io/serviceaccount
bash-4.4# ls
ca.crt	namespace  token
bash-4.4# cat namespace 
default





Token Controller

每个sa 都观念1个token 就是 Token Controller 管理的





Service Account Controller

很简单, 这个controller 会管理namespace 的sa
他会确保每个namespace 会存在1个名字叫default的sa





Role

作用范围:Role 专注于特定命名空间(Namespace-specific)。它定义了对特定命名空间内资源的权限。
应用对象:Role 通常用于控制对该命名空间内资源的访问权限。
示例用途:可以为特定命名空间内的用户或 ServiceAccount 分配 Role,以限制其对该命名空间内资源的操作权限。

可以用下面命令来查看分别每个namespace 的role

gateman@MoreFine-S500: conf$ kubectl get role --all-namespaces
NAMESPACE       NAME                                             CREATED AT
ingress-nginx   ingress-nginx                                    2024-06-24T18:17:27Z
kube-public     kubeadm:bootstrap-signer-clusterinfo             2024-02-23T20:44:20Z
kube-public     system:controller:bootstrap-signer               2024-02-23T20:44:19Z
kube-system     extension-apiserver-authentication-reader        2024-02-23T20:44:19Z
kube-system     kube-proxy                                       2024-02-23T20:44:20Z
kube-system     kubeadm:kubelet-config-1.23                      2024-02-23T20:44:19Z
kube-system     kubeadm:nodes-kubeadm-config                     2024-02-23T20:44:19Z
kube-system     system::leader-locking-kube-controller-manager   2024-02-23T20:44:19Z
kube-system     system::leader-locking-kube-scheduler            2024-02-23T20:44:19Z
kube-system     system:controller:bootstrap-signer               2024-02-23T20:44:19Z
kube-system     system:controller:cloud-provider                 2024-02-23T20:44:19Z
kube-system     system:controller:token-cleaner                  2024-02-23T20:44:19Z

可以见default namespace 是没有role 定义的

查看具体Role的权限,
我们就查看上面的ingress-nginx


gateman@MoreFine-S500: conf$ kubectl get role ingress-nginx -n ingress-nginx -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  annotations:
    meta.helm.sh/release-name: ingress-nginx
    meta.helm.sh/release-namespace: ingress-nginx
  creationTimestamp: "2024-06-24T18:17:27Z"
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.10.1
    helm.sh/chart: ingress-nginx-4.10.1
  name: ingress-nginx
  namespace: ingress-nginx
  resourceVersion: "3038700"
  uid: f27340df-0f11-448d-8591-baaca1b28989
rules:
- apiGroups:
  - ""
  resources:
  - namespaces
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - configmaps
  - pods
  - secrets
  - endpoints
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses/status
  verbs:
  - update
- apiGroups:
  - networking.k8s.io
  resources:
  - ingressclasses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - coordination.k8s.io
  resourceNames:
  - ingress-nginx-leader
  resources:
  - leases
  verbs:
  - get
  - update
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - create
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
- apiGroups:
  - discovery.k8s.io
  resources:
  - endpointslices
  verbs:
  - list
  - watch
  - get





ClusterRole

作用范围:ClusterRole 跨越整个集群,即集群范围(Cluster-wide)。它定义了对整个集群中资源的权限。
应用对象:ClusterRole 用于控制对集群级资源的访问权限,例如节点、命名空间等。
示例用途:可以为具有全局职责的用户或 ServiceAccount 分配 ClusterRole,以允许他们对整个集群的资源进行操作。

由于ClusterRole 是for all namespaces的, 我们可以下面命令来查看所有namespace的clusterrole

gateman@MoreFine-S500: conf$ kubectl get clusterrole
NAME                                                                   CREATED AT
admin                                                                  2024-02-23T20:44:18Z
cluster-admin                                                          2024-02-23T20:44:18Z
edit                                                                   2024-02-23T20:44:18Z
flannel                                                                2024-03-08T18:25:29Z
ingress-nginx                                                          2024-06-24T18:17:26Z
kubeadm:get-nodes                                                      2024-02-23T20:44:20Z
system:aggregate-to-admin                                              2024-02-23T20:44:18Z
system:aggregate-to-edit                                               2024-02-23T20:44:18Z
system:aggregate-to-view                                               2024-02-23T20:44:18Z
system:auth-delegator                                                  2024-02-23T20:44:18Z
system:basic-user                                                      2024-02-23T20:44:18Z
system:certificates.k8s.io:certificatesigningrequests:nodeclient       2024-02-23T20:44:18Z
system:certificates.k8s.io:certificatesigningrequests:selfnodeclient   2024-02-23T20:44:18Z
system:certificates.k8s.io:kube-apiserver-client-approver              2024-02-23T20:44:18Z
system:certificates.k8s.io:kube-apiserver-client-kubelet-approver      2024-02-23T20:44:18Z
system:certificates.k8s.io:kubelet-serving-approver                    2024-02-23T20:44:18Z
system:certificates.k8s.io:legacy-unknown-approver                     2024-02-23T20:44:18Z
system:controller:attachdetach-controller                              2024-02-23T20:44:18Z
system:controller:certificate-controller                               2024-02-23T20:44:19Z
system:controller:clusterrole-aggregation-controller                   2024-02-23T20:44:18Z
system:controller:cronjob-controller                                   2024-02-23T20:44:18Z
system:controller:daemon-set-controller                                2024-02-23T20:44:18Z
system:controller:deployment-controller                                2024-02-23T20:44:18Z
system:controller:disruption-controller                                2024-02-23T20:44:18Z
system:controller:endpoint-controller                                  2024-02-23T20:44:18Z
system:controller:endpointslice-controller                             2024-02-23T20:44:18Z
system:controller:endpointslicemirroring-controller                    2024-02-23T20:44:18Z
system:controller:ephemeral-volume-controller                          2024-02-23T20:44:18Z
system:controller:expand-controller                                    2024-02-23T20:44:18Z
system:controller:generic-garbage-collector                            2024-02-23T20:44:18Z
system:controller:horizontal-pod-autoscaler                            2024-02-23T20:44:18Z
system:controller:job-controller                                       2024-02-23T20:44:18Z
system:controller:namespace-controller                                 2024-02-23T20:44:18Z
system:controller:node-controller                                      2024-02-23T20:44:18Z
system:controller:persistent-volume-binder                             2024-02-23T20:44:18Z
system:controller:pod-garbage-collector                                2024-02-23T20:44:19Z
system:controller:pv-protection-controller                             2024-02-23T20:44:19Z
system:controller:pvc-protection-controller                            2024-02-23T20:44:19Z
system:controller:replicaset-controller                                2024-02-23T20:44:19Z
system:controller:replication-controller                               2024-02-23T20:44:19Z
system:controller:resourcequota-controller                             2024-02-23T20:44:19Z
system:controller:root-ca-cert-publisher                               2024-02-23T20:44:19Z
system:controller:route-controller                                     2024-02-23T20:44:19Z
system:controller:service-account-controller                           2024-02-23T20:44:19Z
system:controller:service-controller                                   2024-02-23T20:44:19Z
system:controller:statefulset-controller                               2024-02-23T20:44:19Z
system:controller:ttl-after-finished-controller                        2024-02-23T20:44:19Z
system:controller:ttl-controller                                       2024-02-23T20:44:19Z
system:coredns                                                         2024-02-23T20:44:20Z
system:discovery                                                       2024-02-23T20:44:18Z
system:heapster                                                        2024-02-23T20:44:18Z
system:kube-aggregator                                                 2024-02-23T20:44:18Z
system:kube-controller-manager                                         2024-02-23T20:44:18Z
system:kube-dns                                                        2024-02-23T20:44:18Z
system:kube-scheduler                                                  2024-02-23T20:44:18Z
system:kubelet-api-admin                                               2024-02-23T20:44:18Z
system:monitoring                                                      2024-02-23T20:44:18Z
system:node                                                            2024-02-23T20:44:18Z
system:node-bootstrapper                                               2024-02-23T20:44:18Z
system:node-problem-detector                                           2024-02-23T20:44:18Z
system:node-proxier                                                    2024-02-23T20:44:18Z
system:persistent-volume-provisioner                                   2024-02-23T20:44:18Z
system:public-info-viewer                                              2024-02-23T20:44:18Z
system:service-account-issuer-discovery                                2024-02-23T20:44:18Z
system:volume-scheduler                                                2024-02-23T20:44:18Z
view                                                                   2024-02-23T20:44:18Z

同样我们可以用下命令来查看某个clusterrole的具体权限

gateman@MoreFine-S500: conf$ kubectl get clusterrole cluster-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: "2024-02-23T20:44:18Z"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "87"
  uid: 64f8f954-d9bc-41a0-b4a2-d1a28eaacdda
rules:
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'

权限基本都有!





Rolebinding 和 ClusterRoleBinding

这两个都容易理解了, 就是role 和 sa/User的mapping

gateman@MoreFine-S500: conf$ kubectl get rolebinding --all-namespaces
NAMESPACE       NAME                                                ROLE                                                  AGE
ingress-nginx   ingress-nginx                                       Role/ingress-nginx                                    85d
kube-public     kubeadm:bootstrap-signer-clusterinfo                Role/kubeadm:bootstrap-signer-clusterinfo             206d
kube-public     system:controller:bootstrap-signer                  Role/system:controller:bootstrap-signer               206d
kube-system     kube-proxy                                          Role/kube-proxy                                       206d
kube-system     kubeadm:kubelet-config-1.23                         Role/kubeadm:kubelet-config-1.23                      206d
kube-system     kubeadm:nodes-kubeadm-config                        Role/kubeadm:nodes-kubeadm-config                     206d
kube-system     system::extension-apiserver-authentication-reader   Role/extension-apiserver-authentication-reader        206d
kube-system     system::leader-locking-kube-controller-manager      Role/system::leader-locking-kube-controller-manager   206d
kube-system     system::leader-locking-kube-scheduler               Role/system::leader-locking-kube-scheduler            206d
kube-system     system:controller:bootstrap-signer                  Role/system:controller:bootstrap-signer               206d
kube-system     system:controller:cloud-provider                    Role/system:controller:cloud-provider                 206d
kube-system     system:controller:token-cleaner                     Role/system:controller:token-cleaner                  206d





具体例子

参考:
K8S - 用service account 登陆kubectl

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

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

相关文章

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块,用于检测、下载和安装更新。 github地址:https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多(911个),但已在很多开源项目看到其身影,比如Not…

[数据结构]算法复杂度详解

文章目录 一、引言1、想象数据结构与算法的奇妙世界2、算法复杂度的轻松解读3、数据结构与算法的温馨寄语 二、轻松掌握复杂度基础1、时间复杂度:算法速度的衡量尺2、空间复杂度:算法占地的衡量尺3、常见的复杂度 三、复杂度的计算1、时间复杂度计算2、空…

联想键盘鼠标套装Liteon SK-8861 银丝带键盘、鼠标对码方法

知识点分析: 最近在IdeaCentre B520e、IdeaCentre A720等机型,标配2.4G无线键鼠套装:Liteon SK-8861。由三部分组成:USB接收器、鼠标、键盘。鼠标、键盘同时和USB接收器连接,未开箱时USB接收器包装在鼠标内。标配的键鼠套装不需要…

linux 内核代码学习(九)--Linux内核启动和文件系统

一个比较顺手的学习平台可以达到事半功倍的效果,这里使用的平台环境主要是利用了主机和从机间的文件共享,以及从机自带的编译环境可以比较顺利的编译busybox1.0版本,方便进行内核和文件系统的测试了学习。 主机环境:vmware7.0win1…

C语言 | Leetcode C语言题解之第413题等差数列划分

题目&#xff1a; 题解&#xff1a; int numberOfArithmeticSlices(int* nums, int numsSize) {if (numsSize 1) {return 0;}int d nums[0] - nums[1], t 0;int ans 0;// 因为等差数列的长度至少为 3&#xff0c;所以可以从 i2 开始枚举for (int i 2; i < numsSize; i…

Qt 模型视图(三):视图类QAbstractItemView

文章目录 Qt 模型视图(三):视图类QAbstractItemView1.基本概念1.1.使用现有视图1.2.使用模型1.3.使用模型的多个视图1.4.在视图之间共享选择 Qt 模型视图(三):视图类QAbstractItemView ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视…

高级I/O知识分享【5种IO模型 || select || poll】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;前文 2&a…

无人机助力智慧农田除草新模式,基于YOLOv10全系列【n/s/m/b/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天&#xff0c;无人机喷洒药物已经不是一件新鲜事情了&#xff0c;在很多高危的工作领域中&#xff0c;比如高空电力设备除冰&#xff0c;电力设备部件传送更换等等&#xff0c;无人机都可以扮演非常出色的作用&#xff0c;前面回到老家一段时间&#xff0c;最近正…

算法题总结(一)——二分查找专题

二分查找 我们二分查找的本质就是每次能够通过中间值来进行分割&#xff0c;能够比较判断&#xff0c;查找到或者接近需要的数据&#xff0c;然后把一部分的数据丢弃掉。 原题 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &…

LabVIEW提高开发效率技巧----使用快捷键

在LabVIEW的开发过程中&#xff0c;熟练掌握和运用快捷键可以极大地提升工作效率&#xff0c;减少重复性操作所花费的时间。快捷键不仅可以加快编程速度&#xff0c;还能让开发者更加专注于逻辑实现和功能设计。细问问将详细介绍LabVIEW中的常用快捷键&#xff0c;特别是强大的…

101012分页属性

4k页面 P&#xff08;有效位&#xff09;&#xff1a;1有效&#xff0c;0无效 R/W&#xff08;读写位&#xff09;&#xff1a;1可读可写&#xff0c;0可读 U/S&#xff08;权限位&#xff09;&#xff1a;1(User)&#xff0c;0(System) A&#xff08;物理页访问位&#xff…

医学数据分析实训 项目五 聚类分析--蛋白质消费结构分析--车辆驾驶行为指标

文章目录 项目五&#xff1a;聚类分析实践目的实践平台实践内容任务一&#xff1a;蛋白质消费结构分析步骤 任务一&#xff1a;蛋白质消费结构分析数据预处理&#xff08;四&#xff09;模型建立及优化KMeans 任务二 车辆驾驶行为&#xff08;四&#xff09;模型建立及优化 项目…

并发带来的对象一致性问题

多线程操作带来数据不一致情况分析&#xff0c;简单demo。 public class Object_IS {private Student_Object so new Student_Object("张三", 123);public static void main(String[] args) throws InterruptedException {Object_IS os new Object_IS();os.test1(…

论文笔记:交替单模态适应的多模态表征学习

整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation&#xff09;论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比&#xff0c;MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…

输电线路缺陷检测数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)

输电线路数据集&#xff08;绝缘子自爆&#xff0c;破损&#xff0c;闪络&#xff0c;鸟巢&#xff0c;防震锤脱落五种缺陷&#xff09;包括&#xff1a; 1.绝缘子自爆 2.绝缘子破损绝、闪络 3.鸟巢 4.防震锤脱落 数据增强后的数量 对应数量&#xff1a;1828&#xff0c;1467&a…

类加载器详细介绍

类加载器我们要聊一个神秘而又重要的角色——Java类加载器。这家伙&#xff0c;就像是个超级英雄&#xff0c;总是在关键时刻挺身而出&#xff0c;为我们的Java程序提供强大的支持。我会尽量用简单易懂的方式来介绍它。 一 、类加载器介绍 1、类加载器是什么&#xff1f; 想象…

高频率快响应信号隔离变送器

隔离变送器相册: 隔离变送器图片----捷晟达科技​​​​ 隔离变送器---深圳捷晟达科技 隔离变送器---捷晟达科技 高频率快响应信号隔离变送器 定义&#xff1a; 高频率是指隔离变送器从输入到输出采样时的时间&#xff0c;该产品响应频率从10KHz~100KHz&#xff0c;产品精度高&…

【CSS】选择器(基础选择器、复合选择器、属性匹配选择器、结构伪类选择器、伪元素选择器)

选择器 引入方式基础选择器复合选择器属性匹配选择器结构伪类选择器伪元素选择器 引入方式 1&#xff1a;外联 <!-- css引入方式1&#xff1a;外联 外联与内嵌优先级相同&#xff0c;取决于加载顺序 --><link rel"stylesheet" type"text/css" h…

箭头检测系统源码分享

箭头检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

子查询优化

MySQL学习大纲 我的数据库学习大纲 1、什么是子查询&#xff1a; 1.MySQL 从 4.1 版本开始支持子查询&#xff0c;使用子查询可以进行 SELECT 语句的嵌套查询&#xff0c;即一个 SELECT 查询的结果作为另一个 SELECT 语句的条件。子查询可以一次性完成很多逻辑上需要多个步骤才…