admin管理员组

文章数量:1633030

kubernetes

      • 1. kubernetes api访问控制
      • 2. 访问k8s的API Server的客户端
      • 3. UserAccount与serviceaccount
        • 3.1 创建serviceaccount:
        • 3.2 添加secrets到serviceaccount中
        • 3.3 把serviceaccount和pod绑定起来:
        • 3.4 创建useraccount
      • 4. RBAC基于角色访问控制授权
        • 4.1 RoleBinding角色绑定
        • 4.2 ClusterRoleBinding集群角色绑定
      • 5. 服务账户的自动化
      • 6. kubernetes的用户组

1. kubernetes api访问控制

官方文档:
https://kubernetes.io/zh/docs/reference/access-authn-authz/controlling-access/
kubernetes api分为:认证、授权、准入控制
用户通过 kubectl、客户端库或者通过发送 REST 请求访问 API。 用户(自然人)和 Kubernetes 服务账户 都可以被授权进行 API 访问。 请求到达 API 服务器后会经过几个阶段,具体说明如图:


Authentication(认证)
认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式。

[kubeadm@server2 node]$ kubectl get sa
NAME                     SECRETS   AGE
default                  1         19d
nfs-client-provisioner   1         3d7h
[kubeadm@server2 node]$ kubectl describe sa default 
Name:                default
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   default-token-64lq2
Tokens:              default-token-64lq2
Events:              <none>

Kubernetes集群有两类用户:由Kubernetes管理的Service Accounts (服务账户)和(Users Accounts) 普通账户。k8s中账号的概念不是我们理解的账号,它并不真的存在,它只是形式上存在。

Authorization(授权)
必须经过认证阶段,才到授权请求,根据所有授权策略匹配请求资源属性,决定允许或拒绝请求。授权方式现共有6种,AlwaysDeny、AlwaysAllow、ABAC、RBAC、Webhook、Node。默认集群强制开启RBAC(基于角色的权限控制)。

Authorization(授权)
必须经过认证阶段,才到授权请求,根据所有授权策略匹配请求资源属性,决定允许或拒绝请求。授权方式现共有6种,AlwaysDeny、AlwaysAllow、ABAC、RBAC、Webhook、Node。默认集群强制开启RBAC(基于角色的权限控制)。

2. 访问k8s的API Server的客户端

访问k8s的API Server的客户端主要分为两类:
kubectl :用户家目录中的 .kube/config 里面保存了客户端访问API Server的密钥相关信息,这样当用kubectl访问k8s时,它就会自动读取该配置文件,向API Server发起认证,然后完成操作请求。
pod:Pod中的进程需要访问API Server,如果是人去访问或编写的脚本去访问,这类访问使用的账号为:UserAccount;而Pod自身去连接API Server时,使用的账号是:ServiceAccount,生产中后者使用居多。

kubectl向apiserver发起的命令,采用的是http方式,其实就是对URL发起增删改查的操作。

$ kubectl  proxy --port=8888 &
$ curl http://localhost:8888/api/v1/namespaces/default
$ curl http://localhost:8888/apis/apps/v1/namespaces/default/deployments

以上两种api的区别是:
api它是一个特殊链接,只有在核心v1群组中的对象才能使用。
apis 它是一般API访问的入口固定格式名。

[kubeadm@server2 ~]$ cd .kube/   # 用户主目录下的认证文件
[kubeadm@server2 .kube]$ ls
cache  config  http-cache
[kubeadm@server2 .kube]$ cat config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01EUXhOekV5TWprME5Wb1hEVE13TURReE5URXlNamswTlZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTndICnI0cmVweEEzVTdpRXlkb3MwSHU4WmM5QnBGZW5ocVdwMjgxdmJQNUNOUEkxbG15R2J0V3l2TFBZdTk4UHVXK2YKTFhleEd4bUQvUm9nZmo0UVhYaDBRbTBKVlN6dEZIeFRnb1VobEgyd2REd0JhSFAxaUpybm5CNmx0c2tRZjVIaApPanhXVUtYVWtEZkxHcllRM3dzV0c5T1oxNDI0MEViUko3Q1NBUkwxd1ZkdDc5djZmNHRCUnRtWEN4SUFFUnFHCmpwRVJDMFh4ZU8xMU9rQTA1SjlJNjRHNXpybkxvOHVYV3JyaE5kOE53V3V6d3NQZ1F2V3NaejVudElHd3haR1QKcURjN25lMXU1c01TcHZMZG03UjgreHVIemxiZkpKNDdkSjc3QURXZXZ4WnY1UkNUeE5mSm9lOXpkdUNoV2pLdQpmWFNONXpKVUV3K25OSjJWOFFrQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFCV3FpSnVKZXRyQmZ4NWtFb3NaUlYySXMyeEEKMWRhdW43WlJGbHYvT0xDTzJaZWVJNnlTRWpHU1hkWXpYZUREbnFoWHh0cy8zOFkvaVNXSFY3Z1JEdTJxbXpnZgp3a0hoK1pwci80WHgxMm5rL011dFRBUjNwMmJHRkFDM2djNUh1YWFma2ZnNldvc1ArdklxSkFjdXFjbkxqenZwCm5TVjlON0Y3dnNVeXdtSmIrV3hMaXY2VmgzbFRQMUJuck15aG5iVFA5bHhvK0hEOU9wUC9yTStvcEw0NXhrb0wKOXgrWHo5RXpDR29RUXpFT09nZUg3WW1tUFlvSXUzY0FKOG10dGtGNHpzTHRid1RiT2J2bGhsYmFqbWY4VXNEagptYnA4Vm0rYVNrS0p4SWhPVXlGcHlxQWRTQ3dxYUpjajNuQlRPdWJmV1VIeHAvYzI4dmladjRaVHA0az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=

3. UserAccount与serviceaccount

UserAccount与serviceaccount:
用户账户是针对人而言的。 服务账户是针对运行在 pod 中的进程而言的。
用户账户是全局性的。 其名称在集群各 namespace 中都是全局唯一的,未来的用户资源不会做 namespace 隔离, 服务账户是 namespace 隔离的。
通常情况下,集群的用户账户可能会从企业数据库进行同步,其创建需要特殊权限,并且涉及到复杂的业务流程。 服务账户创建的目的是为了更轻量,允许集群用户为了具体的任务创建服务账户 ( 即权限最小化原则 )。

3.1 创建serviceaccount:
[kubeadm@server2 ~]$ kubectl create serviceaccount test
serviceaccount/test created

[kubeadm@server2 ~]$ kubectl get sa
NAME                     SECRETS   AGE
default                  1         19d
nfs-client-provisioner   1         3d7h
test                     1         10s

[kubeadm@server2 ~]$ kubectl describe sa test
Name:                test
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   test-token-nxqrn
Tokens:              test-token-nxqrn
Events:              <none>
3.2 添加secrets到serviceaccount中
[kubeadm@server2 ~]$ kubectl patch serviceaccount test -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'
serviceaccount/test patched

[kubeadm@server2 ~]$ kubectl describe sa test
Name:                test
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  myregistrykey  # 可以读取拉取镜像的秘钥
Mountable secrets:   test-token-nxqrn
Tokens:              test-token-nxqrn
Events:              <none>
3.3 把serviceaccount和pod绑定起来:
[kubeadm@server2 auth]$ cat pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  containers:
  - n

本文标签: 绑定访问控制角色APIKubernetes