首页 > 其他分享 >K8S 权限管理

K8S 权限管理

时间:2023-10-27 15:23:04浏览次数:35  
标签:权限 管理 用户 kubeconfig 集群 Role k8s ClusterRole K8S

k8s 权限管理

目录

1、k8s 用户

1.1、k8s 用户概念

(1) k8s内部服务之间访问的账号 ServiceAccount(管理程序之间的访问)

(2)k8s外部用户访问集群的账号 User(管理操作人的访问)

k8s 不存储用户信息,用户的创建管理都无需与 K8S API 交互,但 K8S 接收 API请求时是需要知道发出请求的用户信息的。

所有对K8S的API请求都需要绑定身份信息(User或者ServiceAccount)
1.2、User&ServiceAccount 的区别
1、user 是人来使用而 ServiceAccount 是为某个资源、程序、服务使用的
2、k8s 用户的创建管理都无需与 K8S API 交互,K8S 所能认知的只有一个用户名,ServiceAccount 是有 K8S 管理创建
3、user 独立在 k8s 之外并且徐涛在全局唯一,而 ServiceAccount作为 k8s 内部的某种资源,是存在于某个命名空间之中的,在不同命名空间中的同名 ServiceAccount 被认为是不同的资源
1.3、k8s 用户创建

例如我们创建一个名叫 jim 的用户

1.3.1、创建用户私钥
openssl genrsa -out jim.key 2048
1.3.2、创建证书签名请求

使用此私钥创建一个 csr 文件(证书签名请求),在 subject 里带上用户信息(CN为用户名,o 为用户组)

openssl req -new -key jim.key -out jim.csr -subj "/CN=jim/O=MGM"

可能会出现如下异常

140587201880512:error:2406F079:random number 
generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd

执行以下命令解决异常

cd /root
openssl rand -writerand .rnd

image-20231025141746279

1.3.3、集群证书签署

使用 kubernetes 集群 CA 证书签署用户的证书

openssl x509 -req -in jim.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out jim.crt -days 365
  • -CA 和-CAkey 参数为集群 CA 证书所在的位置
  • -days 参数指定此证书的过期时间,这里为 365 天

k8s 安装完成后证书秘钥相关的资源都保存在/etc/kuberenetes/pki文件下

这样就完成了用户的创建,注意保存证书(jim.crt)和私钥(jim.key)后面要用

可见创建一个 用户是完全独立于 k8s 集群的,没有使用任何的 k8s api。

2、k8s角色

k8s 是基于 RBAC(Role-Based Access Control)角色实现访问控制

官方资料:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/

主要涉及 4 个 Kind:

  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding
2.1、Role&ClusterRole

Role 或ClusterRole 中包含一组代表相关权限的规则

  • Role 是用来在某个名字空间内设置访问权限,所以创建 Role 是必须指定该 Role 所属的名字空间。
  • ClusterRole 则是一个集群作用域的资源。

这两种资源的名字不同(Role 和 ClusterRole)是因为 kubernetes 对象要么是名字空间作用域的,要么是集群作用域的,不可两者兼具

说白了 Role 只能访问所属名字空间的资源,ClusterRole 可以访问所有名字空间的资源

比如,你可以使用 ClusterRole 来允许某特定用户执行 
kubectl get pods --all-namespaces
kubectl get pods -n 【指定命名空间】
2.1.1、Role

role的配置yaml 文件如下

apiVersion: rbac.authorization.k8s.io/v1
# 指定类型为Role
kind: Role
metadata:
  namespace: team2
  name: team2-role
rules:
- apiGroups: ["","apps"] # "" 标明 core API 组  如果要访问deployment 需要加入"apps"
  #resources指定此角色可以访问操作那些资源   *代表所有 这里配置只能操作pods
  resources: ["pods"] 
  #verbs指资源的具体操作的类型例如 create get delete list update edit watch exec  *代表所有
  verbs: ["get", "watch", "list"] 

apiGroups 配置项说明

  • apiGroups:[“”] 可以操作Pod service configmap 等大部分资源
  • apiGroups:[“apps”] 可以操作deployment
  • apiGroups:[“batch”] 可以操作 Job 资源
  • apiGroups:[“autoscaling”] 可以操作 horizontalpodautoscalers

