K8s 访问控制-Day 06

1. K8s API 访问控制

官方文档:https://kubernetes.io/zh-cn/docs/concepts/security/controlling-access/

1.1 访问控制流程

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

1.2 身份认证(Authentication)

官方文档 1:https://kubernetes.io/zh-cn/docs/concepts/security/controlling-access/

官网一共有 7 种身份认证策略,我这里用到的就是其中2种:
(1)X509 客户证书
这个就是我们基于k8s集群的ca根证书签发的用户证书,用于合法请求https://k8s-api-server用的。
具体的策略请看官方文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authentication/
具体的证书签发看官方文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user


(2)服务账号令牌(Service Account)

1.3 鉴权(Authentication)

官方文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authorization/

上面的身份认证通过后,就会来到鉴权步骤,这里主要会进行以下几个步骤:
(1)验证请求是否具备相应的权限,有就允许,没有就拒绝,并返回HTTP状态码403(请求必须包含请求者的用户名、请求的行为以及受该操作影响的对象。)。
这里的授权和权限验证,都由RBAC完成。


(2)验证请求属性,这一步会检查11种请求属性(主要就是role.yaml里面定义的),我这里只介绍主要会验证到的几个属性。
用户(user):这个就是签发证书的时候,配置的CN字段的值。
API请求动词:就是操作资源的方式,比如get、list等。
资源:如pod、deployments等。
名称空间(ns):资源所在的名称空间。
API组(apiGroup):就是资源的api版本。

1.4 准入控制(Admission Control)

1.4.1 什么是准入控制

准入控制其实就是一堆的插件,由api server启动时候添加–enable-admission-plugins参数配置的。
它会在请求通过认证和鉴权之后、对象被持久化之前拦截到达 API 服务器的请求。
准入控制器限制增、删、改对象的请求,但是不会也不能限制读对象的请求。
可以自定义准入控制器插件, 通过执行kube-apiserver -h | grep enable-admission-plugins,可以查看默认启动的准入控制器插件。。


并且准入控制还分为两个阶段:
(1)运行变更准入控制器(Mutating Admission)
它可以修改被它接受的对象,这就引出了它的另一个作用,将相关资源作为请求处理的一部分进行变更。


(2)运行验证准入控制器(Validating Admission)
它只能进行验证,不能进行任何资源数据的修改操作。


需要注意的是,某些控制器可以既是变更准入控制器又是验证准入控制器。
如果任一个阶段的准入控制器拒绝了该请求,则整个请求将立即被拒绝,并向终端用户返回错误。

1.4.2 为什么要用准入控制

首先准入控制器有很多,关于每个准入控制器的作用是什么,可以去官网查看:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do


那么提到为什么要用准入控制,这里就用2个准入控制器来具体说明一下。
(1)AlwaysPullImages
首先,k8s中镜像拉取策略默认是IfNotPresent,如果想要一直拉取最新的镜像,可以在yaml中或者patch修改镜像拉取策略为Always。
但是还有一个办法,就是启用AlwaysPullImages准入控制器,它的作用就是会把每个新创建的pod的镜像拉取策略修改为Always(就算指定拉取策略为IfNotPresent也没用)。
但是启用该插件是全局生效的。


(2)LimitRanger
该准入控制器是api-server默认启用的,主要是针对名称空间做cpu和内存限制的。
默认情况下,LimitRanger 对 default 名字空间中的所有 Pod 都设置 0.1 CPU 的需求。

1.4.3 如何启用准入控制器

在api server的启动配置文件中添加这个参数,–enable-admission-plugins=控制器名,…

1.4.4 有推荐的准入控制器吗

推荐使用的准入控制器默认情况下都处于启用状态 。 因此,无需显式指定它们。
可以使用 --enable-admission-plugins 标志( 顺序不重要 )来启用默认设置以外的其他准入控制器。

2. K8s API 鉴权模式

官方文档:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authorization/

(1)Node(节点鉴权):一个专用鉴权模式,针对kubelet发出的API请求进行鉴权。
授予node节点上的kubelet读取services、endpoints、secrets、configmaps等事件状态,并向API server更新pod与node状态。
apiserver默认使用的鉴权方式是:Node,RBAC。在kube-apiserver.service可以看到。


