需求:我们知道搭完k8s集群会创建一个默认的管理员kubernetes-admin用户该用户拥有所以权限,有一天开发或测试的同学需要登录到k8s集群了解业务pod的状态等,我们不可能提供管理员的账户给他不安全如果他因为某个高管。。。删库跑路啥办??,所以建一个只读账户迫在眉睫。

kubectl conifg命令常见操作:

  • kubectl config view:打印kubeconfig⽂件内容。
  • kubectl config set-cluster:设置kubeconfig的clusters配置段。
  • kubectl config set-credentials:设置kubeconfig的users配置段。
  • kubectl config set-context:设置kubeconfig的contexts配置段。
  • kubectl config use-context:设置kubeconfig的current-context配置段。
# kubectl config view 

一、我是用kubeadm部署的集群,给只读账户jackhe创建私钥及证书文件,并保存在/etc/kubernetes/pki目录下。

1)生成私钥文件。

cd /etc/kubernetes/pki/
umask 077;openssl genrsa -out jackhe.key 2048

2)创建证书部署请求,关键点其中-subj选项中的CN的值将被kubeconfig最为用户名使用。

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

3)用kubernetes集群生成的CA签署证书,设置有限时间3650天。

openssl x509 -req -in jackhe.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out jackhe.crt -days 3650

4)验证证书信息。

openssl x509 -in jackhe.crt  -text -noout

二、创建一个新的集群信息,因为最终我们是提供config给使用者,默认的config文件有管理员信息当我们执行:kubectl config use-context kubernetes-admin@kubernetes就拥有了管理权限,这是不被允许的。

kubectl config set-cluster mycluster --kubeconfig=/tmp/config --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server="https://192.168.10.129:6443"

选项:

--kubeconfig="":配置文件存放路径
--certificate-authority="": 设置kuebconfig配置文件中集群选项中的certificate-authority路径。
--embed-certs=false: 设置kuebconfig配置文件中集群选项中的embed-certs开关。
--server="": 设置kuebconfig配置文件中集群选项中的server。

三、配置客户端证书及密钥,⽤户名信息会通过命令从证书Subject的CN值中⾃动提取,例如前⾯创建csr时使⽤的“CN=jackhe”.

kubectl config set-credentials jackhe --embed-certs=true --client-certificate=/etc/kubernetes/pki/jackhe.crt --client-key=/etc/kubernetes/pki/jackhe.key --kubeconfig=/tmp/config

选项:

--client-certificate="": 设置kuebconfig配置文件中用户选项中的证书文件路径。
--client-key="": 设置kuebconfig配置文件中用户选项中的证书密钥路径。
--embed-certs=false: 设置kuebconfig配置文件中用户选项中的embed-certs开关。

四、配置context,⽤来组合cluster和credentials,即访问的集群的上下⽂。

kubectl config set-context jackhe@mycluster --cluster=mycluster --user=jackhe --kubeconfig=/tmp/config

注意: jackhe@mycluster要对应上你新建的集群名字!!!
五、指定上下文切换到jackhe访问集群,我们能看到现在是没有任何权限的。

kubectl config use-context jackhe@mycluster --kubeconfig=/tmp/config
kubectl config view --kubeconfig=/tmp/config
kubectl get pod --kubeconfig=/tmp/config

六、接下来我们基于RBAC建立只读ClusterRole文件(权限可配置)。

kubectl apply -f  readonly.yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: cluster-readonly
rules:
- apiGroups:
- ""
resources:
- pods
- pods/attach
- pods/exec
- pods/portforward
- pods/proxy
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- persistentvolumeclaims
- replicationcontrollers
- replicationcontrollers/scale
- secrets
- serviceaccounts
- services
- services/proxy
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- bindings
- events
- limitranges
- namespaces/status
- pods/log
- pods/status
- replicationcontrollers/status
- resourcequotas
- resourcequotas/status
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- deployments
- deployments/rollback
- deployments/scale
- statefulsets
verbs:
- get
- list
- watch
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- get
- list
- watch
- apiGroups:
- batch
resources:
- cronjobs
- jobs
- scheduledjobs
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- daemonsets
- deployments
- ingresses
- replicasets
verbs:
- get
- list
- watch

七、创建基于用户jackhe的ClusterRoleBinding文件。

kubectl apply -f readonly.yaml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: cluster-readonly
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-readonly
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: jackhe

八、我们这时再测试已经有了只读权限。

kubectl get pod --kubeconfig=/tmp/config

九、大功告成,接下来我们只要把/tmp/config文件放到用户的家目录.kube下就可以使用了。

