Service Account和RBAC授权

Stella981
• 阅读 955

一、介绍

Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务。Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。

二、创建Service Account

###serviceaccount(服务账号)
1、#创建serviceaccount 
kubectl  create  serviceaccount  mysa

2、#查看mysa
[root@k8s-m ~]# kubectl  describe sa mysa 
Name:                mysa
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   mysa-token-2zjlp
Tokens:              mysa-token-2zjlp
Events:              <none>
3、#查看mysa自动创建的secret
[root@k8s-m ~]# kubectl  get secret
NAME                  TYPE                                  DATA      AGE
default-token-29dpx   kubernetes.io/service-account-token   3         119d
mysa-token-2zjlp      kubernetes.io/service-account-token   3         1m

4、#使用mysa的sa资源配置pod
[root@k8s-m ~]# cat mysa-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels: 
    app: my-pod
     
spec:
  containers:
  - name: my-pod
    image: nginx
    ports:
    - name: http
      containerPort: 80
  serviceAccountName: mysa 
  5、#导入
[root@k8s-m ~]# kubectl apply -f  mysa-pod.yaml


6、#查看
[root@k8s-m ~]# kubectl  describe pod nginx-pod

7、#查看使用的token和secret(使用的是mysa的token)
kubectl  get  pod nginx-pod  -o jsonpath={".spec.volumes"}

创建k8s账号及RBAC授权

一、介绍

在Kubernetes中,授权有ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、Webhook、Node、AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式。从1.6版本起,Kubernetes 默认启用RBAC访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。

二、创建k8s账号与RBAC授权使用

##创建账号
#1、创建私钥
(umask 077; openssl genrsa -out zhang.key 2048)
#用此私钥创建一个csr(证书签名请求)文件
openssl  req -new -key zhang.key -out zhang.csr -subj  "/CN=zhang"

openssl x509 -req -in zhang.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out zhang.crt -days 365

#2、查看证书内容
openssl  x509 -in zhang.crt  -text -noout


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

#3、设置上下文
kubectl  config   set-context  zhang@kubernetes --cluster=kubernetes --user=zhang

#4、切换用户
kubectl  config use-context zhang@kubernetes


##测试(还未赋予权限)
[root@k8s-m ssl]# kubectl  get pod
No resources found.
Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "default"


##授权
#K8S授权请求是http的请求
对象URL格式:
/apis/[GROUP]/[VERSION]/namespace/[NAMESPACE_NAME]/[KIND]/[OBJECT_ID]


k8s授权方式分为:serviceaccount和自己签证ca证书的账号,及签证ca的用户组(group)上(授权给这个组的权限)

#简介
role:
1、允许的操作,如get,list等
2、允许操作的对象,如pod,svc等

rolebinding:将哪个用户绑定到哪个role或clusterrole上

clusterrole:(集群角色)
clusterrolebinding:(绑定到集群)
3、如果使用rolebinding绑定到clusterrole上,表示绑定的用户只能用于当前namespace的权限


#创建一个角色(role)
kubectl  create role  myrole  --verb=get,list,watch --resource=pod,svc

#绑定用户zhang(上面创建的用户),绑定role为myrole
kubectl  create  rolebinding myrole-binding  --role=myrole  --user=zhang
#切换用户
[root@k8s-m ~]# kubectl  config use-context zhang@kubernetes
Switched to context "zhang@kubernetes".

#查看权限(只授权了default名称空间pod和svc的get,list,watch权限)
[root@k8s-m ~]# kubectl  get pod
NAME                     READY     STATUS              RESTARTS   AGE
nginx-pod                0/1       ImagePullBackOff    0          1h
[root@k8s-m ~]# kubectl  get pod -n kube-system #无权访问kube-system
No resources found.
Error from server (Forbidden): pods is forbidden: User "zhang" cannot list pods in the namespace "kube-system"

[root@k8s-m ~]# kubectl  delete pod nginx-pod #无删除权限
Error from server (Forbidden): pods "nginx-pod" is forbidden: User "zhang" cannot delete pods in the namespace "default"




#创建clusterrole#可以访问全部的namespace
kubectl  create clusterrole mycluster-role --verb=get,list,watch  --resource=pod,svc  
#删除zhang账号之前绑定的rolebinding
kubectl  delete rolebinding myrole-binding  
#使用clusterrolebinding绑定clusterrole
kubectl  create clusterrolebinding my-cluster-rolebinding   --clusterrole=mycluster-role  --user=zhang

#切换账号
kubectl  config use-context zhang@kubernetes
#查看权限 查看kube-system空间的pod
[root@k8s-m ~]# kubectl  get pod -n kube-system
NAME                            READY     STATUS    RESTARTS   AGE
coredns-78fcdf6894-67h9h        1/1       Running   1          11h
coredns-78fcdf6894-lzxmz        1/1       Running   1          11h
etcd-k8s-m                      1/1       Running   2          11h
......

配置一个新账号和配置文件并授权

##创建证书
(umask 077; openssl genrsa -out k8s.key 2048)
#用此私钥创建一个csr(证书签名请求)文件(/0是组名)
openssl  req -new -key k8s.key -out k8s.csr -subj  "/CN=k8s/O=zhang"

openssl x509 -req -in k8s.csr -CA  /etc/kubernetes/pki/ca.crt  -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out k8s.crt -days 365

#查看证书内容
openssl  x509 -in k8s.crt  -text -noout

##创建secret
#创建一个generic的secre namespace设置为default
kubectl  create  secret generic k8s  -n default  --from-file=k8s.crt=./k8s.crt   --from-file=k8s.key=./k8s.key
#查看
[root@k8s-m ~]# kubectl  get secret |grep k8s
k8s                   Opaque                                2         35s



###配置生成
kubectl config set-cluster  kubernetes    --certificate-authority=/etc/kubernetes/pki/ca.crt  --server="https://10.0.0.141:6443"  --embed-certs=true   --kubeconfig=./k8s.config

## 配置客户端认证
kubectl config set-credentials k8s --client-certificate=./k8s.crt   --client-key=./k8s.key --embed-certs=true  --kubeconfig=./k8s.config 

### 配置关联
kubectl  config   set-context  k8s@user --cluster=kubernetes --user=k8s --kubeconfig=./k8s.config



##创建role
 kubectl  create role  k8s-role  --verb=get,list,watch --resource=pod,svc
#创建rolebinding
kubectl  create  rolebinding k8s-rolebinding  --role=k8s-role  --user=k8s

#替换配置文件
[root@k8s-m ~]# mv /root/.kube/config    /mnt/
[root@k8s-m ~]# cp k8s.config  /root/.kube/config 
#修改config的current-context内容
current-context: ""
改成# 
current-context: name: k8s@user

##查看
[root@k8s-m ~]# kubectl  get pod 
NAME                     READY     STATUS              RESTARTS   AGE
my-statefulset-0         0/1       ContainerCreating   0          8d
nginx-6f858d4d45-6qm6g   0/1       ImagePullBackOff    0          9d
[root@k8s-m ~]# kubectl  get pod  -n kube-system
No resources found.
Error from server (Forbidden): pods is forbidden: User "k8s" cannot list pods in the namespace "kube-system"
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这