(2)Webhook:WebHook 是一个 HTTP 回调:发生某些事情时调用的 HTTP POST; 通过 HTTP POST 进行简单的事件通知。 实现 WebHook 的 Web 应用程序会在发生某些事情时将消息发布到 URL。


(3)ABAC:k8s早期使用,现在基本已经不用了。基于属性的访问控制,1.6之前使用,将属性与账户直接绑定。


(4)RBAC:基于角色的访问控制,将权限与角色(role)先进行关联,然后将角色与用户进行绑定(Binding)从而继承角色中的权限。

RBAC示例
在这里插入图片描述
在这里插入图片描述

3. RBAC简介与请求动词

3.1 RBAC简介

RBAC API声明了四种Kubernetes对象:Role、ClusterRole、RoleBinding和ClusterRoleBinding。
(1)Role:定义一组规则,用于访问命名空间中的 Kubernetes 资源。是针对整个ns或者一个ns中某些资源对象做授权的。


(2)RoleBinding:: 定义用户和角色(Role)的绑定关系(使用Role就得和RoleBinding进行绑定)。
可以定义三种类型:
a. User:在 K8s 集群外部创建的实体,例如管理员或开发人员。用户需要使用自己的身份证书和私钥来访问 Kubernetes API Server,从而执行操作并管理 Kubernetes 集群。
b. Group:只要是属于这个组的user和sa,都具备该组的权限。
c. ServiceAccount:在 K8s 集群内部创建的实体,由 Kubernetes 管理。服务账户用于授权和认证 Kubernetes 内部组件和应用程序,例如 Pod 或控制器。


(3)ClusterRole:定义了一组访问集群中 Kubernetes 资源(包括所有命名空间)的规则(如果一个用户需要访问多个ns,就需要用这种)。


(4)ClusterRoleBinding: 定义了用户和集群角色(ClusterRole)的绑定关系(使用ClusterRole就得和ClusterRoleBinding进行绑定)。

在这里插入图片描述

3.2 请求动词(操作权限)

3.2.1 请求动词简介

(1)非资源请求
对于 /api/v1/… 或 /apis///… 之外的端点的请求被视为 “非资源请求(Non-Resource Requests)”, 并使用该请求的 HTTP 方法的小写形式作为其请求动词。
例如,对 /api 或 /healthz 这类端点的 GET 请求将使用 get 作为其动词。


(2)资源请求
要确定对资源 API 端点的请求动词,需要查看所使用的 HTTP 动词以及该请求是针对单个资源还是一组资源。

在这里插入图片描述

3.2.2 请求动词详解

请求动词作用
create在k8s集群中创建一个新的资源对象。(增)
get查询某一个指定的资源对象,如get po pod_name。(查)
list查询一组指定的资源对象,如get po。(查)
watch监视资源对象的变化,如重启,更新等get po -w。(查)
update更新已存在的资源对象。如set image等。(改)
patch更新已存在的资源对象,比update更强大。(改)
delete删除已存在的资源对象。(删)

4. 案例:创建token给开发登录dashboard

官网:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/

4.1 RBAC多账户实现

4.1.1 在指定ns创建账户

[root@k8s-master01 rbac]# kubectl create serviceaccount myserver -n myserver # 在myserver名称空间下创建一个名叫myserver的用户
serviceaccount/myserver created

[root@k8s-master01 rbac]# kubectl get sa -n myserver
NAME       SECRETS   AGE
default    0         37d
myserver   0         46s # 这就是新创建的用户,但是现在这个用户还没有任何的权限

4.1.2 创建role规则(Role)

[root@k8s-master01 rbac]# cat myserver-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1 # 通过explain role可以获取它的api版本
metadata:
  namespace: myserver
  name: myserver-role
rules: # 定义具体权限
- apiGroups: ["*"] # api版本,和下面的是有关联关系的,如果下面是pod,那这里就要写pod相关的api版本,通过kubectl api-resources可以获取对应资源对象的api版本,["*"]和[""]表示所有api版本。
  resources: ["pods","pods/exec"] # 目标资源对象,就是说可以对什么资源做操作,和上面的apigroups相关联。pods表示操作的资源对象是pods,pods/exec表示用户还可以执行exec进入pod,不加的话就只能看
  #verbs: ["*"] # 这里就是定义具体的操作内容。*表示对pod拥有所有权限
  verbs: ["get", "watch", "list"] # 只读
