K8S默认基于sa进行认证

在这里插入图片描述
在这里插入图片描述

1. 为何需要Service Account

Kubernetes原生(kubernetes-native)托管就支持sa账号,通常需要直接与API Server进行交互以获取必要的信息。
API Server同样需要对这类来自于Pod资源中客户端程序进行身份验证,Service Account也就是设计专用于这类场景的账号。
ServiceAccount是API Server支持的标准资源类型之一。

  • 1.基于资源对象保存ServiceAccount的数据;
  • 2.认证信息保存于ServiceAccount对象专用的Secret中(v1.23-版本)
  • 3.支持名称空间级别,专供集群上的Pod中的进程访问API Server时使用;

2. Pod使用ServiceAccount方式

在Pod上使用Service Account通常有两种方式:

  • 自动设定
    Service Account通常由API Server自动创建并通过ServiceAccount准入控制器自动关联到集群中创建的每个Pod上。
    如果Pod没有定义serviceAccountName字段,则默认使用当前名称空间下的一个"default"的sa账号。

创建sa并让pod引用指定的sa

# sa-pods.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: oldboy
#创建一个oldboy的sa
---
apiVersion: v1
kind: Pod
metadata:
  name: oldboyedu-pods-sa
spec:
  # 使用sa的名称
  serviceAccountName: oldboy  #记住pod如何引用sa
  containers:
  - name: c1
    image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1
[root@master231 auth]# kubectl apply -f  sa-pods.yaml 
serviceaccount/oldboy created
pod/oldboyedu-pods-sa created

[root@master231 auth]# kubectl get pods,sa -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE   READINESS GATES
pod/oldboyedu-pods-sa   1/1     Running   0          5s    10.100.2.2   worker233   <none>           <none>

NAME                     SECRETS   AGE
serviceaccount/default   1         8d     #自己默认创建的
serviceaccount/oldboy    1         5s     #自定义创建的

5. 验证pod使用sa的验证身份

[root@master231 auth]# kubectl exec -it oldboyedu-pods-sa -- sh  进入到这个pod内部
/ # ls -l /var/run/secrets/kubernetes.io/serviceaccount     #这是认证信息默认的挂载点
total 0
lrwxrwxrwx    1 root     root            13 Sep 28 01:17 ca.crt -> ..data/ca.crt
lrwxrwxrwx    1 root     root            16 Sep 28 01:17 namespace -> ..data/namespace
lrwxrwxrwx    1 root     root            12 Sep 28 01:17 token -> ..data/token

/ # cat /var/run/secrets/kubernetes.io/serviceaccount/token 
eyJhbGciOiJSUzI1NiIsImtpZCI6IkR0dEIwTzJGbFJlN2xFVUNUZGRhV2tkS3BSS3RlZzVKZ3V6dVJjdDh4NkkifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLm9sZGJveWVkdS5jb20iXSwiZXhwIjoxNzkwNTU4MjUzLCJpYXQiOjE3NTkwMjIyNTMsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5vbGRib3llZHUuY29tIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0IiwicG9kIjp7Im5hbWUiOiJvbGRib3llZHUtcG9kcy1zYSIsInVpZCI6ImQzMjhmZTdmLWFjMDYtNGQ5Ni05NmUxLTkwMGZmNWFkZWE3ZiJ9LCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoib2xkYm95IiwidWlkIjoiNDEzYzJhNmItOWZiYS00OTRiLTg2MDctMTg4ZTdmMzNmMzNlIn0sIndhcm5hZnRlciI6MTc1OTAyNTg2MH0sIm5iZiI6MTc1OTAyMjI1Mywic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6b2xkYm95In0.ZkBLHVNGdgK_ooSbUQ8CYgledKWKVXS-I067uuxNJ2ovZN8SCKpqEAHIfJtSmW0GPPr8WwSXEX8HYoznRWY4U6nkK6gkXVnbjmsg3VS9blwvYa2bF_27zuvUQXgS_10aK_AwbEVVzgXuvLHa9eAe53bMGI3H3x93Qc4OSukHHDmFo_kCRY-K03lgb0nEP7jXWv8O-exeEuaADe79DpiGODRymPh_8RxkxCpNlJfO0at8dsogLr9qIw3er-J0uAoAiMjI8J4Se1_IF-BhN2UPvG19cApXfpvZfp76WWIL2UNR69C0InXYOoIsfeEWyCduytw-awoe0X964NGWEJX7KA/ # 
/ # 
/ # 
/ # TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`  #存在变量中
/ # 
/ # curl -k -H "Authorization: Bearer ${TOKEN}" https://kubernetes.default.svc.oldboyedu.com;echo
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "forbidden: User \"system:serviceaccount:default:oldboy\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {},
  "code": 403
}
#直接去认证试一下,指向api-server
#使用的是名为 oldboy 的 Service Account(位于 default 命名空间),完整身份为: system:serviceaccount:default:oldboy