mkdir -p /home/jackhe/.kube
cp /tmp/config /home/jackhe/.kube/
chown -R jackhe.jackhe /home/jackhe/.kube/

OS切换到jackhe用户,我们能看到只有只读权限,也无法 上下文切换到kubernetes-admin@kubernetes ,因为配置文件里并没有相关信息。哈哈,还想删库跑路!!!

给你的Kubernetes集群建一个只读账户(防止高管。。。后)的更多相关文章

  1. kubeadm搭建kubernetes集群之一:构建标准化镜像

    使用docker可以批量管理多个容器,但都是在同一台电脑内进行的,这在实际生产环境中是不够用的,如何突破单机的限制?让多个电脑上的容器可以像单机上的docker-compose.yml管理的那样方便呢 ...

  2. 高可用Kubernetes集群原理介绍

    ■ 文/ 天云软件 云平台开发工程师 张伟 1. 背景 Kubernetes作为容器应用的管理中心,对集群内部所有容器的生命周期进行管理,结合自身的健康检查及错误恢复机制,实现了集群内部应用层的高可用 ...

  3. Kubernetes 集群日志 和 EFK 架构日志方案

    目录 第一部分:Kubernetes 日志 Kubernetes Logging 是如何工作的 Kubernetes Pod 日志存储位置 Kubelet Logs Kubernetes 容器日志格式 ...

  4. 企业运维实践-丢弃手中的 docker build , 使用Kaniko直接在Kubernetes集群或Containerd环境中快速进行构建推送容器镜像

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 首发地址: h ...

  5. Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群

    前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...

  6. 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群

    本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...

  7. Kubernetes — 从0到1:搭建一个完整的Kubernetes集群

    准备工作 首先,准备机器.最直接的办法,自然是到公有云上申请几个虚拟机.当然,如果条件允许的话,拿几台本地的物理服务器来组集群是最好不过了.这些机器只要满足如下几个条件即可: 满足安装 Docker ...

  8. K8S学习笔记之二进制的方式创建一个Kubernetes集群

    0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...

  9. 使用Minikube运行一个本地单节点Kubernetes集群(阿里云)

    使用Minikube运行一个本地单节点Kubernetes集群中使用谷歌官方镜像由于某些原因导致镜像拉取失败以及很多人并没有代理无法开展相关实验. 因此本文使用阿里云提供的修改版Minikube创建一 ...

随机推荐

  1. idea快捷键(最常用)

    --跳到上一空白行 ctrl+alt+enter --跳到下一空白行 shift+enter --为代码生成包裹快(try catch等) ctrl+alt+t --跳到某行 ctrl+g --实现父 ...

  2. IIS设置禁止某个IP或IP段访问网站的方法

    网站被刷,对话接不过来 打开IIS,选中禁IP的站点,找到“ip地址和域限制”这个功能,如果没有安装,打开服务器管理器,点击角色,窗口右边找到添加角色服务,找到“IP和域限制”并勾选安装. 打开ip地 ...

  3. uboot 编译

    . 解包u-boot源码包(u-boot-2016.07) . 配置交叉编译器 根据内核编译里的步骤配置 . 编译uboot yum install ncurses* // ncurses是个终端的图 ...

  4. 51)PHP,一个数据库操作类的代码

    <?php //类名,也习惯上(推荐)使用跟文件名相似的名字 //定义一个mysql连接类,该类可以连接mysql数据库 //并实现其单例模式 //该类的功能还能够完成如下基本mysql操作: ...

  5. LeetCode No.112,113,114

    No.112 HasPathSum 路径总和 题目 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. ...

  6. ready vs onload

    1 ready事件:当DOM载入就绪,可以查询,操纵时绑定一个要执行的函数.它可以极大地提高web应用程序的响应速度. 2  onload事件:js中的方法,网页的所有元素.图片全部加载完毕才执行这个 ...

  7. 阿里巴巴IconFont的使用方式

    一.解释一下为什么要使用IconFont? IconFont顾名思义就是把图标用字体的方式呈现. 其优点在于以下几个方面: 1.可以通过css的样式改变其颜色:(最霸气的理由) 2.相对于图片来说,具 ...

  8. 关于 Cantor 集不可数的新观点

    第一步操作:将区间 $[0,1]$ 中去掉开区间 $(\frac{1}{3},\frac{2}{3})$ 后,就形成了两个不交闭区间.于是这两个不交闭区间中至少有两个元素,正好是集合 $\{1\}$ ...

  9. OpenCV Canny 边缘检测

    #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...

  10. 吴裕雄--天生自然python学习笔记:Python3 命名空间和作用域

    命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空间是独立的,没有任何关系的,所以一个 ...