- apiGroups: ["extensions", "apps/v1"]
  resources: ["services"]
  #verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # 可读写
  verbs: ["get", "watch", "list"] # 只读权限

[root@k8s-master01 rbac]# kubectl apply -f myserver-role.yaml
role.rbac.authorization.k8s.io/myserver-role created

[root@k8s-master01 rbac]# kubectl get role -n myserver
NAME            CREATED AT
myserver-role   2023-07-21T05:16:50Z # +8小时

root@k8s-master01 rbac]# kubectl describe role -n myserver myserver-role
Name:         myserver-role
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources               Non-Resource URLs  Resource Names  Verbs
  ---------               -----------------  --------------  -----
  pods.*/exec             []                 []              [*]
  pods.*                  []                 []              [*]
  deployments.apps/v1     []                 []              [get watch list]
  deployments.extensions  []                 []              [get watch list]

4.1.3 将规则与账户进行绑定(RoleBinding)

[root@k8s-master01 rbac]# cat myserver-role-bind.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myserver-role-bind
  namespace: myserver
subjects: # 主体配置,格式为列表,这里主要是把之前创建的sa和role,通过rolebind绑定到一起
- kind: ServiceAccount # ServiceAccount:单个账户。这里的类型只有3种:"User", "Group", and "ServiceAccount".
  name: myserver # 这个名字是我们之前创建的sa的名称
  namespace: myserver
roleRef: # 角色配置,指定账户与role还是和clusterrole进行绑定
  kind: Role # 绑定的类型
  name: myserver-role # 此字段必须和role或clusterrole的名称相匹配
  apiGroup: rbac.authorization.k8s.io # role的api版本

[root@k8s-master01 rbac]# kubectl apply -f myserver-role-bind.yaml
rolebinding.rbac.authorization.k8s.io/myserver-role-bind created

[root@k8s-master01 rbac]# kubectl get rolebinding -n myserver # 可以看到ROLE列,已经和myserver-role绑定了
NAME                 ROLE                 AGE
myserver-role-bind   Role/myserver-role   92s

4.1.4 创建secret

账号登录时要用这个认证,就等于是账号的密码

[root@k8s-master01 rbac]# cat myserver-secret.yaml
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: myserver-user-token
  namespace: myserver
  annotations:
    kubernetes.io/service-account.name: "myserver" # 创建该token给哪个账号,这里是myserver

[root@k8s-master01 rbac]# kubectl apply -f myserver-secret.yaml
secret/myserver-user-token created

[root@k8s-master01 rbac]# kubectl get secret -n myserver|grep myserver
myserver-user-token        kubernetes.io/service-account-token   3      26s

[root@k8s-master01 rbac]# kubectl describe secret -n myserver myserver-user-token
Name:         myserver-user-token
Namespace:    myserver
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: myserver
              kubernetes.io/service-account.uid: a266e64a-dd1e-410e-a5d5-d837d662d357

Type:  kubernetes.io/service-account-token

Data
====
namespace:  8 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkRQV19MelJpdVlfQS02YW84QlAyT0dwSVdGNi1Tb3FyTllSU3BNMXByb1EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteXNlcnZlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJteXNlcnZlci11c2VyLXRva2VuIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15c2VydmVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTI2NmU2NGEtZGQxZS00MTBlLWE1ZDUtZDgzN2Q2NjJkMzU3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Om15c2VydmVyOm15c2VydmVyIn0.PpCZzn-C_Xbj7ZCTvSSMG2fSz_IWIRzJxCL0neE9qvYGHfGLVCoZXg6k9QrzguGlNFUOS2exaJFEjQIl2LClfHBmHyl0O3A3zsUz-odkudHbsA6EQlWhjyPh_0dJUPmshDjR2mKd5c6kUOLzHIa_L90m4EpiJdPOV61QHf_EgRIWbxP-gjYKQnBw6DFKbks7hhbFCWySnRwvRpwUgFIW9z1s1xT29caI7yg0JbrqbW2RTAFEQsgQFVi6NZ03Zwtv6OsIeUU4tl4UFw2b54vRmt52LeKgLS8kJ7LwbXBDjx8KUmc6EhfvWJgbiZQBlWhPAL7l-yXbbL3Cqr_M3kul6A
ca.crt:     1310 bytes