clusteradmin管理员角色绑定用户实战

相关角色说明:

从权限角度而言,其中cluster-admin相当于Linux的root用户。
其次是admin,edit和view权限依次减小。其中view权限最小,对于的大多数资源只能读取。

2. 查看集群角色’cluster-admin’相当于Linux的root用户。

[root@master231 pods]# kubectl get clusterrole cluster-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: "2025-05-22T02:57:49Z"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "86"
  uid: 7324f527-e03e-425a-a4ba-3f4dca4a6017
rules:#对所有核心组的所有核心资源有执行权限,相当于Linux的root权限
- apiGroups:
  - '*'
  resources:
  - '*'
  verbs:
  - '*'
- nonResourceURLs:
  - '*'
  verbs:
  - '*'
#所以我们集群角色创建好了,用户也创建好了,只要创建一个bind就可以跑起来了

2. 将我们自定义的kubeconfig文件的用户进行授权案例

2.1 环境准备未授权前
[root@worker232 ~]# kubectl get pods --kubeconfig=yinzhengjie-k8s-token.conf   #未授权的时候无法,无法操作
Error from server (Forbidden): pods is forbidden: User "yinzhengjie" cannot list resource "pods" in API group "" in the namespace "default"
2.2 授权用户:授权集群角色cluster-admin给用户yinzhengjie。这样一个绑定组设置名称为myuser
[root@master231 rbac]# kubectl create clusterrolebinding myuser --clusterrole=cluster-admin --user=yinzhengjie
clusterrolebinding.rbac.authorization.k8s.io/myuser created
2.3 查看集群角色绑定信息
[root@master231 rbac]# kubectl get clusterrolebindings myuser 
NAME     ROLE                        AGE
myuser   ClusterRole/cluster-admin   90s

[root@master231 rbac]# kubectl get clusterrolebindings myuser  -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: "2025-09-28T01:38:24Z"
  name: myuser
  resourceVersion: "351947"
  uid: 0dc22252-346c-49f3-b136-c6a8fd5b15b9
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: yinzhengjie
2.4 验证权限
[root@worker232 ~]# kubectl get pods --kubeconfig=yinzhengjie-k8s-token.conf -n kube-system  想看某个名称空间的资源想看就看
NAME                                READY   STATUS    RESTARTS        AGE
coredns-6d8c4cb4d-s85bq             1/1     Running   212 (66m ago)   8d
coredns-6d8c4cb4d-tdrnj             1/1     Running   211 (66m ago)   8d
etcd-master231                      1/1     Running   3 (66m ago)     8d
kube-apiserver-master231            1/1     Running   1 (66m ago)     18h
kube-controller-manager-master231   1/1     Running   19 (66m ago)    8d
kube-proxy-55jhz                    1/1     Running   3 (66m ago)     3d21h
kube-proxy-7ffbs                    1/1     Running   7 (66m ago)     3d21h
kube-proxy-xgqln                    1/1     Running   4 (66m ago)     3d21h
kube-scheduler-master231            1/1     Running   19 (66m ago)    8d

[root@worker232 ~]# kubectl get nodes --kubeconfig=yinzhengjie-k8s-token.conf
NAME        STATUS   ROLES                  AGE   VERSION
master231   Ready    control-plane,master   8d    v1.23.17
worker232   Ready    <none>                 8d    v1.23.17
worker233   Ready    <none>                 8d    v1.23.17
2.5 删除绑定关系
[root@master231 rbac]# kubectl get clusterrolebindings myuser 
NAME     ROLE                        AGE
myuser   ClusterRole/cluster-admin   2m18s

[root@master231 rbac]# kubectl delete clusterrolebindings myuser 
clusterrolebinding.rbac.authorization.k8s.io "myuser" deleted

[root@master231 rbac]# kubectl get clusterrolebindings myuser 
Error from server (NotFound): clusterrolebindings.rbac.authorization.k8s.io "myuser" not found
2.6 验证客户端权限会立即生效:发现删除权限之后无法进行控制
[root@worker232 ~]# kubectl get nodes --kubeconfig=yinzhengjie-k8s-token.conf
Error from server (Forbidden): nodes is forbidden: User "yinzhengjie" cannot list resource "nodes" in API group "" at the cluster scope