注意创建 Role 前,确保已存在对应的 namespace

kubectl create namespace team2

image-20231025152435613

kubectl apply -f team2-role.yaml创建角色

image-20231025152620879

这样就完成了角色创建

2.1.2、ClusterRole

ClusterRole的配置yaml文件如下

apiVersion: rbac.authorization.k8s.io/v1
# 指定类型为ClusterRole
kind: ClusterRole
metadata:
  # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制
  name: manger-cluster-role
rules:
- apiGroups: ["","apps"] "" 标明 core API 组
  #resources指定此角色可以访问操作那些资源   *代表所有 这里配置只能操作secrets
  resources: ["secrets"]
  #verbs指资源的具体操作的类型例如 create get delete list update edit watch exec  *代表所有
  verbs: ["get", "watch", "list"]

image-20231025153547039

image-20231025153627505

这样就完成了 ClusterRole 的创建

2.2、Rolebinding&ClusterRoleBinding

角色绑定(Rolebinding&ClusterRoleBinding)是将角色中定义的权限富裕一个或者一组用户。

RoleBinding 在指定的名字空间中执行授权,而 ClusterRoleBinding 在集群范围执行授权。

Rolebinding 可以引用同一个名字空间中的任何 Role 也可以引用某 ClusterRole 并将该 ClusterRole 绑定到 Rolebinding 所在的名字空间。(RoleBinding可以绑定 Role 和 ClusterRole)

如果希望将某 ClusterRole 绑定到集群中所以名字的空间,你要使用ClusterRoleBinding

2.2.1、Rolebinding

Rolebinding 的配置 yaml 文件如下

apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "jim" 操作 "team2" 名字空间中的所有资源
# 需要在该命名空间中有一个名为 “team2-role” 的 Role
kind: RoleBinding
metadata:
  name: team2-role-binding
  namespace: team2
subjects:
# 你可以指定不止一个“subject(主体)”
- kind: User
  name: jim # "name" 是区分大小写的
  apiGroup: ""
roleRef:
  # "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
  kind: Role        # 此字段必须是 Role 或 ClusterRole
  name: team2-role  # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
  apiGroup: ""

image-20231025160345814

这样就完成了用户与角色的绑定

到此 k8s 中已经存在了一个 jim 用户可以访问资源了,接下来就是去配置 kubeconfig

2.2.2、ClusterRolebinding

可以使用 ClusterRolebinding 在集群级别和所有命名空间中授予权限。下面示例中所定义的 ClusterRolebinding 允许在用户组“manager”中的任何用户都可以读取集群中任何命名空间中的 secret。

# 以下`ClusterRoleBinding`对象允许在用户组"manager"中的任何用户都可以读取集群中任何命名空间中的secret。
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

3、kubeconfig 概念

kubeconfig 是一个配置文件,用于配置 kubectl 命令能够访问的 k8s 集群,是谁在访问集群,以及当前访问的上下文

可以简单把kubectl命令看做是一个浏览器,要访问一个网站(k8s集群)必须知道网站的IP地址,登录此网站的用户信息,以及保存当前登录的一些session cookie

image-20231025162248479

kubeconfig 中主要由如下部分组成:

  • clusters(集群)
  • users(用户)
  • context(上下文)

使用 kubectl config view 命令可以看到

kubectl config view

image-20231025163150534

k8s master 初始化完成后,也会提醒把创建好的 admin.conf放置到$HOME/kube 下,才能正常使用 kubectl 命令

image-20231025164200239

3.1、clusters(集群)

kubeconfig 配置文件中一个重要的配置项就是 clusters

如果把kubectl看做是浏览器,那么clusters配置更像是浏览器本地DNS缓存。
浏览器根据DNS获取网站的IP,clusters告诉kubectl可以访问的远端k8s集群的ip,以及访问时需要携带的证书
3.2、users(用户)

kubeconfig 配置文件另一个重要的配置项就是 users,users 提供的就是登录远程 k8s 集群时使用的账号密码

这里的账号必须是所登录的 k8s 集群中存在的用户,同时密码就是所登录的 k8s 集群中的根证书颁发的证书(后面的创建用户会详细说明)

3.3、context(上下文)

context 保存的是 users 和 cluster 的对应关系,选择了上下文即选择了以某个用户去访问某个集群

