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 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可以使用 ...
随机推荐
- Solution Set -「LOCAL」冲刺省选 Round XXV
\(\mathscr{Summary}\) 读错题了读错题了 B 题差点没做出来真的太吓人了. 逆序开题,C 题直接冲一发暴力最大权闭合子图居然过了.A 题确实一下子没想到用"可能的 ...
- 排查log4j不输出日志到文件的问题
问题描述 项目使用Spring Boot框架,在pom文件中添加了如下配置: <dependency> <groupId>org.slf4j</groupId> & ...
- Redis 源码简洁剖析 15 - AOF
AOF 是什么 AOF 持久化的实现 命令追加 AOF 文件的写入和同步 AOF 文件的载入和数据还原 AOF 重写 为什么需要重写 什么是重写 如何重写 AOF 后台重写 为什么需要后台重写 带来的 ...
- 关于Windows安装两个不同版本的MySQL详细步骤
关于Windows安装两个不同版本的MySQL详细步骤 安装两个不同版本的数据库原因 由于大部分教程所使用的数据库为5.7版本,而我之前安装的是8.0版本. 在一些特殊情况下,低版本数据库不能动,高版 ...
- nginx 配置ssl证书
1.443端口配置 server { listen 443 ssl; server_name www.test.com; ssl_certificate /usr/local/nginx/cert/t ...
- python-利用shutil模块rmtree方法可以将文件及其文件夹下的内容删除
import shutil import os image_path = os.path.join(os.path.dirname(__file__),'image') # 如果存在image目录则删 ...
- 4.2 K8S超级完整安装配置
前言: 采坑 k8s有3种安装方式,如下所示: minikube:这是一个k8s集群模拟器,只有一个节点的集群,只为了测试使用,master和node都在一台机器上 直接使用带有容器功能的云平台安装: ...
- 实践GoF的23种设计模式:SOLID原则(上)
摘要:本文以我们日常开发中经常碰到的一些技术/问题/场景作为切入点,示范如何运用设计模式来完成相关的实现. 本文分享自华为云社区<实践GoF的23种设计模式:SOLID原则(上)>,作者: ...
- 商业智能BI与用户行为分析的联系
什么是BI? BI(Business Intelligence)即商业智能,它是一套完整的解决方案,用来将企业中现有的数据进行有效的整合,分析利用企业已有的各种商用数据来了解企业的经营状况和外部环境 ...
- 从零搭建Pytorch模型教程(一)数据读取
前言 本文介绍了classdataset的几个要点,由哪些部分组成,每个部分需要完成哪些事情,如何进行数据增强,如何实现自己设计的数据增强.然后,介绍了分布式训练的数据加载方式,数据读取的整个 ...