大白话的方式跟你聊k8s中的SA和UA
一、Service Account总结
1、service account到底是什么?
- 在k8s中,service account是给集群中的进程使用的,当集群中的pod/进程需要跟apiserver申请调用资源时使用时使用的;我们用户是不会去使用它的;举个很形象的例子,就像nginx服务中的nginx账号一样,我们一般是不会使用su去登录它并且使用它的;如下,就能很直观的明白了:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/user nginx; #这里这个账户就叫nginx,就是给nginx这个进程、服务使用的
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
- 但是不同的是,linux中的nginx服务,我们使用yum -y install下载nginx服务时,系统会默认帮我们创建一个叫做nginx的账户;但是在k8s中,任何进程任何pod在被创建出来的同时,如果我们不指定使用自己创建的service account的话,系统会默认给我们使用default账户去创建资源
2、在k8s集群中为什么需要service account?
- 原因很简单,在创建新的资源的同时,限制它们的权限;
- 因为在我们创建新的资源时,如果不指定使用哪个sa去创建的话,默认就是使用default服务账户,但是default这个服务账号权限特别大,任何操作都能执行,在公司中我们是不允许这样的事情发生的;主要的原因就是为了保护资源,防止误删
- 所以这个时候我们就需要用到service account了,对资源限制权限,给它我们想给的权限,这样就能有效的保护好我们资源
3、创建出来的sa可以直接就使用吗?
但是一个sa创建出来了有什么用呢?这个问题值得深思
- 在任何地方一个账号创建出来了,单单从账号本身是没有任何意义的;就像我们去银行开银行卡需要开户一样的,虽然说银行都是有vip和普通用户的,但是单纯的只看账号的话,账号就是一长串的数字而已;在k8s中也是一样的,如果单单只看sa这个账户的话,一个sa被创建出来了,并没有很大的意义的。
- 回归到生活中,为什么银行里面有vip会员,还有更多的普通账户呢?那是因为他们在账户的钱多,钱多了也就变成vip了;那么这跟我们k8s中的sa又有什么关系呢?答案是:有关系的。
- 在k8s集群中的sa,也是需要“充钱”进去才能变成“vip”的,这里面的”钱“,就是我们在集群中所说的角色role了,创建一个角色,赋予它一定的权限;但是我们需要将它跟我们所创建出来的角色绑定在一起,那这个sa就会变成”vip“了,那么这个sa的意义就有了。
4、sa有意义了,我们怎样去使用它?
- 现在是万事俱备只欠东风了,账号有了,权限也有了,那么我们怎样去使用它呢?
- 很简单,只要我们在创建新资源的时候(比如说pod、deployment),在yaml文件中指定使用你想指定的sa账户,就可以了;
- 指定了服务账户之后,我们把pod创建出来了,我们在使用这个pod时,这个pod就有了我们指定的账户的权限了,这样就能达到我们在公司中的需求了。
二、User Account总结
1、在k8s中User Account到底是什么?
- 只要我们理解了前面的service account的话,这里就更容易理解了;前面我们说的service account在k8s集群中是给进程/pod使用的,但是这里我们要讲的User Account,是给我们用户,也就是给人用的
- 其实并不难理解,举个例子就很好的能理解到这个UA在k8s中是什么了:
- 在linux操作系统中,我们有且仅有一个root账户,还能有若干个普通账户;root账户的权限最大,普通账户如果需要某些特殊的权限的话,是需要我们root账户去给它授权的
- 而这些给我们提供使用的,在k8s的具体体现,那就是user account
2、为什么需要User Account?
- 在k8s集群中跟linux操作系统是一样的,我们默认的账户是:kubernetes-admin@kubernetes,管理员账户,权限也是最大的,在k8s集群中畅通无阻
- 但是在企业中,并不是只有我们一个人使用k8s集群,还有很多的研发人员都是需要使用集群的;这时我们需要给他们创建一些账号,但是这些账号权限又不能太大,以防误删资源,这个时候我们就能使用user account了
3、怎样创建普通账户?
- 创建普通账户很简单,首先我们要创建一系列的证书文件和密钥文件,如下:
Key 是私用密钥openssl格,通常是rsa算法。Csr 是证书请求文件,用于申请证书。在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥。crt是CA认证后的证书文,(windows下面的,其实是crt),签署人用自己的key给你签署的凭证。
- 创建完这些文件之后直接在命令行创建普通账户
[root@k8s-master ~]# kubectl config set-credentials zh --client-certificate=./zh.crt --client-key=./zh.key --embed-certs=true
4、普通账户有了,可以直接使用么?
- 虽然普通账户已经有了,但是单单一个账户并没有任何意义,需要有权限才行;那权限从何处来?
- 权限就从角色中来,创建完了账户后,我们还并不能直接使用它,使用它也没有任何意义,只是一个空壳而已;这时我们就需要创建一个角色,将角色跟账户互相绑定了,这个账户就有意义了
5、角色到底应该怎样创建?
角色主要分为两种:角色和集群角色,角色是比较有限制性的,只针对于指定的资源生效;而集群角色就权限就比较广泛了,新建了一个集群角色之后,这个角色将对整个集群受影响;在使用的过程中,具体情况具体分析,适合哪种就使用哪种
可见角色的重要性,那角色到底应该怎样去创建呢?
创建角色role的方法主要有两种:第一种方法是直接通过命令行创建,如下所示:
[root@k8s-master ~]# kubectl create role myrole --verb=get,list,watch --resource=pod,svc#创建了一个名叫myrole的角色,并且赋予它对pod、service有看的权限
第二种方法就是通过yaml文件去创建了,如下,普通角色的yaml文件:
apiVersion: rbac.authorization.k8s.io/v1 #api版本,使用kubectl explain +【要查询的资源,比如pod】 kind: Role metadata:name: pod-reader rules: #规则 - apiGroups: [""] # 空字符串""表明使用支持所有的api版本,一般都放空resources: ["pods"] #resources:资源#现在这些权限对哪些资源生效,这里写的是pod,如果想要多写几个,就用逗号隔开,其实就是一个列表verbs: ["get", "watch", "list"] #详细的权限:这三个都是查看的权限#verbose:冗长的,详细的,我们常用的有:rpm -ivh,显示详细/冗长信息#这里没有spec,写spec是有规律的,比如我们创建一个pod,pod中还有一个container,container也有它自己的很多重要的属性
集群角色的yaml文件,如下:
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 #会升级的,升级就不能用了 metadata: # ClusterRole是集群范围对象,所以这里不需要定义"namespace"字段name: secret-reader #这里就跟下面的互相对应 rules: - apiGroups: [""] resources: ["secrets"] #这里写的secretsverbs: ["get", "watch", "list"]
需要注意的是,角色和账户都创建好了,需要将他们俩绑定在一起,账户就会变得有意义,如下:
[root@k8s-master ~]# kubectl create rolebinding myrole-binding --role=myrole --user=zh
6、万事俱备只欠东风,怎样使用UA?
- 绑定做完了,使用就非常简单了,这个过程就相当于在linux中切换普通账户使用su - user 一样的
- 直接在命令上切换账户即可,语法如下:
[root@k8s-master ~]# kubectl config user-context zh@kubernetes【最后接的是具体账户名】#这个账户是k8s中的root用户,叫做admin用户,就是管理员
[root@k8s-master ~]# kubectl config user-context kubernetes-admin@kubernetes
大白话的方式跟你聊k8s中的SA和UA相关推荐
- 【网址收藏】k8s中helm方式安装postgresql及pgadmin
k8s中helm方式安装postgresql及pgadmin 安装命令: $ helm repo add runix https://helm.runix.net/ $ helm install my ...
- 关于K8s中Pod调度[选择器,指定节点,主机亲和性]方式和节点[coedon,drain,taint]标记的Demo
写在前面 嗯,整理K8s中pod调度相关笔记,这里分享给小伙伴 博文内容涉及: kube-scheduler组件的简述 Pod的调度(选择器.指定节点.主机亲和性)方式 节点的coedon与drain ...
- k8s部署jar包_学习K8S之路.6--- 在K8S中部署Jenkins,并使用Jenkins打包jar包
一:部署jenkins jenkins官网:https://jenkins.io/download/ jenkins镜像:https://hub.docker.com/r/jenkins/jenkin ...
- k8s中几种port介绍
1.端口所应用位置的不同 port是service的的端口 targetport是pod也就是容器的端口 nodeport是容器所在宿主机的端口(实质上也是通过service暴露给了宿主机,而port ...
- 9 个技巧,解决 K8s 中的日志输出问题
作者 | 元乙 阿里云存储服务技术专家 导读:近年来,越来越多的同学咨询如何为 Kubernetes 构建一个日志系统,或者是来求助在此过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是作者想 ...
- 【好文收藏】k8s中Pod 无法正常解析域名:部署 DNS 调试工具排查
k8s 中 Pod 无法正常解析域名:部署 DNS 调试工具排查 问题描述 最近将 Kubernetes 升级到 1.18.1 版本,不过升级完后,查看工作节点的部分 Pod 无法启动,查看消息全是 ...
- kubernetes(三)k8s中通信和Service
目录 1.同一个Pod中的容器通信 2.集群内Pod之间的通信 3 集群内Service-Cluster IP 4.外部服务访问集群中的Pod 4.1 Service-NodePort 4.2.Ser ...
- K8s 中使用 cert-manager 申请免费 Https 证书
K8s 中使用 cert-manager 申请免费 Https 证书 Intro 最近在尝试将自己的应用从自己用 kind 部署的一个 k8s 集群迁移到 Azure 的 AKS 上,其中一个问题就是 ...
- 在 k8s 中部署 Prometheus 和 Grafana
部署 Prometheus 和 Grafana 到 k8s Intro 上次我们主要分享了 asp.net core 集成 prometheus,以及简单的 prometheus 使用,在实际在 k8 ...
最新文章
- h5在线浏览word_怎样将PDF在线转换成Word?教你成为一个高手的方法
- numpy 滑动窗口取数据
- (转)Linux下C++开发初探
- Asp.net服务器端控件CheckBoxList的使用心得
- html 商品展示框
- stm32f030cc 替换 stm32f030c8 后程序下载失败问题
- [数据结构]邻接矩阵和邻接表存储的图DFS,BFS算法时间复杂度分析
- matlab 动态分配内存,[Matlab科学计算之高效编程] 1. 预分配内存
- mysqlbinlog 查看binlog时报错unknown variable 'default-character-set=utf8'
- Cissp全过程(简介到考试后)
- EMNLP'21 | Dialogue System 对话系统
- PS小技巧 | 不需要抠图的黑白配
- wordpress七步曲
- 北京的哪些地方开的发票可参与国家税务局的摇奖
- 华为防火墙配置(双机热备)
- 【修真院PM小课堂】流程图
- php 时辰,时辰算命 - 免费在线算命 - 三藏算命
- HCNP——RIPv1和RIPv2概况
- 2021免费大容量OneDrive + office 365桌面版 (a1 a1p)
- 超强的波多黎各,值得尊敬的美国队