快速上手k8s权限管理 立即掌握User Role RoleBinding kubeconfig 实战教程

k8s-权限学习总结

大纲

  • 1 k8s用户
  • 2 k8s角色
  • 3 kubeconfig概念
  • 4 kubeconfig配置与使用
  • 5 实战

k8s用户

k8s用户概念

K8S中有两种用户

  • 1 k8s内部服务之间访问的账号ServiceAccount (管理程序之间的访问)
  • 2 k8s外部用户访问集群的账号User (管理操作人的访问)

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

所有对K8S的API请求都需要绑定身份信息(User或者ServiceAccount)

User&ServiceAccount的区别:

  • 1 User是人来使用而ServiceAccount是为某个资源/程序/服务使用的
  • 2 K8S用户的创建管理都无需与K8S API交互,K8S所能认知的只有一个用户名。ServiceAccount是由K8S管理创建
  • 3 User独立在K8S之外并且需要在全局唯一,而ServiceAccount作为K8S内部的某种资源,是存在于某个命名空间之中的,在不同命名空间中的同名ServiceAccount被认为是不同的资源

k8s用户创建

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

step1 创建用户私钥

首先需要为此用户创建一个私钥

openssl genrsa -out jim.key 2048

step2 创建证书签名请求

使用此私钥创建一个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

在这里插入图片描述

step3 集群证书签署

使用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/kubernetes/pki 文件夹下

在这里插入图片描述

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

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

k8s角色

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

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

主要涉及4个Kind

  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding

Role & ClusterRole

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

Role是用来在某个名字空间内设置访问权限。所以创建 Role 时必须指定该 Role 所属的名字空间。

ClusterRole 则是一个集群作用域的资源。

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

这样就完成了角色的创建

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"]

在这里插入图片描述

这样就完成了ClusterRole的创建

RoleBinding & ClusterRoleBinding

角色绑定(RoleBinding & ClusterRoleBinding)是将角色中定义的权限赋予一个或者一组用户。

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

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

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

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: ""

在这里插入图片描述

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

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

kubeconfig概念

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

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

在这里插入图片描述

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

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

使用 kubectl config view 命令可以看到

kubectl config view

在这里插入图片描述

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

在这里插入图片描述

clusters (集群)

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

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

users(用户)

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

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

在这里插入图片描述

context(上下文)

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

kubeconfig配置与使用

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

在这里插入图片描述

可以使用–kubeconfig来实现操作哪个kubeconfig配置文件

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

在这里插入图片描述

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

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

在这里插入图片描述

其他命令说明

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

在这里插入图片描述

创建集群配置集群访问证书       
kubectl config  set-cluster k8s-test-cluster --server=https://192.168.0.160:6443 --embed-certs --certificate-authority=/medcrab/data/ca.crt

创建用户
kubectl config set-credentials jim --client-certificate=/medcrab/data/jim.crt --client-key=/medcrab/data/jim.key

创建上下文
kubectl config set-context jim@k8s-test-cluster  --cluster=k8s-test-cluster  --namespace=team2 --user=jim

指定上下文开始使用
kubectl get pods --context=jim@k8s-test-cluster

实战

需求:
指定liuyijiang这个用户使用跳板机操作k8s集群dev名字空间中一些项目部署的资源 例如pod replicationcontroller service deployment

涉及在两台机器上操作

  • 192.168.0.160 k8s-master
  • 192.168.0.211 跳板机

在这里插入图片描述

step1 创建用户

由于k8s集群证书在master机器上(签署用户证书的时候需要使用),所以先登录master机器 创建用户

mkdir -p /ops/k8s/user/liuyijiang

openssl genrsa -out liuyijiang.key 2048
openssl req -new -key liuyijiang.key -out liuyijiang.csr -subj "/CN=liuyijiang/O=DEV"
openssl x509 -req -in liuyijiang.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out liuyijiang.crt -days 365

在这里插入图片描述

产出物:
liuyijiang.crt liuyijiang.key 已经k8s集群证书 /etc/kubernetes/pki/ca.crt 这三个保存一下后面需要使用