4、kubeconfig 配置和使用

kubectl config -h 查看 config 的帮助文档

image-20231025174115024

可以使用-kubeconfig 来实现操作那个 kubeconfig 配置文件

例如在指定的配置文件/ops/k8s/config/myconfig 中创建一个集群 
kubectl config set-cluster development --server=https://192.168.0.110 --kubeconfig=/ops/k8s/config/myconfig 

image-20231025174330788

可以使用set 命令来修改或新建单独的一个配置属性

例如把刚才创建的集群中server的配置修改一下ip地址
kubectl config set clusters.development.server http://5.6.7.8 --kubeconfig=/ops/k8s/config/myconfig

image-20231025174658592

其他说明:

set-context 指定当前上下文
current-context 查看当前的上下文
get-contexts 查看指定上下文信息
use-context 使用上下文
rename-context 重命名上下文
delete-context 删除指定上下文
delete-cluster 删除集群
set-cluster 创建集群
get-clusters 查询集群
set-credentials 配置用户信息
view 查看kubeconfig 配置文件内容

标签:权限,管理,用户,kubeconfig,集群,Role,k8s,ClusterRole,K8S
From: https://www.cnblogs.com/yhtweirdo/p/17792434.html

相关文章

  • mysql-日志管理
    一、mysql日志文件的作用1、能记录物理数据页面的修改的信息;2、能将数据从逻辑上恢复至事务之前的状态;3、能以二进制文件的形式记录了数据库中的操作;4、能记录错误的相关信息;5、能从主服务器中二进制文件取的事件等等。普通日志记录了服务器接收到的每一个查询或是命......
  • Revit 自定义事务进行自动管理事务DBTrans实现
    第一步:自定义事务对象自定义事务对象///<summary>///自定义事务///</summary>publicclassDBTrans:IDisposable{#region私有字段privatebooldisposedValue;privatebool_commit;///<summary>......
  • 运营商光纤资源管理:管理工具的力量
    随着通信信息化水平发展,光纤资源已成为现代通信网络的核心要素之一。然而,管理却面临诸多挑战,尤其对于电信运营商而言,面对庞大而复杂的光纤网络资源,怎样做到既不浪费现有资源,又能满足未来业务需求,实现效益、价值最大化,如何更加快速高效抢修、提高网络及服务质量成为关注重点。以往,光......
  • Ajax的案例-任务管理
    任务添加(一)首先为该页面创建一个表编辑myproject/app01/models.pyclassTask(models.Model):"""任务"""level_choices=((1,"紧急"),(2,"重要"),(3,"临时"),)level=models.Sm......
  • 向上管理的两个职场案例
    之前分享过很多职场成长的内容,其中也聊了很多关于向上管理工作汇报的个人经验,最近好几个同学在公众号后台留言咨询,有没有比较实际的向上管理案例可以分享,想参照学习一下。正好,这几天在技术交流群和知识星球内部,遇到了几个典型的案例。这篇文章我会以遇到的这两个案例为例,为大家......
  • Django实战项目-学习任务系统-任务管理
    接着上期代码框架,开发第3个功能,任务管理,再增加一个学习任务表,用来记录发布的学习任务的标题和内容,预计完成天数,奖励积分和任务状态等信息。 第一步:编写第二个功能-用户注册1,编辑模型文件:./mysite/study_system/models.py:classStudyTask(models.Model):task_id=mod......
  • 项目管理之如何有效定义项目目标
    项目目标管理是项目管理中非常重要的一个环节,它可以帮助项目团队明确目标,制定合理可行的计划,确保项目顺利实施并取得成功。在定义项目目标时,需要遵循SMART原则,确保目标具体、明确、可衡量、可实现、相关且有时间和成本限制。同时,还需要采用项目目标责任矩阵,明确每个目标的责任人、......
  • 【软考高项】项目进度管理
    ......
  • 【软考高项】项目立项管理
    项目立项需要三个步骤:1)项目建议与立项申请2)项目可行性研究3)项目评估与决策每一个步骤都需要写一些文档,然后将文档送到下一个部门审核或审批,审批通过的话,就把提交的文档与审批文件一起作为下一个步骤的输入。......
  • 【软考高项】- 项目成本管理
    ......