kubernetes 权限管理
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获取资源的。