4.1.5 权限验证

4.1.5.1 登录k8s dashboard

在这里插入图片描述

在这里插入图片描述

4.1.5.2 查看pod

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

4.1.5.3 查看svc

在这里插入图片描述

4.1.6 新增exec、delete权限

4.1.6.1 编辑role权限
[root@k8s-master01 rbac]# cat myserver-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: myserver
  name: myserver-role
rules:
- apiGroups: ["*"]
  resources: ["pods"]
  #verbs: ["*"]
  verbs: ["get", "watch", "list", "delete"] # 新增delete权限

- apiGroups: ["*"]
  resources: ["pods/exec"]
  #verbs: ["*"]
  verbs: ["create"] # 创建一个新的api请求,在pod中创建一个执行命令的进程

- apiGroups: ["*"]
  resources: ["services"]
  #verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  verbs: ["get", "watch", "list"]
4.1.6.2 应用新的role权限
[root@k8s-master01 rbac]# kubectl apply -f myserver-role.yaml
role.rbac.authorization.k8s.io/myserver-role configured

[root@k8s-master01 rbac]# kubectl describe role -n myserver myserver-role
Name:         myserver-role
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources    Non-Resource URLs  Resource Names  Verbs
  ---------    -----------------  --------------  -----
  pods.*/exec  []                 []              [create]
  pods.*       []                 []              [get watch list delete]
  services.*   []                 []              [get watch list]

4.1.7 权限验证

4.1.7.1 exec权限验证

在这里插入图片描述

在这里插入图片描述

4.1.7.2 delete权限验证

在这里插入图片描述

在这里插入图片描述

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

4.1.8 新增查看deployment的权限

4.1.8.1 编辑role
root@k8s-master01 rbac]# cat myserver-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: myserver
  name: myserver-role
rules:
- apiGroups: ["*"]
  resources: ["pods"]
  #verbs: ["*"]
  verbs: ["get", "watch", "list", "delete"]

- apiGroups: ["*"]
  resources: ["pods/exec"]
  #verbs: ["*"]
  verbs: ["create"]

- apiGroups: ["*"]
  resources: ["events"]
  #verbs: ["*"]
  verbs: ["get", "list", "watch"]

- apiGroups: ["*"]
  resources: ["services"]
  #verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  verbs: ["get", "watch", "list"]

- apiGroups: ["*"]
  resources: ["deployments"] # 新增deployment资源对象
  verbs: ["get", "watch", "list"]

- apiGroups: ["*"]
  resources: ["replicasets"] # 新增rs资源对象
  verbs: ["get", "watch", "list"]
4.1.8.2 应用role
[root@k8s-master01 rbac]# kubectl describe role -n myserver myserver-role
Name:         myserver-role
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources      Non-Resource URLs  Resource Names  Verbs
  ---------      -----------------  --------------  -----
  pods.*/exec    []                 []              [create]
  events.*       []                 []              [get list watch]
  pods.*         []                 []              [get watch list delete]
  deployments.*  []                 []              [get watch list] # 新增
  replicasets.*  []                 []              [get watch list] # 新增
  services.*     []                 []              [get watch list]

4.1.9 权限验证

在这里插入图片描述

4.1.10 role规则配置注意事项

role规则匹配是从到到下进行匹配的,只要匹配到一条,就会停止继续向下匹配。
配置规则的时候,可以把只读权限放在最后,如所有资源的只读权限,然后把其他规则放在前面。
将最具体的规则放在最前面,以便它们能够首先匹配请求。

4.2 生成集群内部kube config文件(访问dashboard用,可选)

4.2.1 创建csr文件

证书签发信息文件

