K8S原来如此简单(八)ServiceAccount+RBAC
ServiceAccount
ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户。
ServiceAccount仅局限它所在的namespace,每个namespace创建时都会自动创建一个default service account。
创建Pod时,如果没有指定Service Account,Pod则会使用default Service Account。
通过以下命令可以查看我们前面创建chesterns这个namespace下的serviceaccount与对应的secret
- kubectl describe pod -n chesterns
- kubectl describe sa -n chesterns
- kubectl describe secrets -n chesterns
通过以下命令查看serviceaccount挂载进容器内部的文件
- kubectl exec -it chesterdeployment-cb855fb4b-5ksgd -n chesterns -- ls /var/run/secrets/kubernetes.io/serviceaccount/
- ca.crt:根证书,用于Client端验证API Server发送的证书
- namespace:标识这个service-account-token的作用域空间
- token:使用API Server私钥签名的JWT,用于访问API Server时,Server端的验证
自定义ServiceAccount
- kubectl create sa chestersa -n chesterns
- kubectl describe sa chestersa -n chesterns
通过指定serviceAccountName,让pod使用自定义的sa
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: chesterdeployment
- namespace: chesterns
- labels:
- app: chesterapi
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: chesterapi
- template:
- metadata:
- labels:
- app: chesterapi
- spec:
- serviceAccountName: chestersa
- containers:
- - name: oneapi
- image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest
- ports:
- - containerPort: 5000
- livenessProbe:
- httpGet:
- path: /test
- port: 5000
- - name: twoapi
- image: registry.cn-beijing.aliyuncs.com/chester-k8s/twoapi:latest
- ports:
- - containerPort: 5001
- livenessProbe:
- httpGet:
- path: /test/calloneapi
- port: 5001
我们可以配置serviceaccount中的ImagePullSecret,拉取私有镜像。
创建secret
- kubectl create secret docker-registry aliregistry --docker-server=registry.cn-beijing.aliyuncs.com --docker-username=陈xx --docker-password=xxxxx -n chesterns
- kubectl edit sa chestersa -n chesterns
- imagePullSecrets: #添加此字段
- - name: aliregistry
通过我们自定义的sa拉取私有镜像
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: chesterdeployment
- namespace: chesterns
- labels:
- app: chesterapi
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: chesterapi
- template:
- metadata:
- labels:
- app: chesterapi
- spec:
- serviceAccountName: chestersa
- containers:
- - name: oneapi
- image: registry.cn-beijing.aliyuncs.com/chester-k8s/privateoneapi:latest
- ports:
- - containerPort: 5000
- livenessProbe:
- httpGet:
- path: /test
- port: 5000
通过以下命令验证私有镜像拉取状态
- kubectl delete -f deployment.yaml
- kubectl apply -f deployment.yaml
- kubectl describe pod -n chesterns
RBAC
在Kubernetes中,所有资源对象都是通过API对象进行操作,他们保存在etcd里。
而对etcd的操作我们需要通过访问 kube-apiserver 来实现,上面的Service Account其实就是APIServer的认证过程,而授权的机制是通过RBAC这个基于角色的访问控制实现。
Role与ClusterRole
在RBAC中,Role表示一组规则权限,权限只会增加(累加权限)。
Role 是定义在一个 namespace 中
ClusterRole 是集群级别的
定义Role
定义一个Role,限定在在名字为 chesterns namespace 中,对Pods有get,watch,list的权限
- apiVersion: rbac.authorization.k8s.io/v1
- kind: Role
- metadata:
- name: chesterrole
- namespace: chesterns
- rules:
- - apiGroups: [""]
- resources: ["pods"]
- verbs: ["get","watch","list"]
- kubectl create -f role.yaml
- kubectl get role -n chesterns
修改初始化集群时,应用kubeconfig文件的模式
- vi /etc/profile
- export KUBECONFIG=/etc/kubernetes/admin.conf #删除
- source /etc/profile
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
创建用户
- useradd chester
- su - chester
- #尝试访问集群
- kubectl get pod
下载cfssl
- cd /usr/bin
- wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
- wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
- wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
- ## 改名,给执行权限
- mv cfssl_linux-amd64 cfssl
- mv cfssljson_linux-amd64 cfssljson
- mv cfssl-certinfo_linux-amd64 cfssl-certinfo
- chmod +x *
- ll -h
生成证书
- mkdir /usr/local/chestercert
- cd /usr/local/chestercert
- vi chester-csr.json
- {
- "CN": "chester",
- "hosts": [],
- "key": {
- "algo": "rsa",
- "size": 2048
- },
- "names": [
- {
- "C": "CN",
- "L": "BeiJing",
- "O": "Ctyun",
- "ST": "BeiJing",
- "OU": "System"
- }
- ]
- }
- cd /etc/kubernetes/pki/
- cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /usr/local/chestercert/chester-csr.json | cfssljson -bare chesteruser
- ls
为chester用户生成集群配置文件
- kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --server=https://192.168.43.111:6443 --kubeconfig=chester.kubeconfig
- ls
绑定用户信息至kubeconfig中
- kubectl config set-credentials chesteruser \
- --client-certificate=/etc/kubernetes/pki/chesteruser.pem \
- --client-key=/etc/kubernetes/pki/chesteruser-key.pem \
- --embed-certs=true \
- --kubeconfig=chester.kubeconfig
设置上下文参数
- kubectl config set-context kubernetes \
- --cluster=kubernetes \
- --user=chesteruser \
- --namespace=chesterns \
- --kubeconfig=chester.kubeconfig
把kubeconfig文件复制到chester用户的目录的.kube下
- mkdir -p /home/chester/.kube
- cp chester.kubeconfig /home/chester/.kube/config
- cd /home/chester/.kube/
- ls
- config
- ## 修改文件所有者
- cd /home/chester/
- chown -R chester:chester .kube/
RoleBinding与ClusterRoleBinding
RoleBinding可以将角色中定义的权限授予用户或用户组。
RoleBinding包含一组权限列表(Subjects),权限列表中包含有不同形式的待授予权限资源类型(users,groups, or Service Account),Rolebinding 同样包含对被 Bind的Role
RoleBinding 适用于某个命名空间内授权
ClusterRoleBinding适用于集群范围内的授权。
定义RoleBinding
定义一个名称为chesterrolebinding,将chesterrole权限资源赋予名为chester的用户,仅作用于chesterns namespace。
- apiVersion: rbac.authorization.k8s.io/v1
- kind: RoleBinding
- metadata:
- name: chesterrolebinding
- namespace: chesterns
- subjects:
- - kind: User
- name: chester
- apiGroup: rbac.authorization.k8s.io
- roleRef:
- kind: Role
- name: chesterrole
- apiGroup: rbac.authorization.k8s.io
- kubectl apply -f rolebinding.yaml
- kubectl describe rolebinding -n chesterns
验证chester用户能否正常访问
- su chester
- cd /home/chester/.kube
- kubectl config use-context kubernetes --kubeconfig=config
- kubectl get pod -n chesterns
K8S原来如此简单(八)ServiceAccount+RBAC的更多相关文章
- K8S原来如此简单(七)存储
emptyDir临时卷 有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用. 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢.但对总体性能的影响很小的存储中. 再例如,有些应用 ...
- K8S原来如此简单(三)Pod+Deployment
上篇我们已经安装好k8s1.23集群,现在我们开始使用k8s部署我们的项目 Pod Pod 是一组容器集合,是可以在 Kubernetes 中创建和管理的.最小的可部署的计算单元.这些容器共享存储.网 ...
- K8S原来如此简单(四)Service+Ingress
上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问 Service service为一组pod提供一个统一的 ...
- K8S原来如此简单(五)Metrics Server与HPA
什么是HPA https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/ 我们前面有通过kubectl ...
- K8S原来如此简单(六)Pod调度
我们前面部署的pod调度取决于kube-scheduler,它会根据自己的算法,集群的状态来选择合适的node部署我们的pod. 下面我们来看下如何来根据我们自己的要求,来影响pod的调度. 定向no ...
- kubernetes实战(八):k8s集群安全机制RBAC
1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...
- K8S 使用简单的NFS 作为 持久存储的 StorageClass 的简单测试.
Study From https://jimmysong.io/kubernetes-handbook/practice/using-nfs-for-persistent-storage.html 1 ...
- K8s集群认证之RBAC
kubernetes认证,授权概括总结: RBAC简明总结摘要:API Server认证授权过程: subject(主体)----->认证----->授权[action(可做什么)]--- ...
- k8s数据管理(八)--技术流ken
volume 我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可以使用 ...
随机推荐
- Ubuntu20重装nvidia驱动
终端:nvidia-smi 查看驱动信息 错误:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver ...
- blender导入灰度图生成地形模型
安装软件 在此处下载blender并安装. 添加平面 1.打开blender,右键删除初始的立方体. 2.shift+a选择平面添加进场景: 3.按下s键鼠标拖动调节平面大小确定后按下鼠标左键: 4. ...
- Mac欺骗实验
实验目的 1.掌握MAC欺骗的原理 2.学会利用MacMakeUp软件工具进行伪造源MAC地址的MAC欺骗. 实验内容 使用MacMakeUp伪造主机mac地址,进行mac欺骗实验. 实验环境描述 1 ...
- Maven-compiler-plugin 插件编译过程中报缺失get/set方法
一般都是由于使用了lombok插件导致的 解决方法: 首先将compiler插件版本升级到3.3以上, 查询资料发现说有可能是版本太低导致 在configuration中添加上annotationPr ...
- 案例二:shell脚本获取当前日期和时间及磁盘使情况
习题分析 本题有两个核心知识点: 1. 如何自动表示当天的日期 2. 磁盘使用情况 打印日期的命令为 date,示例命令如下: # date 2017 年 12 月 20 日 星期三 16:26:55 ...
- spring 与java EE
javaEE 和 j2EE一样吗? javaEE (java platform Enterprise Edition) 1999年,Sun公司将java分为3个版本,即 标准版(J2SE) , 企业 ...
- cannot send list of active checks to "127.0.0.1": host [Zabbix server] not monitored
查看错误日志: /etc/log/zabbix/zabbix_server.log 3148:20210404:233938.363 cannot send list of active check ...
- 前端js webuploader上传(导入)excel文件
项目开发中用到导入(上传)Excel文件 我使用的是百度的webuploader: 1:下载:http://fex.baidu.com/webuploader/(官方下载/示例) 2:使用Web Up ...
- MongoDB创建普通账户与admin账户的配置方法
MongoDB数据库设置账户及权限的方法 1.如果MongoDB服务正在运行的情况下,需先停止该服务 在cmd(命令提示符)下输入net stop MongoDB,按下enter(回车键) 运行结果: ...
- (转载)《Three easy pieces 》虚拟化部分整体介绍
转载自知乎:https://zhuanlan.zhihu.com/p/37917910 一个程序在运行的时候发生了什么呢? 其实只是一些非常简单的事情:运行指令.处理器从内存中取出指令,译码然后执行. ...