kubernetes中有两类账号,一类为useraccount账号,是用户的账号,另一类是serviceaccount 是服务的账号,Pod的使用的账号。

user:username,uid

group:

extra:

API:

Request path

        http://ip:port/apis/apps/v1/namespace/default/deployment/myapp-deploy/

HTTP request verb:

        get、 post、 put、 delete

API requets verb:

        get、list、create、update、patch、watch、proxy、redirect、delete、deletecollection

Resource:

Subresource:

Namespace:

API group:


创建账号


创建 serviceaccount 账户:

        serviceaccoount账户是给Pod运行时使用的,不是用户的账户。

kubectl create serviceaccount mysa -o yaml --dry-run

        加上 --dry-run 不是真正执行,使用 kubectl get pods <podname> -o yaml --export 可以到处某个Pod的模板信息。

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: null
  name: mysa

查看已有的serviceaccount:

kubectl get sa

创建 serviceacount:

kubectl create serviceaccount admin

查看sa详情:

kubectl describe sa admin

Name:                admin
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>     # 下载镜像要使用到的secret
Mountable secrets:   admin-token-nzjqv
Tokens:              admin-token-nzjqv
Events:              <none>

创建完sa后可以看到系统调用了认证信息,可以使用 kubectl get secret 看到

NAME                  TYPE                                  DATA      AGE
admin-token-nzjqv     kubernetes.io/service-account-token   3         5m
default-token-pvttj   kubernetes.io/service-account-token   3         29d


创建Pod时使用自定义serviceaccount账号:

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  deployment-myapp
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels: 
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-nginx
        image: nginx:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
      serviceAccountName: admin

        创建完成后可以使用 kubectl describe pods <podname> 查看到Volumes 下面使用的 token 及为新创建的账户 token。


创建集群账号:

cd /etc/kubernetes/pki

创建私钥:生成签署证书,证书持有者和用户名必须保持一致,用户名就是持有者。

(umask 077; openssl genrsa -out qiyang.key 2048)

生成证书签署请求:qiyang.csr 为证书签署请求

openssl req -new -key qiyang.key -out qiyang.csr -subj "/CN=qiyang"

签署证书:使用 ca.crt 去签署qiyang.crt

openssl x509 -req -in qiyang.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out qiyang.crt -days 365

查看签署的证书:可以看到 Subject: CN=qiyang 这项,这个名称就是API server 的连接账号。

openssl x509 -in qiyang.crt -text -noout

使用 kubectl config view 可以看到当前的kubernetes 集群中还没有这个账号。

添加账号到集群中:

kubectl config  set-credentials qiyang --client-certificate=qiyang.crt --client-key=qiyang.key --embed-certs=true

这时就可以看到新创建的账号:

]# kubectl config view
apiVersion: v1
...
preferences: {}
users:
- name: kubernetes-admin
...
- name: qiyang
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

指定某个用户去访问那个集群:

kubectl config set-context qiyang@kubernetes --cluster=kubernetes --user=qiyang

此时再用 kubectl config view 查看即可看到 context 已近有了新创建的context了。

]# kubectl config view
apiVersion: v1
...
contexts:
- context:
...
- context:
    cluster: kubernetes
    user: qiyang
  name: qiyang@kubernetes
current-context: kubernetes-admin@kubernetes
...

切换访问集群的账号:

kubectl config use-context qiyang@kubernetes

可以使用这个账号去操作一些命令,发现不可以操作,因为还没有分配权限。



RBAC


k8s中的资源都需要认证,都有用于认证的配置文件。

显示客户端配置文件:

kubectl config view

role:角色对应权限

        operations

        objects

rolebinding:将账号绑定到角色上,账号分为 serviceaccount 或 useraccount

        user account OR service account

        role

        role 和 rolebinding 主要工作在名称空间中,绑定的角色主要作用在某一个名称空间,在某个名称空间中有相应的权限。clusterrole 和 clusterrolebbinding 工作在集群中,绑定的角色可以在一个集群中拥有某些权限。

        rolebinding 是名称空间下的权限绑定,clusterrolebinding 是集群范围内的权限绑定。


创建 role:

kubectl create role pod-reader --verb=get,watch,list --resource=pods --dry-run -o yaml

使用 yaml 文件创建role:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pods-reader
  namespace: default
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - watch
  - list

查看 role:

 kubectl get role

查看权限详情:

kubectl describe role pods-reader


创建 rolebinding:

kubectl create rolebinding --help

kubectl create rolebinding reader-pods --role=pods-reader --user=qiyang --dry-run -o yaml


使用yaml 文件创建:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: reader-pods
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pods-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: qiyang

如果用户不存在不用提前创建。

kubectl describe rolebinding reader-pods

Name:         reader-pods
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  pods-reader
Subjects:
  Kind  Name    Namespace
  ----  ----    ---------
  User  qiyang

删除rolebinding:

kubectl delete rolebinding


切换用户:

kubectl config use-context qiyang@kubernetes

在 kubectl config view 中可以看到 current-context 一列即为当前的用户。


创建 ClusterRole:

kubectl create clusterrole --help

kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods -o yaml --dry-run

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: cluster-reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch


绑定 clusterrolebinding:

kubectl create clusterrolebinding qiyang-reader-all-pods --clusterrole=cluster-reader --user=qiyang --dry-run -o yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: qiyang-reader-all-pods
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: qiyang

查看 clusterrolebinding:

kubectl get clusterrolebinding

kubectl describe clusterrolebinding qiyang-reader-all-pods


绑定 rolebinding:

kubectl create rolebinding qiyang-reader-pods --clusterrole=cluster-reader --user=qiyang --dry-run -o yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: qiyang-reader-pods
  namespace: default # 默认不写创建在哪里对哪里生效
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: qiyang

查看管理员的权限:可以参照着写

kubectl get clusterrole admin -o yaml


例:让qiyang 拥有某个名称空间下的管理员权限

kubectl create rolebinding default-namespace-all-auth --clusterrole=admin --user=qiyang --dry-run -o yaml

        集群角色 clusterrole 中有一个角色是管理员admin,只要把集群账号qiyang 用rolebinding 来绑定到 clusterrole 上,qiyang 既可以在某个名称空间之中拥有管理员的权限,关键点是用rolebinding,而不是用clusterrolebinding,

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: default-namespace-all-auth
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: qiyang

        role可以绑定在user、group、serviceaccount 上。

        在Pod的资源定义中,有一个字段叫 spec.servcieAccountName,Pod是用这个字段定义的用户去连接API server获取资源的。