[root@k8s-master01 rbac]# cat myserver-csr.json
{
  "CN": "China",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

4.2.2 签发证书

[root@k8s-master01 ~]# exit
登出
Connection to k8s-master01 closed.
[root@k8s-harbor01 ~]# ll /etc/kubeasz/bin/cfssl*
-rwxr-xr-x 1 root root 14370448 126 09:51 /etc/kubeasz/bin/cfssl
-rwxr-xr-x 1 root root 11817360 126 09:51 /etc/kubeasz/bin/cfssl-certinfo
-rwxr-xr-x 1 root root  7692288 126 09:51 /etc/kubeasz/bin/cfssljson
[root@k8s-harbor01 ~]# scp /etc/kubeasz/bin/cfssl* k8s-master01:/usr/bin/
cfssl                                                                                                                           100%   14MB  55.0MB/s   00:00
cfssl-certinfo                                                                                                                  100%   11MB  72.1MB/s   00:00
cfssljson                                                                                                                       100% 7512KB  24.9MB/s   00:00
[root@k8s-harbor01 ~]# scp /etc/kubeasz/clusters/k8s-cluster1/ssl/ca-config.json k8s-master01:/root/yaml/rbac
ca-config.json 
[root@k8s-harbor01 ~]# !ss
ssh k8s-master01
Last login: Fri Jul 21 15:56:39 2023 from k8s-harbor01

[root@k8s-master01 rbac]# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/root/yaml/rbac/ca-config.json -profile=kubernetes myserver-csr.json | cfssljson -bare myserver

[root@k8s-master01 rbac]# ll -rt
……省略部分文件
-rw-r--r-- 1 root root 1391 721 16:05 myserver.pem
-rw------- 1 root root 1679 721 16:05 myserver-key.pem
-rw-r--r-- 1 root root  997 721 16:05 myserver.csr

4.2.3 生成普通用户kube config文件

[root@k8s-master01 rbac]# kubectl config set-cluster RBAC-cluster1 --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://10.31.200.100:6443 --kubeconfig=myserver.kubeconfig
Cluster "RBAC-cluster1" set.

# set-cluster: 自定义集群名称
# --embed-certs=true:开启base64加密
# --kubeconfig:证书存放路径
# --certificate-authority:设置了该集群的公钥(注意是集群,不是用户)

[root@k8s-master01 rbac]# ll myserver.kubeconfig
-rw------- 1 root root 1954 721 16:11 myserver.kubeconfig
您在 /var/spool/mail/root 中有邮件
[root@k8s-master01 rbac]# cat myserver.kubeconfig
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0xxxxxxxxxxxxxxxxxLQo=
    server: https://10.31.200.100:6443
  name: RBAC-cluster1
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null

4.2.4 设置config文件客户端认证参数

[root@k8s-master01 rbac]# cp *.pem /etc/kubernetes/ssl/

[root@k8s-master01 rbac]# kubectl config set-credentials myserver \
--client-certificate=/etc/kubernetes/ssl/myserver.pem \
--client-key=/etc/kubernetes/ssl/myserver-key.pem \
--embed-certs=true \
--kubeconfig=myserver.kubeconfig
User "myserver" set.

# set-credentials myserver:设置用户“myserver”的相关凭证
# --client-certificate:用户的公钥证书
# --client-key:用户的私钥证书
# --embed-certs=true:把公钥和私钥通过base64加密,然后写入config文件
# --kubeconfig:写入config配置文件

[root@k8s-master01 rbac]# cat myserver.kubeconfig 
……省略部分内容
users: # 更新了这部分内容
- name: myserver
  user:
    client-certificate-data: LS0xxxxxxxxxxxxxxxxxLQo= # 客户端公钥
    client-key-data: LS0tLxxxxxxxxxxxxxxxxxxxLQo= # 客户端私钥

4.2.5 设置config文件上下文参数(多集群使用上下文区分)

官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/

[root@k8s-master01 rbac]# kubectl config set-context RBAC-cluster1 \
--cluster=RBAC-cluster1 \
--user=myserver \
--namespace=myserver \
--kubeconfig=myserver.kubeconfig
Context "RBAC-cluster1" created.

[root@k8s-master01 rbac]# cat myserver.kubeconfig
……省略部分内容
contexts:
- context:
    cluster: RBAC-cluster1
    namespace: myserver
    user: myserver
  name: RBAC-cluster1
……省略部分内容

4.2.6 设置config文件默认上下文(设置默认集群)

[root@k8s-master01 rbac]# kubectl config use-context RBAC-cluster1 --kubeconfig=myserver.kubeconfig # 登录的时候不指定配置文件,默认就是该集群
Switched to context "RBAC-cluster1".

[root@k8s-master01 rbac]# cat myserver.kubeconfig
……省略部分内容
current-context: RBAC-cluster1
……省略部分内容

4.2.7 获取token

[root@k8s-master01 rbac]# kubectl get secret -n myserver|grep myserver
myserver-user-token        kubernetes.io/service-account-token   3      173m

[root@k8s-master01 rbac]# kubectl describe secret -n myserver myserver-user-token
Name:         myserver-user-token
Namespace:    myserver
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: myserver
              kubernetes.io/service-account.uid: a266e64a-dd1e-410e-a5d5-d837d662d357

Type:  kubernetes.io/service-account-token

Data
====
namespace:  8 bytes
token: # 复制它的value  eyJhbGciOiJSUzI1NiIsImtpZCI6IkRQV19MelJpdVlfQS02YW84QlAyT0dwSVdGNi1Tb3FyTllSU3BNMXByb1EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteXNlcnZlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJteXNlcnZlci11c2VyLXRva2VuIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15c2VydmVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTI2NmU2NGEtZGQxZS00MTBlLWE1ZDUtZDgzN2Q2NjJkMzU3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Om15c2VydmVyOm15c2VydmVyIn0.PpCZzn-C_Xbj7ZCTvSSMG2fSz_IWIRzJxCL0neE9qvYGHfGLVCoZXg6k9QrzguGlNFUOS2exaJFEjQIl2LClfHBmHyl0O3A3zsUz-odkudHbsA6EQlWhjyPh_0dJUPmshDjR2mKd5c6kUOLzHIa_L90m4EpiJdPOV61QHf_EgRIWbxP-gjYKQnBw6DFKbks7hhbFCWySnRwvRpwUgFIW9z1s1xT29caI7yg0JbrqbW2RTAFEQsgQFVi6NZ03Zwtv6OsIeUU4tl4UFw2b54vRmt52LeKgLS8kJ7LwbXBDjx8KUmc6EhfvWJgbiZQBlWhPAL7l-yXbbL3Cqr_M3kul6A
ca.crt:     1310 bytes

4.2.8 粘贴token到用户kube config文件

[root@k8s-master01 rbac]# cat myserver.kubeconfig
……省略部分内容
users:
- name: myserver
  user:
    client-certificate-data: LS0xxxLQo=
    client-key-data: LS0xxxtLQo=
    # 新增下面的token key,然后把上面查到的token值复制到这里
    token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkRQV19MelJpdVlfQS02YW84QlAyT0dwSVdGNi1Tb3FyTllSU3BNMXByb1EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteXNlcnZlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJteXNlcnZlci11c2VyLXRva2VuIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15c2VydmVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTI2NmU2NGEtZGQxZS00MTBlLWE1ZDUtZDgzN2Q2NjJkMzU3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Om15c2VydmVyOm15c2VydmVyIn0.PpCZzn-C_Xbj7ZCTvSSMG2fSz_IWIRzJxCL0neE9qvYGHfGLVCoZXg6k9QrzguGlNFUOS2exaJFEjQIl2LClfHBmHyl0O3A3zsUz-odkudHbsA6EQlWhjyPh_0dJUPmshDjR2mKd5c6kUOLzHIa_L90m4EpiJdPOV61QHf_EgRIWbxP-gjYKQnBw6DFKbks7hhbFCWySnRwvRpwUgFIW9z1s1xT29caI7yg0JbrqbW2RTAFEQsgQFVi6NZ03Zwtv6OsIeUU4tl4UFw2b54vRmt52LeKgLS8kJ7LwbXBDjx8KUmc6EhfvWJgbiZQBlWhPAL7l-yXbbL3Cqr_M3kul6A

4.2.9 测试用户登录

在这里插入图片描述

在这里插入图片描述

5. 案例:给开发创建用户,访问指定ns下的资源对象

5.1 编辑role规则文件

[root@k8s-master01 kaifa]# cat kaifa-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: myserver
  name: kaifa-role
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "watch", "list"]
[root@k8s-master01 kaifa]# kubectl apply -f kaifa-role.yaml
role.rbac.authorization.k8s.io/kaifa-role created

