ServiceAccount

ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户。

ServiceAccount仅局限它所在的namespace,每个namespace创建时都会自动创建一个default service account。

创建Pod时,如果没有指定Service Account,Pod则会使用default Service Account。

通过以下命令可以查看我们前面创建chesterns这个namespace下的serviceaccount与对应的secret

  1. kubectl describe pod -n chesterns
  2. kubectl describe sa -n chesterns
  3. kubectl describe secrets -n chesterns

通过以下命令查看serviceaccount挂载进容器内部的文件

  1. 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

  1. kubectl create sa chestersa -n chesterns
  2. kubectl describe sa chestersa -n chesterns

通过指定serviceAccountName,让pod使用自定义的sa

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: chesterdeployment
  5. namespace: chesterns
  6. labels:
  7. app: chesterapi
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: chesterapi
  13. template:
  14. metadata:
  15. labels:
  16. app: chesterapi
  17. spec:
  18. serviceAccountName: chestersa
  19. containers:
  20. - name: oneapi
  21. image: registry.cn-beijing.aliyuncs.com/chester-k8s/oneapi:latest
  22. ports:
  23. - containerPort: 5000
  24. livenessProbe:
  25. httpGet:
  26. path: /test
  27. port: 5000
  28. - name: twoapi
  29. image: registry.cn-beijing.aliyuncs.com/chester-k8s/twoapi:latest
  30. ports:
  31. - containerPort: 5001
  32. livenessProbe:
  33. httpGet:
  34. path: /test/calloneapi
  35. port: 5001

我们可以配置serviceaccount中的ImagePullSecret,拉取私有镜像。

创建secret

  1. kubectl create secret docker-registry aliregistry --docker-server=registry.cn-beijing.aliyuncs.com --docker-username=陈xx --docker-password=xxxxx -n chesterns
  1. kubectl edit sa chestersa -n chesterns
  2.  
  3. imagePullSecrets: #添加此字段
  4. - name: aliregistry

通过我们自定义的sa拉取私有镜像

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: chesterdeployment
  5. namespace: chesterns
  6. labels:
  7. app: chesterapi
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: chesterapi
  13. template:
  14. metadata:
  15. labels:
  16. app: chesterapi
  17. spec:
  18. serviceAccountName: chestersa
  19. containers:
  20. - name: oneapi
  21. image: registry.cn-beijing.aliyuncs.com/chester-k8s/privateoneapi:latest
  22. ports:
  23. - containerPort: 5000
  24. livenessProbe:
  25. httpGet:
  26. path: /test
  27. port: 5000

通过以下命令验证私有镜像拉取状态

  1. kubectl delete -f deployment.yaml
  2. kubectl apply -f deployment.yaml
  3. 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的权限

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: Role
  3. metadata:
  4. name: chesterrole
  5. namespace: chesterns
  6. rules:
  7. - apiGroups: [""]
  8. resources: ["pods"]
  9. verbs: ["get","watch","list"]
  1. kubectl create -f role.yaml
  2. kubectl get role -n chesterns

修改初始化集群时,应用kubeconfig文件的模式

  1. vi /etc/profile
  2. export KUBECONFIG=/etc/kubernetes/admin.conf #删除
  3. source /etc/profile
  4.  
  5. mkdir -p $HOME/.kube
  6. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  7. sudo chown $(id -u):$(id -g) $HOME/.kube/config

创建用户

  1. useradd chester
  2. su - chester
  3. #尝试访问集群
  4. kubectl get pod

下载cfssl

  1. cd /usr/bin
  2.  
  3. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  4. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  5. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  6.  
  7. ## 改名,给执行权限
  8. mv cfssl_linux-amd64 cfssl
  9. mv cfssljson_linux-amd64 cfssljson
  10. mv cfssl-certinfo_linux-amd64 cfssl-certinfo
  11. chmod +x *
  12. ll -h

生成证书

  1. mkdir /usr/local/chestercert
  2. cd /usr/local/chestercert
  3.  
  4. vi chester-csr.json
  1. {
  2. "CN": "chester",
  3. "hosts": [],
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "L": "BeiJing",
  12. "O": "Ctyun",
  13. "ST": "BeiJing",
  14. "OU": "System"
  15. }
  16. ]
  17. }
  1. cd /etc/kubernetes/pki/
  2. cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes /usr/local/chestercert/chester-csr.json | cfssljson -bare chesteruser
  3. ls