所以master中的kubernetes-admin用户
kubernetes-admin 用户:这是证书中的 CN(Common Name),通常通过 system:masters 组间接绑定到 cluster-admin 角色。


Role授权给一个用户类型实战

1. 未授权前测试:根据认证策略优先级,把这个认证文件放到这个目录下可以,直接认证,则不需要加—kubeconifg这个参数

[root@worker233 ~]# cp yinzhengjie-k8s-certs.conf  ~/.kube/config
[root@worker233 ~]# kubectl get pods -o wide 
Error from server (Forbidden): pods is forbidden: User "jiege" cannot list resource "pods" in API group "" in the namespace "default"

[root@worker233 ~]# kubectl config view 
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: https://10.0.0.231:6443
  name: myk8s
contexts:
- context:
    cluster: myk8s
    user: jiege
  name: jiege@myk8s
current-context: jiege@myk8s
kind: Config
preferences: {}
users:
- name: jiege
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

2. 创建Role:定义一个角色

[root@master231 ~]# kubectl create role reader --resource=po,svc --verb=get,watch,list -o yaml --dry-run=client  # 声明式查看
apiVersion: rbac.authorization.k8s.io/v1    #下面是给用户的一些授权
kind: Role
metadata:
  creationTimestamp: null
  name: reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - services
  verbs:
  - get
  - watch
  - list
- apiGroups:
  - apps
  resources:
  - deployments
  verbs:
  - get
  - watch
  - list

#创建角色
[root@master231 ~]# kubectl create role reader --resource=po,svc,deploy --verb=get,watch,list  # 响应式创建了叫reader的角色
role.rbac.authorization.k8s.io/reader created   #可以操作po,svc,deploy资源,可以执行get,watch,list等操作。不用关心什么组

[root@master231 ~]# kubectl get role
NAME     CREATED AT
reader   2025-09-28T02:24:49Z

3. 创建角色绑定:将创建的角色reader和用户jiege进行绑定

[root@master231 ~]# kubectl create rolebinding jiege-as-reader --user=jiege --role=reader -o yaml --dry-run=client    #这个是获取资源清单
apiVersion: rbac.authorization.k8s.io/v1  
kind: RoleBinding
metadata:
  creationTimestamp: null
  name: jiege-as-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: jiege

[root@master231 ~]# kubectl create rolebinding jiege-as-reader --user=jiege --role=reader         #真正的创建
rolebinding.rbac.authorization.k8s.io/jiege-as-reader created

[root@master231 ~]# kubectl get rolebindings  -o wide
NAME              ROLE          AGE   USERS   GROUPS   SERVICEACCOUNTS
jiege-as-reader   Role/reader   25s   jiege            

4. 授权后再次验证

[root@worker233 ~]# kubectl get pods,svc,deploy
NAME                                                  READY   STATUS    RESTARTS   AGE
pod/deploy-xiuxian-6f5c7c558b-49h7j                   1/1     Running   0          84s
pod/deploy-xiuxian-6f5c7c558b-ljnkk                   1/1     Running   0          84s
pod/deploy-xiuxian-6f5c7c558b-qmps9                   1/1     Running   0          84s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-75d4c   1/1     Running   0          84s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-cbl79   1/1     Running   0          84s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-fg6jc   1/1     Running   0          84s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.200.0.1   <none>        443/TCP   23h

NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-xiuxian                   3/3     3            3           84s
deployment.apps/deploy-xiuxian-imagepullpolicy   3/3     3            3           84s

[root@worker233 ~]# kubectl delete pods --all   没有给jiege删除权限,所以无法操作
Error from server (Forbidden): pods "deploy-xiuxian-6f5c7c558b-49h7j" is forbidden: User "jiege" cannot delete resource "pods" in API group "" in the namespace "default"
Error from server (Forbidden): pods "deploy-xiuxian-6f5c7c558b-ljnkk" is forbidden: User "jiege" cannot delete resource "pods" in API group "" in the namespace "default"
Error from server (Forbidden): pods "deploy-xiuxian-6f5c7c558b-qmps9" is forbidden: User "jiege" cannot delete resource "pods" in API group "" in the namespace "default"
Error from server (Forbidden): pods "deploy-xiuxian-imagepullpolicy-5c4f574cf6-75d4c" is forbidden: User "jiege" cannot delete resource "pods" in API group "" in the namespace "default"
Error from server (Forbidden): pods "deploy-xiuxian-imagepullpolicy-5c4f574cf6-cbl79" is forbidden: User "jiege" cannot delete resource "pods" in API group "" in the namespace "default"
Error from server (Forbidden): pods "deploy-xiuxian-imagepullpolicy-5c4f574cf6-fg6jc" is forbidden: User "jiege" cannot delete resource "pods" in API group "" in the namespace "default"