[root@k8s-master01 kaifa]# kubectl describe role -n myserver kaifa-role
Name:         kaifa-role
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  *.*        []                 []              [get watch list]

5.2 编辑rolebing文件

[root@k8s-master01 kaifa]# cat kaifa-role-bind.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kaifa-role-bind
  namespace: myserver
subjects:
- kind: User # 注意这里的类型,和上面演示的是不同的(集群外部访问用user,内部访问用sa)。
  name: kaifa
  namespace: myserver
roleRef:
  kind: Role
  name: kaifa-role
  apiGroup: rbac.authorization.k8s.io
[root@k8s-master01 kaifa]# kubectl apply -f kaifa-role-bind.yaml
rolebinding.rbac.authorization.k8s.io/kaifa-role-bind created

[root@k8s-master01 kaifa]# kubectl describe rolebinding -n myserver kaifa-role-bind
Name:         kaifa-role-bind
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  kaifa-role
Subjects:
  Kind  Name   Namespace
  ----  ----   ---------
  User  kaifa  myserver

5.3 签发客户端证书

5.3.1 创建csr文件

API Server会把客户端证书的CN字段作为User,把names.O字段作为Group。
k8s在校验授权的时候就会读取这两个字段。

[root@k8s-master01 kaifa]# cat kaifa-csr.json
{
  "CN": "kaifa", # 特别注意这个配置,这里的CN就是我们的用户名(User)
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "ShangHai",
      "L": "ShangHai",
      "O": "k8s",
      "OU": "System"
    }
  ]
}

