当前位置:   article > 正文

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

kubectl修改文件权限

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)
  • 1

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
  • 1

step2 创建证书签名请求

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

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

可能会出现如下异常

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

执行以下命令 解决异常

cd /root
openssl rand -writerand .rnd
  • 1
  • 2

在这里插入图片描述

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
  • 1
  • -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 【指定命名空间】
  • 1
  • 2
  • 3

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"] 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

apiGroups配置项说明:

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

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

kubectl create namespace team2
  • 1

在这里插入图片描述

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"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

这样就完成了ClusterRole的创建

RoleBinding & ClusterRoleBinding

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

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

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: ""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

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

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

kubeconfig概念

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

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

在这里插入图片描述

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

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

使用 kubectl config view 命令可以看到

kubectl config view
  • 1

在这里插入图片描述

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

在这里插入图片描述

clusters (集群)

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

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

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 
  • 1
  • 2

在这里插入图片描述

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

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

在这里插入图片描述

其他命令说明

  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实战

需求:
指定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
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

产出物:
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: ""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

执行命令 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

这样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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

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

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/899138
推荐阅读
相关标签
  

闽ICP备14008679号