[root@worker233 ~]# kubectl get pods -n kube-system  #也没给权限,role只能给到某个名称空间下的操作
Error from server (Forbidden): pods is forbidden: User "jiege" cannot list resource "pods" in API group "" in the namespace "kube-system"

5. 响应式修改权限:将 -o yaml --dry-run=client删除就是声明的修改

[root@master231 ~]# kubectl create role reader --resource=po,svc,deploy --verb=get,watch,list,delete -o yaml --dry-run=client | kubectl apply -f -
Warning: resource roles/reader is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
role.rbac.authorization.k8s.io/reader configured

6. 测试验证

[root@worker233 ~]# kubectl get pods,svc,deploy
NAME                                                  READY   STATUS    RESTARTS   AGE
pod/deploy-xiuxian-6f5c7c558b-49h7j                   1/1     Running   0          2m52s
pod/deploy-xiuxian-6f5c7c558b-ljnkk                   1/1     Running   0          2m52s
pod/deploy-xiuxian-6f5c7c558b-qmps9                   1/1     Running   0          2m52s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-75d4c   1/1     Running   0          2m52s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-cbl79   1/1     Running   0          2m52s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-fg6jc   1/1     Running   0          2m52s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.200.0.1   <none>        443/TCP   23h

NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-xiuxian                   3/3     3            3           2m52s
deployment.apps/deploy-xiuxian-imagepullpolicy   3/3     3            3           2m52s

[root@worker233 ~]# kubectl delete pods --all
pod "deploy-xiuxian-6f5c7c558b-49h7j" deleted
pod "deploy-xiuxian-6f5c7c558b-ljnkk" deleted
pod "deploy-xiuxian-6f5c7c558b-qmps9" deleted
pod "deploy-xiuxian-imagepullpolicy-5c4f574cf6-75d4c" deleted
pod "deploy-xiuxian-imagepullpolicy-5c4f574cf6-cbl79" deleted
pod "deploy-xiuxian-imagepullpolicy-5c4f574cf6-fg6jc" deleted
[root@worker233 ~]# 
[root@worker233 ~]# kubectl get pods,svc,deploy
NAME                                                  READY   STATUS    RESTARTS   AGE
pod/deploy-xiuxian-6f5c7c558b-85hb9                   1/1     Running   0          7s
pod/deploy-xiuxian-6f5c7c558b-gt8f7                   1/1     Running   0          7s
pod/deploy-xiuxian-6f5c7c558b-sz66v                   1/1     Running   0          7s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-26rnm   1/1     Running   0          7s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-b5w6d   1/1     Running   0          7s
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-cpkgc   1/1     Running   0          7s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.200.0.1   <none>        443/TCP   23h

NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-xiuxian                   3/3     3            3           3m2s
deployment.apps/deploy-xiuxian-imagepullpolicy   3/3     3            3           3m2s

7. 声明式修改权限:另一种方法声明式修改把deploy权限删了

[root@master231 ~]# kubectl create role reader --resource=po,svc --verb=get,watch,list -o yaml --dry-run=client
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - services
  verbs:
  - get
  - watch
  - list

[root@master231 ~]# kubectl create role reader --resource=po,svc --verb=get,watch,list -o yaml --dry-run=client > /tmp/reader.yaml
[root@master231 ~]# kubectl apply -f /tmp/reader.yaml
role.rbac.authorization.k8s.io/reader configured

8. 测试验证

[root@worker233 ~]# kubectl get deploy,svc,po -o wide
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/kubernetes   ClusterIP   10.200.0.1   <none>        443/TCP   23h   <none>

NAME                                                  READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
pod/deploy-xiuxian-6f5c7c558b-85hb9                   1/1     Running   0          2m47s   10.100.1.162   worker232   <none>           <none>
pod/deploy-xiuxian-6f5c7c558b-gt8f7                   1/1     Running   0          2m47s   10.100.2.7     worker233   <none>           <none>
pod/deploy-xiuxian-6f5c7c558b-sz66v                   1/1     Running   0          2m47s   10.100.2.8     worker233   <none>           <none>
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-26rnm   1/1     Running   0          2m47s   10.100.1.163   worker232   <none>           <none>
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-b5w6d   1/1     Running   0          2m47s   10.100.1.164   worker232   <none>           <none>
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-cpkgc   1/1     Running   0          2m47s   10.100.1.161   worker232   <none>           <none>
Error from server (Forbidden): deployments.apps is forbidden: User "jiege" cannot list resource "deployments" in API group "apps" in the namespace "default"