为chester用户生成集群配置文件

  1. 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
  2. ls

绑定用户信息至kubeconfig中

  1. kubectl config set-credentials chesteruser \
  2. --client-certificate=/etc/kubernetes/pki/chesteruser.pem \
  3. --client-key=/etc/kubernetes/pki/chesteruser-key.pem \
  4. --embed-certs=true \
  5. --kubeconfig=chester.kubeconfig

设置上下文参数

  1. kubectl config set-context kubernetes \
  2. --cluster=kubernetes \
  3. --user=chesteruser \
  4. --namespace=chesterns \
  5. --kubeconfig=chester.kubeconfig

把kubeconfig文件复制到chester用户的目录的.kube下

  1. mkdir -p /home/chester/.kube
  2. cp chester.kubeconfig /home/chester/.kube/config
  3. cd /home/chester/.kube/
  4. ls
  5. config
  6.  
  7. ## 修改文件所有者
  8. cd /home/chester/
  9. 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。

  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: RoleBinding
  3. metadata:
  4. name: chesterrolebinding
  5. namespace: chesterns
  6. subjects:
  7. - kind: User
  8. name: chester
  9. apiGroup: rbac.authorization.k8s.io
  10. roleRef:
  11. kind: Role
  12. name: chesterrole
  13. apiGroup: rbac.authorization.k8s.io
  1. kubectl apply -f rolebinding.yaml
  2. kubectl describe rolebinding -n chesterns

验证chester用户能否正常访问

  1. su chester
  2. cd /home/chester/.kube
  3. kubectl config use-context kubernetes --kubeconfig=config
  4. 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. Ubuntu20重装nvidia驱动

    终端:nvidia-smi 查看驱动信息 错误:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver ...

  2. blender导入灰度图生成地形模型

    安装软件 在此处下载blender并安装. 添加平面 1.打开blender,右键删除初始的立方体. 2.shift+a选择平面添加进场景: 3.按下s键鼠标拖动调节平面大小确定后按下鼠标左键: 4. ...

  3. Mac欺骗实验

    实验目的 1.掌握MAC欺骗的原理 2.学会利用MacMakeUp软件工具进行伪造源MAC地址的MAC欺骗. 实验内容 使用MacMakeUp伪造主机mac地址,进行mac欺骗实验. 实验环境描述 1 ...

  4. Maven-compiler-plugin 插件编译过程中报缺失get/set方法

    一般都是由于使用了lombok插件导致的 解决方法: 首先将compiler插件版本升级到3.3以上, 查询资料发现说有可能是版本太低导致 在configuration中添加上annotationPr ...

  5. 案例二:shell脚本获取当前日期和时间及磁盘使情况

    习题分析 本题有两个核心知识点: 1. 如何自动表示当天的日期 2. 磁盘使用情况 打印日期的命令为 date,示例命令如下: # date 2017 年 12 月 20 日 星期三 16:26:55 ...

  6. spring 与java EE

    javaEE 和 j2EE一样吗?  javaEE (java platform Enterprise Edition) 1999年,Sun公司将java分为3个版本,即 标准版(J2SE) , 企业 ...

  7. 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 ...

  8. 前端js webuploader上传(导入)excel文件

    项目开发中用到导入(上传)Excel文件 我使用的是百度的webuploader: 1:下载:http://fex.baidu.com/webuploader/(官方下载/示例) 2:使用Web Up ...

  9. MongoDB创建普通账户与admin账户的配置方法

    MongoDB数据库设置账户及权限的方法 1.如果MongoDB服务正在运行的情况下,需先停止该服务 在cmd(命令提示符)下输入net stop MongoDB,按下enter(回车键) 运行结果: ...

  10. (转载)《Three easy pieces 》虚拟化部分整体介绍

    转载自知乎:https://zhuanlan.zhihu.com/p/37917910 一个程序在运行的时候发生了什么呢? 其实只是一些非常简单的事情:运行指令.处理器从内存中取出指令,译码然后执行. ...