5.3.2 签发证书

这一步主要是利用k8s admin的证书配置文件来签发客户端相关证书文件

[root@k8s-master01 kaifa]# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/root/yaml/rbac/ca-config.json -profile=kubernetes kaifa-csr.json | cfssljson -bare kaifa

# -ca=:ca根证书公钥
# -ca-key= ca根证书私钥
# -config= 证书配置文件,主要是用来配置证书的属性(这里直接用的根证书的)


[root@k8s-master01 kaifa]# ll -rt # 下面就生成了客户端的公钥和私钥证书
总用量 24
……省略部分内容
-rw-r--r-- 1 root root 1391 724 17:21 kaifa.pem
-rw------- 1 root root 1679 724 17:21 kaifa-key.pem
-rw-r--r-- 1 root root  997 724 17:21 kaifa.csr

5.4 生成kube config文件

[root@k8s-master01 kaifa]# kubectl config set-cluster kaifa-RBAC --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=https://10.31.200.100:6443 --kubeconfig=kaifa.kubeconfig
Cluster "kaifa-RBAC" set.

# set-cluster: 自定义集群名称
# --embed-certs=true:开启base64加密
# --kubeconfig:config文件存放路径
# --certificate-authority:设置了该集群的公钥(注意是集群,不是用户)

[root@k8s-master01 kaifa]# cat kaifa.kubeconfig
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0xxxLQo=
    server: https://10.31.200.100:6443
  name: kaifa-RBAC
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null

5.4.1 设置config文件客户端认证参数

[root@k8s-master01 kaifa]# kubectl config set-credentials kaifa \
--client-certificate=kaifa.pem \
--client-key=kaifa-key.pem \
--embed-certs=true \
--kubeconfig=kaifa.kubeconfig
User "kaifa" set.

# set-credentials kaifa:设置用户“kaifa”的相关凭证
# --client-certificate:用户的公钥证书
# --client-key:用户的私钥证书
# --embed-certs=true:把公钥和私钥通过base64加密,然后写入config文件
# --kubeconfig:写入config配置文件

[root@k8s-master01 kaifa]# cat kaifa.kubeconfig
# 更新的部分
users:
- name: kaifa
  user:
    client-certificate-data: LS0xxxLQo=
    client-key-data: LS0xxxLQo=