ClusterRole授权给一个用户组类型的角色

1. 授权前测试

[root@worker232 ~]# kubectl config view --kubeconfig=yinzhengjie-k8s-token.conf
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.0.0.231:6443
  name: myk8s
contexts:
- context:
    cluster: myk8s
    user: jasonyin
  name: jasonyin@myk8s
- context:
    cluster: myk8s
    user: yinzhengjie
  name: yinzhengjie@myk8s
current-context: yinzhengjie@myk8s
kind: Config
preferences: {}
users:
- name: jasonyin
  user:
    token: REDACTED
- name: yinzhengjie
  user:
    token: REDACTED

#我现在想给用户所在的组进行授权,而不是给某个用户授权。
[root@worker232 ~]# kubectl get pods --kubeconfig=./yinzhengjie-k8s-token.conf
Error from server (Forbidden): pods is forbidden: User "yinzhengjie" cannot list resource "pods" in API group "" in the namespace "default"

2. 创建集群角色

[root@master231 ~]# kubectl create clusterrole reader --resource=deploy,rs,pods --verb=get,watch,list  -o yaml --dry-run=client  #查看效果而已
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - watch
  - list
- apiGroups:
  - apps
  resources:
  - deployments
  - replicasets
  verbs:
  - get
  - watch
  - list

[root@master231 ~]# kubectl create clusterrole reader --resource=deploy,rs,pods --verb=get,watch,list   #响应式创建
clusterrole.rbac.authorization.k8s.io/reader created

[root@master231 ~]# kubectl get clusterrole reader 
NAME     CREATED AT
reader   2025-09-28T02:37:35Z

3. 将集群角色绑定给k8s组

[root@master231 ~]# cat /etc/kubernetes/pki/token.csv 
b4gp4h.tqnqlkov8zzbzuot,yinzhengjie,10001,k8s
53llgt.n4xci771guevocbk,jasonyin,10002,k8s
m7k336.omp1yul0w1i3t0pp,linux97,10003,k3s
6i2rhg.lwhnrkihqbyck41w,linux98,10004,k3s
4ixflg.nnbo21v9waa9bqr4,linux99,10005,k3s
1y3yb0.j7f3lh93tqbqo28s,linux100,10006,k3s

#关联集群角色
[root@master231 ~]# kubectl create clusterrolebinding k8s-as-reader --clusterrole=reader --group=k8s -o yaml --dry-run=client 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: null
  name: k8s-as-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: k8s

[root@master231 ~]# kubectl create clusterrolebinding k8s-as-reader --clusterrole=reader --group=k8s   响应式关联
clusterrolebinding.rbac.authorization.k8s.io/k8s-as-reader created  

[root@master231 ~]# kubectl get clusterrolebindings k8s-as-reader 
NAME            ROLE                 AGE
k8s-as-reader   ClusterRole/reader   10s

[root@master231 ~]# kubectl get clusterrolebindings k8s-as-reader -o wide
NAME            ROLE                 AGE   USERS   GROUPS   SERVICEACCOUNTS
k8s-as-reader   ClusterRole/reader   25s           k8s      

4. 基于kubeconfig测试

[root@worker232 ~]# kubectl get deploy,rs,pod  --kubeconfig=./yinzhengjie-k8s-token.conf
NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-xiuxian                   3/3     3            3           13m
deployment.apps/deploy-xiuxian-imagepullpolicy   3/3     3            3           13m

NAME                                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-xiuxian-6f5c7c558b                   3         3         3       13m
replicaset.apps/deploy-xiuxian-imagepullpolicy-5c4f574cf6   3         3         3       13m

NAME                                                  READY   STATUS    RESTARTS   AGE
pod/deploy-xiuxian-6f5c7c558b-85hb9                   1/1     Running   0          10m
pod/deploy-xiuxian-6f5c7c558b-gt8f7                   1/1     Running   0          10m
pod/deploy-xiuxian-6f5c7c558b-sz66v                   1/1     Running   0          10m
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-26rnm   1/1     Running   0          10m
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-b5w6d   1/1     Running   0          10m
pod/deploy-xiuxian-imagepullpolicy-5c4f574cf6-cpkgc   1/1     Running   0          10m

[root@worker232 ~]# kubectl get no --kubeconfig=./yinzhengjie-k8s-token.conf   #因为没有给no的权限
Error from server (Forbidden): nodes is forbidden: User "yinzhengjie" cannot list resource "nodes" in API group "" at the cluster scope
#no不行

