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的更多相关文章

  1. K8S原来如此简单(七)存储

    emptyDir临时卷 有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用. 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢.但对总体性能的影响很小的存储中. 再例如,有些应用 ...

  2. K8S原来如此简单(三)Pod+Deployment

    上篇我们已经安装好k8s1.23集群,现在我们开始使用k8s部署我们的项目 Pod Pod 是一组容器集合,是可以在 Kubernetes 中创建和管理的.最小的可部署的计算单元.这些容器共享存储.网 ...

  3. K8S原来如此简单(四)Service+Ingress

    上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问 Service service为一组pod提供一个统一的 ...

  4. K8S原来如此简单(五)Metrics Server与HPA

    什么是HPA https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/ 我们前面有通过kubectl ...

  5. K8S原来如此简单(六)Pod调度

    我们前面部署的pod调度取决于kube-scheduler,它会根据自己的算法,集群的状态来选择合适的node部署我们的pod. 下面我们来看下如何来根据我们自己的要求,来影响pod的调度. 定向no ...

  6. kubernetes实战(八):k8s集群安全机制RBAC

    1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...

  7. K8S 使用简单的NFS 作为 持久存储的 StorageClass 的简单测试.

    Study From https://jimmysong.io/kubernetes-handbook/practice/using-nfs-for-persistent-storage.html 1 ...

  8. K8s集群认证之RBAC

    kubernetes认证,授权概括总结: RBAC简明总结摘要:API Server认证授权过程: subject(主体)----->认证----->授权[action(可做什么)]--- ...

  9. k8s数据管理(八)--技术流ken

    volume 我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可以使用 ...

随机推荐

  1. Java基于ClassLoder/ InputStream 配合读取配置文件

    阅读java开源框架源码或者自己开发系统时配置文件是一个不能忽略的,在阅读开源代码的过程中尝尝困惑配置文件是如何被读取到内存中的.配置文件本身只是为系统运行提供参数的支持,个人阅读源码时重点不大可能放 ...

  2. MyBatis功能点一应用:二级缓存整合redis

    Mybatis提供了默认的cache实现PerpetualCache,那为什么还要整合第三方的框架redis?因为Mybatis提供的cache实现为单机版,无法实现分布式存储(即本机存储的数据,其他 ...

  3. Python中模块调用说明

    1 import test # 导入test模块 2 3 print(test.a) # 使用"模块.变量"调用模块中的变量 4 5 test.hi() # 使用"模块. ...

  4. 使用Java的GUI技术实现 “ 贪吃蛇 ” 游戏

    详细教程: 使用Java的GUI技术实现 " 贪吃蛇 " 游戏_IT打工酱的博客-CSDN博客

  5. java操作excel(通过POI)

    读取所有数据,并打印出来,表单名:testcase 定义实体类(说明:这里单纯打印读取的excel内容,未用到实体类,反射的时候才会用到实体类) package com.qzcsbj; /** * @ ...

  6. Codeforces Round #726 (Div.2) A-E1 题解

    A. Arithmetic Array 题目大意:一串数,求添加多少个非负整数后平均值为1 代码: //CF726A #include<bits/stdc++.h> using names ...

  7. 禁用所有控制台console.log()打印

    在前端dev的环境下,经常会用到console.log()进行调试,以方便开发, 而在产品release的版本中,又不合适在浏览器的console中输出那么多的调试信息. 但是会经常因为没有删除这些开 ...

  8. JAVA Object类方法

    目录 Object类详解 一.==和equals的对比 1.1 ==是一个比较运算符 1.2 equals方法 二.hashCode方法 三.toString方法 四.finalize方法 Objec ...

  9. 0x01 向日葵日志溯源

    1.简介 向日葵工具具有linux桌面系统版本,在应急场景中,攻击者通过向日葵远控linux实现入侵是一种常见手法,通过分析向日葵的服务日志,可以分析出安全事件时间发生点前后有无向日葵远控的行为,但由 ...

  10. 测试平台系列(91) 编写oss管理页面

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们编写好了oss相关 ...