kubernetes授予用户指定命名空间的使用权限

kubernetes授予用户指定命名空间的使用权限

问题描述

假如我们部门来了个新同事,他需要使用kubernetes集群,但是因为他刚来,还不熟悉,所以不能直接将kubernetes集群的所有权限给他,我希望他能够在test这个namespace里面操作,对于其他的namespace,则都没有权限,那么我应该如何给这个用户授权呢?

可以通过kubernetes的RBAC机制来完成授权工作,只给某个用户某个namespace的权限

在 Kubernetes 中,RBAC 是一种强大的访问控制机制,用于管理对集群资源的访问权限。RBAC 可以帮助管理员精确地控制用户、ServiceAccount 或其他实体对 Kubernetes API 中资源的操作权限。RBAC 基于角色的授权模型使得管理员可以定义角色和角色绑定,从而实现对不同用户或实体的访问权限控制

具体实现

示例,加入我需要给用户lilei授权test命名空间的完全使用权限

  1. 用K8S CA签发客户端证书 基于证书的客户端认证方式
  2. 创建RBAC权限策略 做一定的权限分配
  3. 生成kubeconfig授权文件 kubectl使用kubeconfig连接集群

最终目的也就是生成一个kubeconfig文件,让指定用户拿着这个文件去访问集群

签发客户端证书

  1. 安装签发证书服务cfssl
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl*
mv cfssl_linux-amd64 /usr/bin/cfssl
mv cfssljson_linux-amd64 /usr/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
  1. 使用k8s CA签发客户端证书
    如果是使用kubeadm部署的kubernetes集群,那么根证书存放在/etc/kubernetes/pki中
root@master:~# ls /etc/kubernetes/pki/
apiserver.crt              apiserver-etcd-client.key  apiserver-kubelet-client.crt  ca.crt  etcd                front-proxy-ca.key      front-proxy-client.key  sa.pub
apiserver-etcd-client.crt  apiserver.key              apiserver-kubelet-client.key  ca.key  front-proxy-ca.crt  front-proxy-client.crt  sa.key

提前创建配置文件

root@master:~# cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
        "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ],
        "expiry": "87600h"
      }
    }
  }
}
EOF
 