5. 基于token测试:clusterrole是全局资源,-A所有名称空间下都可以执行我定义的操作

[root@worker232 ~]# kubectl --server=https://10.0.0.231:6443 --token=b4gp4h.tqnqlkov8zzbzuot --certificate-authority=/etc/kubernetes/pki/ca.crt  get deploy -o wide  -A
NAMESPACE        NAME                               READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                                                   SELECTOR
default          deploy-xiuxian-sa-secrets-harbor   3/3     3            3           5h41m   c1           harbor250.oldboyedu.com/oldboyedu-xiuxian/apps:v3        apps=v1
kube-system      coredns                            2/2     2            2           9d      coredns      registry.aliyuncs.com/google_containers/coredns:v1.8.6   k8s-app=kube-dns
metallb-system   controller                         1/1     1            1           2d22h   controller   quay.io/metallb/controller:v0.15.2                       app=metallb,component=controller

[root@worker232 ~]# kubectl --server=https://10.0.0.231:6443 --token=qo7azt.y27gu4idn5cunudd --certificate-authority=/etc/kubernetes/pki/ca.crt  get deploy,rs,po -o wide -A  # 很明显,linux99属于k3s分组,不属于K8S组的,因此无法访问!
Error from server (Forbidden): deployments.apps is forbidden: User "linux99" cannot list resource "deployments" in API group "apps" at the cluster scope
Error from server (Forbidden): replicasets.apps is forbidden: User "linux99" cannot list resource "replicasets" in API group "apps" at the cluster scope
Error from server (Forbidden): pods is forbidden: User "linux99" cannot list resource "pods" in API group "" at the cluster scope

6. 更新权限,直接重新加就行了

[root@master231 ~]# kubectl create clusterrole reader --resource=deploy,pods,no --verb=get,watch,list  -o yaml --dry-run=client | kubectl apply -f -
Warning: resource clusterroles/reader is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
clusterrole.rbac.authorization.k8s.io/reader configured

7. 测试验证

[root@worker232 ~]# kubectl get no --kubeconfig=./yinzhengjie-k8s-token.conf
NAME        STATUS   ROLES                  AGE   VERSION
master231   Ready    control-plane,master   8d    v1.23.17
worker232   Ready    <none>                 8d    v1.23.17
worker233   Ready    <none>                 8d    v1.23.17

ClusterRole授权给一个ServiceAccount类型,所以我们要创建一个账号,基于这个账号进行认证,一般给开发

1. 导入镜像:客串一下运维开发

[root@worker233 ~]# wget http://192.168.16.253/Resources/Kubernetes/Case-Demo/Python/python-v3.9.16.tar.gz
[root@worker233 ~]# docker load -i python-v3.9.16.tar.gz 
[root@worker233 ~]# docker tag python:3.9.16-alpine3.16 harbor250.oldboyedu.com/oldboyedu-casedemo/python:3.9.16-alpine3.16
[root@worker233 ~]# docker push harbor250.oldboyedu.com/oldboyedu-casedemo/python:3.9.16-alpine3.16
docker pull harbor250.oldboyedu.com/oldboyedu-casedemo/python:3.9.16-alpine3.16

2. 编写资源清单

[root@master231 rbac]#
cat > oldboyedu-sa-rbac.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: kube-public
  name: oldboy
#创建sa账户名字为oldboy,并且指定资源空间在kube-public
---
#这个pod给对应的sa账号
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xiuxian
  namespace: kube-public
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xiuxian
  template:
    metadata:
      labels:
        app: xiuxian
    spec:
      nodeName: worker232
      serviceAccountName: oldboy
      containers:
      - image: harbor250.oldboyedu.com/oldboyedu-casedemo/python:3.9.16-alpine3.16
        command:
        - tail
        - -f
        - /etc/hosts
        name: apps

---
#进行集群角色的创建,并且赋予对应的功能
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: reader-oldboy
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - services
  verbs:
  - get
  - watch
  - list
  - delete
- apiGroups:
  - apps
  resources:
  - deployments
  verbs:
  - get
  - watch
  - list
  - delete

---
#指定集群角色和用户oldboy进行绑定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: reader-oldboy-bind
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: reader-oldboy
subjects:
- kind: ServiceAccount
  name: oldboy
  namespace: kube-public   #可以加个名称空间,限制在该名称空间下访问
EOF

3. 创建资源