5.4.2 设置config文件上下文参数(多集群使用上下文区分)

[root@k8s-master01 kaifa]# kubectl config set-context kaifa-RBAC \
--cluster=kaifa-RBAC \
--user=kaifa \
--namespace=myserver \
--kubeconfig=kaifa.kubeconfig
Context "kaifa-RBAC" created.

[root@k8s-master01 kaifa]# cat kaifa.kubeconfig
# 更新部分
contexts:
- context:
    cluster: kaifa-RBAC
    namespace: myserver
    user: kaifa
  name: kaifa-RBAC

5.4.3 设置config文件默认集群

[root@k8s-master01 kaifa]# kubectl config use-context kaifa-RBAC --kubeconfig=kaifa.kubeconfig 

[root@k8s-master01 kaifa]# cat kaifa.kubeconfig
# 更新部分
current-context: kaifa-RBAC

5.5 使用kaifa.kubeconfig

官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/organize-cluster-access-kubeconfig/
下面3种方式3选一即可!!!

5.5.1 方式1:–kubeconfig指定config文件

该方式适合生成好了config文件后测试用

[root@k8s-master01 kaifa]# kubectl --kubeconfig=kaifa.kubeconfig get po
NAME                        READY   STATUS    RESTARTS   AGE
kuboard-v3-c7649d7d-85h9l   1/1     Running   0          117m
minio-5cc5fc9498-lmzwh      1/1     Running   0          13d

[root@k8s-master01 kaifa]# kubectl --kubeconfig=kaifa.kubeconfig delete po kuboard-v3-c7649d7d-85h9l # 因为kaifa用户是只有只读权限的,所以没法删除pod
Error from server (Forbidden): pods "kuboard-v3-c7649d7d-85h9l" is forbidden: User "kaifa" cannot delete resource "pods" in API group "" in the namespace "myserver"

5.5.2 方式2:替换config文件

[root@k8s-master01 kaifa]# pwd
/root/yaml/rbac/kaifa

[root@k8s-master01 kaifa]# cd /root/.kube/
[root@k8s-master01 .kube]# ls
cache  config
[root@k8s-master01 .kube]# cp config{,-admin}
[root@k8s-master01 .kube]# cp /root/yaml/rbac/kaifa/kaifa.kubeconfig ./config
cp:是否覆盖"./config"? y
[root@k8s-master01 .kube]# ll
总用量 16
drwxr-x--- 4 root root   35 514 16:45 cache
-rw-r--r-- 1 root root 6213 724 18:11 config
-rw-r--r-- 1 root root 6201 724 18:11 config-admin

[root@k8s-master01 .kube]# kubectl get po
NAME                        READY   STATUS    RESTARTS   AGE
kuboard-v3-c7649d7d-85h9l   1/1     Running   0          119m
minio-5cc5fc9498-lmzwh      1/1     Running   0          13d

# 还原配置
[root@k8s-master01 .kube]# cp config{,-kaifa}

[root@k8s-master01 .kube]# cp config-admin config
cp:是否覆盖"config"? y

[root@k8s-master01 .kube]# ll
总用量 24
drwxr-x--- 4 root root   35 514 16:45 cache
-rw-r--r-- 1 root root 6201 724 18:12 config
-rw-r--r-- 1 root root 6201 724 18:11 config-admin
-rw-r--r-- 1 root root 6213 724 18:12 config-kaifa

5.5.3 方式3:设置临时变量

默认情况下,kubectl 在 $HOME/.kube 目录下查找名为 config 的文件。
可以通过设置 KUBECONFIG 环境变量来指定其他 kubeconfig 文件。

[root@k8s-master01 kaifa]# export KUBECONFIG="${KUBECONFIG}:/root/yaml/rbac/kaifa/kaifa.kubeconfig"
[root@k8s-master01 kaifa]# echo $KUBECONFIG
:/root/yaml/rbac/kaifa/kaifa.kubeconfig

[root@k8s-master01 kaifa]# kubectl get po
NAME                        READY   STATUS    RESTARTS   AGE
kuboard-v3-c7649d7d-85h9l   1/1     Running   0          126m
minio-5cc5fc9498-lmzwh      1/1     Running   0          13d
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值