原文: 学一下https://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-clientusages:- 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-systemname: test
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["list"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: test-bindingnamespace: kube-system
subjects:
- kind: Username: test-userapiGroup: ""
roleRef:kind: Rolename: testapiGroup: ""
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"