[root@master231 rbac]# kubectl apply -f oldboyedu-sa-rbac.yaml 
serviceaccount/oldboy created
deployment.apps/xiuxian created
clusterrole.rbac.authorization.k8s.io/reader-oldboy created
clusterrolebinding.rbac.authorization.k8s.io/reader-oldboy-bind created

[root@master231 rbac]# kubectl get deploy,sa,po -o wide  -n kube-public 
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES                                                                SELECTOR
deployment.apps/xiuxian   1/1     1            1           111s   apps         harbor250.oldboyedu.com/oldboyedu-casedemo/python:3.9.16-alpine3.16   app=xiuxian

NAME                     SECRETS   AGE
serviceaccount/default   1         9d
serviceaccount/oldboy    1         111s

NAME                           READY   STATUS    RESTARTS   AGE    IP             NODE        NOMINATED NODE   READINESS GATES
pod/xiuxian-6ffc4f5fd7-m9tf2   1/1     Running   0          111s   10.100.1.165   worker232   <none>           <none>

4. 安装依赖包

[root@master231 rbac]# kubectl -n kube-public exec -it xiuxian-6ffc4f5fd7-hwx4t -- sh
/ # 
/ # python -V
Python 3.9.16
/ # 
/ # pip install kubernetes -i https://pypi.tuna.tsinghua.edu.cn/simple/
...
Successfully installed cachetools-5.5.2 certifi-2025.1.31 charset-normalizer-3.4.1 durationpy-0.9 google-auth-2.38.0 idna-3.10 kubernetes-32.0.1 oauthlib-3.2.2 pyasn1-0.6.1 pyasn1-modules-0.4.2 python-dateutil-2.9.0.post0 pyyaml-6.0.2 requests-2.32.3 requests-oauthlib-2.0.0 rsa-4.9 six-1.17.0 urllib3-2.4.0 websocket-client-1.8.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 22.0.4; however, version 25.0.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
/ # 

5. 编写python脚本【运维开发人员编写】

/ # 
cat > view-k8s-resources.py <<EOF
from kubernetes import client, config

with open('/var/run/secrets/kubernetes.io/serviceaccount/token') as f:
     token = f.read()

configuration = client.Configuration()
configuration.host = "https://10.0.0.231:6443"  # APISERVER地址
configuration.ssl_ca_cert="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"  # CA证书 
configuration.verify_ssl = True   # 启用证书验证
configuration.api_key = {"authorization": "Bearer " + token}  # 指定Token字符串
client.Configuration.set_default(configuration)
apps_api = client.AppsV1Api() 
core_api = client.CoreV1Api() 
try:
  print("###### Deployment列表 ######")
  #列出default命名空间所有deployment名称
  for dp in apps_api.list_namespaced_deployment("kube-public").items:
    print(dp.metadata.name)
except:
  print("没有权限访问Deployment资源!")

try:
  #列出default命名空间所有pod名称
  print("###### Pod列表 ######")
  for po in core_api.list_namespaced_pod("kube-public").items:
    print(po.metadata.name)
except:
  print("没有权限访问Pod资源!")
EOF

3. 运行python脚本

/ # python3 view-k8s-resources.py 
###### Deployment列表 ######
xiuxian
###### Pod列表 ######
oldboyedu-pods-sa
xiuxian-6ffc4f5fd7-m9tf2
/ # 

4. 更新权限

[root@master231 auth]# kubectl get clusterrolebinding  reader-oldboy-bind -o wide
NAME                 ROLE                        AGE   USERS   GROUPS   SERVICEACCOUNTS
reader-oldboy-bind   ClusterRole/reader-oldboy   18m                    kube-public/oldboy

#删除权限绑定:全局资源直接删就行了
[root@master231 auth]# kubectl delete clusterrolebinding  reader-oldboy-bind 
clusterrolebinding.rbac.authorization.k8s.io "reader-oldboy-bind" deleted

[root@master231 auth]# kubectl get clusterrolebinding  reader-oldboy-bind -o wide
Error from server (NotFound): clusterrolebindings.rbac.authorization.k8s.io "reader-oldboy-bind" not found

5. 再次测试验证

/ # python view-k8s-resources.py 
###### Deployment列表 ######
没有权限访问Deployment资源!
###### Pod列表 ######
没有权限访问Pod资源!

认证流程:

创建证书并分发到客户端,然后添加用户,创建集群,绑定上下文。
最后创建角色绑定授权


容器的资源限制resources - 重点讲解

一、核心概念:Requests vs Limits

Requests(请求)

  • 调度器选择节点的依据
  • Pod保证获得的最小资源
  • 示例:requests.cpu: "500m" → 保证获得0.5个CPU

