kubernetes用户权限管理详解——普通用户[kubeconfig]

原文: 学一下icon-default.png?t=N7T8https://suxueit.com/article_detail/tdVymI4BWZdDRfKqnv1y

K8s 的用户分为两类

  • 普通用户:普通用户是指集群外部的人或系统管理,它们不由 Kubernetes 直接管理。普通用户的证书、密钥和权限管理通常由外部系统(如企业的用户目录服务)、证书颁发机构(CA)、第三方验证服务等负责。【kubeconfig就采用的普通用户】

  • 服务账号:服务账户主要用于在 Kubernetes 内部运行的进程和应用程序。它们是由 Kubernetes 自动管理的,并且可以通过 Kubernetes API 分配特定的权限。服务账户与部署它们的命名空间绑定,并且可以被分配权限来访问集群资源。这些账户的密钥和权限是由 Kubernetes 系统自动创建和管理的。【pod的服务需要访问k8s资源时,使用服务账号赋权限】

场景包括

  • 集群管理员:负责管理 Kubernetes 集群的用户,拥有最高权限,可以对集群中的资源进行任何操作

  • 开发者:在 Kubernetes 集群中部署和管理自己的应用,可能有限制的权限,仅能管理特定的命名空间或资源。

  • 第三方服务:需要与 Kubernetes 集群交互的外部系统或服务,如监控、日志管理等。

准备证书

普通用户需要通过证书进行验证,然后通过RBAC授权。因此需要先创建证书,创建证书有两种方式,通过k8s csr申请,直接通过命令创建

通过k8s csr申请

配置csr文件,用于生成密钥,配置用户为 test-user

test-user.json

{
  "CN": "test-user",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

生成密钥

cfssl genkey -initca test-user.json | cfssljson -bare test-user

向k8s 申请证书

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: test-user
spec:
  request: $(cat test-user.csr | base64 | tr -d '\n')
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
EOF

# 审批证书
kubectl certificate approve test-user
# 导出证书
kubectl get csr test-user -o jsonpath='{.status.certificate}' | base64 --decode > client.crt

使用openssl生成证书
#生成私钥: 用户名.key
openssl genrsa -out test-user-key.pem 2048  
​
#使用刚刚创建的私钥创, 建证书请求签名用户名.csr,在-subj中指定用户和组
openssl req -new -key test-user-key.pem -out test-user.csr -subj "/CN=test-user/O=k8s"
​
#在/etc/kubernetes/pki,找到找到kubernetes集群认证的ca.crt、ca.key。生成最终的证书client.crt,有效期30天
openssl x509 -req -in wang.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out client.crt -days 30
​
使用cfssl生成证书

配置一个ca配置文件

通过kubernetes 这个配置进行签发,有效期720小时,30天

{
 "signing": {
   "default": {
     "expiry": "438000h"
   },
   "profiles": {
     "kubernetes": {
       "usages": [
           "client auth"
       ],
       "expiry": "720h"
     }
   }
 }
}
​

签发证书

# 在上面的使用k8s 生成证书中
#已经用cfssl生成了密钥[test-user-key.pem]和签名【test-user.csr】文件
# 下面直接用k8s的证书签发client证书即可
​
cfssl sign -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config ca-config.json -profile=kubernetes test-user.csr | cfssljson -bare client123
​
​

创建用户

kubeconfig参数表示将设置应用于的文件,默认是 /root/.kube/config

设置一个新集群

如果在原有集群操作,则跳过这步

kubectl config set-cluster k8s \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://172.16.70.149:6443 \
--kubeconfig=test-config
  • --certificate-authority: 集群的ca证书

    • 如果采用kubeadm创建的集群该证书在 /etc/kubernetes/pki/ca.crt

    • 二进制安装的则是自己安装集群时生成的ca证书

  • --embed-certs: 是否将证书内嵌,如果为false则生成的文件保留的是 证书的路径

  • --server: 集群api-server的地址

设置一个用户

设置用户 test-user

kubectl config set-credentials test-user \
--client-certificate=./client.pem \
--client-key=./test-user-key.pem \
--embed-certs=true \
--kubeconfig=test-config 
  • --client-certificate: 在前面生成的客户端的证书

  • --client-key:在前面生成的 客户端公钥,在前面生成的

设置上下文

设置一个上下文,上下文名称为 default,指定集群为k8s,用户为test-user

kubectl config set-context default \
--cluster=k8s \ # 如果第一步创建集群跳过了,这里需要填写原有config中的集群
--user="test-user" \
--kubeconfig=test-config

切换上下文

设定当前使用的上下文

kubectl config use-context default --kubeconfig=test-config

为用户授权

1、创建一个test角色,给出在kube-system 这个命令空间list pod的权限,

2、将角色与用户进行绑定

cat <<EOF | kubectl apply -f -
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: kube-system
  name: test
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: test-binding
  namespace: kube-system
subjects:
- kind: User
  name: test-user
  apiGroup: ""
roleRef:
  kind: Role
  name: test
  apiGroup: ""
EOF

演示

演示

 kubectl get pods -n kube-system  --kubeconfig=test-config

图片

# 这里只给了 list权限,因此get单个pod就提示权限不足了kubectl get pods -n kube-system  --kubeconfig=test-config calico-node-8r9nwError from server (Forbidden): pods "calico-node-8r9nw" is forbidden: User "test-user" cannot get resource "pods" in API group "" in the namespace "kube-system"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值