step2 配置权限

创建demo.yaml文件用于创建命名空间 角色 角色绑定三个资源,此步骤也在k8s master机器上执行

demo.yaml内容如下:

apiVersion: v1
kind: Namespace  
metadata:
  name: dev  
  labels:
    user: liuyijiang 
    
---

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: devops-role
rules:
   - apiGroups: ["","apps","batch","autoscaling"] 
     resources: ["*"]
     verbs: ["*"]    

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: devops-role-binding
  namespace: dev
subjects:
  - kind: User
    name: liuyijiang 
    apiGroup: ""
roleRef:
  kind: Role  
  name: devops-role
  apiGroup: ""

执行命令 kubectl apply -f demo.yaml

在这里插入图片描述

step3 配置访问

由于需要实现跳板机操作k8s集群,所以这一步在跳板机上操作 跳板机ip:192.168.0.211

在跳板机上找一个文件夹,把step1中生产的liuyijiang.crt liuyijiang.key 以及k8s集群证书都保存到这里

然后开始配置kubeconfig

创建集群
kubectl config  set-cluster dev-cluster --server=https://192.168.0.160:6443 --embed-certs --certificate-authority=/data/liuyijiang/ca.crt

创建用户
kubectl config set-credentials liuyijiang --client-certificate=/data/liuyijiang/liuyijiang.crt --client-key=/data/liuyijiang/liuyijiang.key

创建上下文
kubectl config set-context liuyijiang@dev-cluster   --cluster=dev-cluster   --namespace=dev --user=liuyijiang

在这里插入图片描述

这样kubeconfig配置完成可以开始使用kubectl 操作集群了

step4 使用k8s

指定上下文开始使用
kubectl get pods --context=liuyijiang@dev-cluster

配置一下当前kubectl 命令的上下文
kubectl config use-context liuyijiang@dev-cluster
kubectl config current-context liuyijiang@dev-cluster
kubectl config get-contexts liuyijiang@dev-cluster

在这里插入图片描述

创建一个Pod
kubectl run myhttpservice --image=luksa/kubia --port=8080 --generator=run/v1
创建service
kubectl expose rc myhttpservice --type=NodePort --port 8080

在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SpringCloud是一款开源的微服务框架,OAuth2是一种授权框架,Vue是一个流行的前端框架,ElementUI是一套基于Vue开发的UI框架。结合这些技术栈进行前后端分离的快速上手项目实战开发,可以提高开发效率和代码的可维护性。 实践中,可以按照以下步骤进行快速上手项目开发: 1. 搭建后端服务:使用SpringCloud搭建微服务架构,并引入Spring Security和OAuth2来实现认证和授权功能,确保后端接口的安全性。 2. 配置OAuth2服务端:在后端服务中配置OAuth2的服务端,定义认证服务器和资源服务器,配置客户端信息,如客户端ID、客户端密钥等。 3. 开发前端界面:使用Vue构建前端界面,并引入ElementUI来快速搭建页面和组件。利用Vue的组件化开发方式,可以更高效地开发各种交互功能。 4. 实现登录认证:在前端界面中使用OAuth2的授权码模式来实现用户登录认证功能,通过向认证服务器发送请求来获取访问令牌,并将令牌保存到前端的Cookie或localStorage中。 5. 发起请求并解析响应:在前端界面中使用Axios库来发起HTTP请求,并在请求头中携带访问令牌,后端服务器根据令牌进行权限验证。前端收到响应后解析数据,并进行相应的操作。 6. 实现权限控制:根据后端接口的权限设定,在前端界面中进行权限控制,隐藏或禁用没有权限的功能。可以通过在请求头中携带用户的角色信息,与后端进行验证。 7. 编写测试用例:保证代码的质量和功能的稳定性,编写相应的测试用例来进行单元测试和接口测试,确保项目的正确运行。 通过以上步骤,可以快速上手实战开发SpringCloud、OAuth2、Vue和ElementUI结合的前后端分离项目。不仅可以提高开发效率,还能保证项目的安全性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞的4角钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值