Limits(限制)

  • Pod最多能使用的资源上限
  • 超过会触发不同行为(CPU被限流,内存会导致OOM杀死)
  • 示例:limits.memory: "1Gi" → 最多使用1GB内存

二、核心区别表

特性RequestsLimits
目的调度保证限制上限
CPU超过无影响(保证有)CPU限流
内存超过可能OOM直接OOM杀死
调度影响必须满足不考虑
实际值资源预留硬限制

三、关键语法

resources:
  requests:
    cpu: "250m"      # 0.25个CPU核心
    memory: "256Mi"  # 256MB内存
  limits:
    cpu: "500m"      # 最多0.5个CPU
    memory: "512Mi"  # 最多512MB内存

单位快速参考

CPU:   1 = 1000m = 1个核心
       500m = 0.5个核心
       100m = 0.1个核心

内存:  1Gi = 1024Mi
       512Mi = 512MB
       128Mi = 128MB

四、实战示例

示例1:Web服务(Nginx)

containers:
- name: nginx
  image: nginx
  resources:
    requests:
      cpu: "100m"    # 最少0.1CPU
      memory: "128Mi" # 最少128MB
    limits:
      cpu: "200m"    # 最多0.2CPU
      memory: "256Mi" # 最多256MB

示例2:数据库(MySQL)

containers:
- name: mysql
  image: mysql:8.0
  resources:
    requests:
      cpu: "500m"    # 最少0.5CPU
      memory: "1Gi"   # 最少1GB
    limits:
      cpu: "2"       # 最多2CPU
      memory: "4Gi"   # 最多4GB

示例3:批处理任务

containers:
- name: job
  image: data-processor
  resources:
    requests:
      cpu: "1"       # 最少1CPU
      memory: "2Gi"   # 最少2GB
    limits:
      cpu: "2"       # 最多2CPU
      memory: "4Gi"   # 最多4GB

五、资源超过限制的后果

CPU超过Limits

  • 容器不会被杀死
  • CPU使用被限流(throttled)
  • 性能下降,响应变慢

内存超过Limits

  • 容器立即被OOM Killer杀死
  • Pod状态变为OOMKilled
  • 触发重启(根据restartPolicy)

内存超过Requests但不超过Limits

  • 容器继续运行
  • 但该节点内存紧张时,此Pod可能被驱逐

六、最佳实践

1. 必设Limits

# ✅ 正确做法
resources:
  limits:
    memory: "256Mi"
    cpu: "500m"
  
# ❌ 错误做法(无限制,可能耗尽节点资源)
resources: {}

2. Requests ≈ 50-80% of Limits

resources:
  requests:
    cpu: "250m"     # Limits的50%
    memory: "200Mi"  # Limits的约80%
  limits:
    cpu: "500m"
    memory: "256Mi"

3. 监控和调整

# 查看资源使用
kubectl top pods
kubectl top nodes

# 查看Pod详细信息
kubectl describe pod <pod-name>

# 查看OOM事件
kubectl get events --field-selector=reason=OOMKilled

七、常见问题排查

问题1:Pod一直Pending

# 查看调度失败原因
kubectl describe pod <pod-name>

# 可能原因:节点没有足够的CPU/内存满足requests

问题2:Pod频繁重启

# 查看重启原因
kubectl describe pod <pod-name>

# 如果看到 OOMKilled → 内存limits设置过小
# 如果看到 CrashLoopBackOff → 可能内存requests过小

问题3:应用性能差

# 查看CPU限流情况
kubectl describe pod <pod-name>
# 检查是否有 Throttled CPU 事件

# 解决方案:适当提高CPU limits

八、快速诊断命令

# 1. 查看Pod资源设置
kubectl get pod <pod-name> -o yaml | grep -A 5 resources

# 2. 查看资源使用情况
kubectl top pod <pod-name> --containers

# 3. 查看节点容量
kubectl describe node <node-name> | grep -A 10 Allocatable

# 4. 检查OOM事件
kubectl get events | grep -i oom

# 5. 检查调度失败
kubectl describe pod <pod-name> | grep -A 5 Events

九、设置建议参考表

应用类型Requests CPULimits CPURequests MemoryLimits Memory
Web前端100m250m128Mi256Mi
API服务200m500m256Mi512Mi
数据库500m21Gi4Gi
缓存服务250m1512Mi2Gi
批处理122Gi4Gi

十、一句话总结

Requests是"我要多少",Limits是"我最多能用多少";内存超限会死,CPU超限会慢;不设限制很危险,合理设置保平安。

更多推荐