#API Server会把客户端证书的CN字段作为User,把names.O字段作为Group。k8s在校验授权的时候就会读取这两个字段
root@master:~# cat > lulei-csr.json <<EOF
{
  "CN": "lilei",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShenZhen",
      "L": "ShenZhen",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

cfssl使用根证书来签发lilei客户端的证书

cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lilei-csr.json | cfssljson -bare lilei

签发完成会在当前目录下产生lulei-key.pem lulei.pem 两个文件
上面就是客户端证书,有多个用户需要生成多个

  • lilei-key.pem 私钥 类似配置nginx https访问 .key私钥
  • lilei.pem 数字证书 类似配置nginx https访问的 .crt证书

创建RBAC策略

  1. 创建rbac策略,也就是创建一个role角色,然后进行rolebinding绑定,这里授予了这个用户dev namespace下的所有权限(可根据实际需求更改)
root@master:~# cat > rbac.yaml <<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: test
  name: pod-reader
rules:          
- apiGroups: ["", "apps", "batch", "networking.k8s.io"]  #deployments属于apss这个资源对象里面;里面为空,为核心的api组,常用的资源都在核心组里面
  resources: ["deployments", "pods", "services", "pods/exec", "ingresses", "secrets", "pods/log"]
  verbs: ["get", "list", "watch", "create", "delete", "update", "patch"]  #资源操作方法
--- 
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: test
subjects:
- kind: User
  name: lilei
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
EOF

root@master:~# kubectl apply -f rbac.yaml

生成kubeconfig文件

  1. 集群参数设置
root@master:~# kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/pki/ca.crt \
  --embed-certs=true \
  --server=https://10.98.99.140:6443 \
  --kubeconfig=lulei.kubeconfig

#然后当前目录下会生成一个lilei.kubeconfig文件

本段设置了所需要访问的集群的信息。
使用set-cluster设置了需要访问的集群,如上为kubernetes,这只是个名称,实际为–server指向的apiserver
–certificate-authority设置了该集群的公钥
–embed-certs为true表示将–certificate-authority证书写入到kubeconfig中
–server则表示该集群的kube-apiserver地址
生成的kubeconfig 被保存到 lilei.kubeconfig文件

  1. 用户参数设置
root@master:~# kubectl config set-credentials lulei \
  --client-key=lulei-key.pem \
  --client-certificate=lulei.pem \
  --embed-certs=true \
  --kubeconfig=lilei.kubeconfig

#会追加user信息到lilei.kubeconfig文件中,注意,当前目录下需要有lilei-key.pem和lilei.pem

本段主要设置用户的相关信息,主要是用户证书。如上的用户名为lilei,证书为:lilei.pem,私钥为:lilei-key.pem。注意客户端的证书首先要经过集群CA的签署,否则不会被集群认可。此处使用的是ca认证方式,也可以使用token认证,如kubelet的 TLS Boostrap机制下的bootstrapping使用的就是token认证方式。上述kubectl使用的是ca认证,不需要token字段

  1. 上下文参数设置
root@master:~# kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=lilei \
  --kubeconfig=lulei.kubeconfig
  
#会追加context信息到lilei.kubeconfig文件中

集群参数和用户参数可以同时设置多对,在上下文参数中将集群参数和用户参数关联起来。上面的上下文名称为kubenetes,集群为kubenetes,用户为lilei,表示使用lilei的用户凭证来访问kubenetes集群的default命名空间,也可以增加–namspace来指定访问的命名空间。

  1. 设置当前使用的配置
#切换context为kubernetes,集群默认的context为kubernetes-admin@kubernetes,如果root用户直接执行这个会失败,因为当前root用的kubeconfig文件中没有kubernetes这个context的信息,下面第二种指定kubeconfig即可
kubectl config use-context kubernetes
kubectl config use-context kubernetes --kubeconfig=lulei.kubeconfig
#列出可用的上下文,跟你的当前用户的kubeconfig设置有关
kubectl config get-contexts <name>
#列出当前使用的上下文
kubectl config current-context <name>
#设置新的上下文,可以包括集群、用户和命名空间
kubectl config set-context <name> [--cluster=<cluster>] [--user=<user>] [--namespace=<namespace>]
#删除指定上下文
kubectl config delete-context <name>
#可以查看当前kubeconfig的内容,包括集群、用户、上下文等配置信息
kubectl config view

最终生成的kubeconfig文件就是lilei.kubeconfig,将其复制到某个用户的的.kube文件中,就可以使用该限制了

相关推荐

  1. kubernetes授予用户指定命名空间使用权限

    2024-07-11 23:10:02       25 阅读
  2. hive授予指定用户特定权限及beeline使用

    2024-07-11 23:10:02       32 阅读
  3. 创建用户 admin 并授予 sudo管理员权限方法

    2024-07-11 23:10:02       63 阅读
  4. 方案:如何列出 Jira 中授予用户所有权限

    2024-07-11 23:10:02       53 阅读
  5. 如何在 MySQL 中创建新用户授予权限

    2024-07-11 23:10:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 23:10:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 23:10:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 23:10:02       58 阅读
  4. Python语言-面向对象

    2024-07-11 23:10:02       69 阅读

热门阅读

  1. 开发中缓存的使用场景、注意事项及优缺点分析

    2024-07-11 23:10:02       21 阅读
  2. C# 如何单纯的优化循环

    2024-07-11 23:10:02       23 阅读
  3. .Net Core 微服务之Consul(一)

    2024-07-11 23:10:02       19 阅读
  4. YOLO 在OPENCV QT上如何使用?

    2024-07-11 23:10:02       23 阅读
  5. 技术成神之路:设计模式(一)单例模式

    2024-07-11 23:10:02       21 阅读
  6. perl语言入门学习

    2024-07-11 23:10:02       23 阅读
  7. Postman中的数据堡垒:API测试数据隔离的精粹

    2024-07-11 23:10:02       21 阅读
  8. JlmPack在医疗行业的使用

    2024-07-11 23:10:02       18 阅读
  9. Git-Updates were rejected 解决

    2024-07-11 23:10:02       22 阅读
  10. 一句话回答的前端面试题

    2024-07-11 23:10:02       21 阅读
  11. 使用Python进行计算机视觉

    2024-07-11 23:10:02       20 阅读
  12. 从零手写实现 nginx-25-directive map 条件判断指令

    2024-07-11 23:10:02       19 阅读
  13. OWASP ZAP

    OWASP ZAP

    2024-07-11 23:10:02      19 阅读