Kubernetes技术栈
  • 序章
  • Kubernetes 架构快速了解
  • 十分钟带你了解什么是kubernetes
  • 如何快速了解Kubernetes架构
  • 企业级镜像私有仓库Harbor
  • 二进制分布式安装Kubernetes1.13.10
    • 准备工作
  • 使用Kubeadm安装Kubernetes1.13.10
    • 准备工作
    • 基础环境设置
    • 安装高可用
    • 安装负载均衡
    • 安装Docker (Master/Node)
    • yum源安装kubeadm
    • Initialize第一个kubernetes master
    • 配置flannel组件
    • 加入集群
    • 配置dashboard
    • Master参与负载工作
    • 集群删除Node
  • Kubernetes 1.15.2 部署 Traefik2.0
  • Kubernetes1.15.2 监控(1)安装 Prometheus 2.11.1
  • Kubernetes 1.15.2监控(2)Monitor集群组件和PODS
  • kubernetes日志管理最佳实践EFK
  • Kubernetes1.15.2使用Ceph集群部署
  • Kubernetes1.15.2 中安装 jenkins 2.0
  • Kubernetes1.15.2使用jenkins 动态 slave
  • 什么是nginx-ingress控制器
  • Kubernetes Permission Controler概览
  • Permission Controler-通过Instance理解Kubernetes的Auth
  • Permission Controler-通过Instance理解Kubernetes的授权
  • Permission Controler-探索Kubernetes的Service Accounts
  • Kubernetes与Istio微服务架构
  • Kubernetes必须知道的HELM
Powered by GitBook
On this page

Was this helpful?

Permission Controler-通过Instance理解Kubernetes的授权

PreviousPermission Controler-通过Instance理解Kubernetes的AuthNextPermission Controler-探索Kubernetes的Service Accounts

Last updated 5 years ago

Was this helpful?

这一系列文档都是关于Kubernetes集群内部pods等资源对外部请求的认证与授权的管以及如何使用roles和role binding控制Kubernetes内部资源的访问权限。

  • Kubernetes Permission Controler概览

  • Permission Controler-通过Instance理解Kubernetes的Auth

  • Permission Controler-通过Instance理解Kubernetes的授权

  • Permission Controler-探索Kubernetes的Service Accounts

我们回顾下实验场景:线上的集群需要通过不同的namespaces隔离不同部门的员工。DevOps团队来了一位新员工Bob,他主要管理engineering namespace下的资源。他已经提交了私钥和证书,Kubetnets admin管理员也已经做好了Bob访问Kubernetes集群的认证工作。

如果你还没完成上面的实验环境,请参照。

接下来,我将授权Bob访问engineering namespace下的资源。

1. 为了方便切换不同的用户环境,首先为Kubectl配置context

kubectl config set-context eng-context \
	--cluster=minikube \
	--namespace=engineering \
	--user=bob

上面的命令将会使用Bob的认证创建可以访问集群engineering namespace的上下文环境。上面命令执行的最终将写到~/.kube/config file中。

cat ~/.kube/config | grep bob

2. 在engineering namespace下创建pod

cat >> myapp.yaml <<EOF
heredoc> apiVersion: v1
kind: Pod
metadata:
  name: myapp
  namespace: engineering
  labels:
    app: myapp
spec:
  containers:
  - name: myapp
    image: busybox
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
heredoc> EOF
kubectl create -f myapp.yaml

kubectl get pods -n engineering

3. 上面的命令我们使用是admin的用户,Bob用户并没有list engineering namespace pods的权限

kubectl get pods -n engineering --as bob

4. 对bob进行授权

为了让Bob可以访问engineering namespace下的资源,我们需要对Bob进行授权操作。主要是通过创建具有相关权限的role,然后将role绑定到Bob上。本质上,使用Role Based Access Control(RBAC)使的Bob具有对engineer namespace下资源特定操作的权限。

  • 在eng-reader的role中设置list engineering namespace下pods的权限

cat >> eng_role.yaml <<EOF
heredoc> kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: engineering
  name: eng-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods", "services", "nodes"]
  verbs: ["get", "watch", "list"]
heredoc> EOF
kubectl create -f eng_role.yaml

验证

kubectl get roles --namespace=engineering

接下来,我们将通过role binding将描述特殊权限的role授权给Bob用户。

cat >> role_binding_bob.yaml <<EOF
heredoc> kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: eng-read-access
  namespace: engineering
subjects:
- kind: User
  name: bob # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: eng-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io
heredoc> EOF
kubectl apply -f role_binding_bob.yaml

kubectl get rolebindings -n engineering

5. 验证Bob是否具有访问engineering namespace下资源的权限

kubectl get pods --namespace engineering --as bob

可见在bob绑定eng-reader权限后便具有list engineering namespace下资源的权限。

通过上面的例子可以完美演示如何通过权限限制bob访问集群,现在bob所能做的只是list engineering namspace下的pods。当好奇的我们使用bob查看集群的节点个数时,我们将会遇到下面的拒绝提示:

kubectl get nodes --as bob

6. 使用集群层级的cluster role和cluster role binding

不但可以使用namespace级别的Roles和role binding,还可以使用集群级别的。接下来我们创建集群级别的cluster role并将它绑定到用户bob,从而实现bob list 集群nodes个数的行为。

cat >> cluster_node_reader.yaml <<EOF
heredoc> kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  # "namespace" omitted since ClusterRoles are not namespaced
  name: cluster-node-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "watch", "list"]
heredoc> EOF
kubectl apply -f cluster_node_reader.yaml

kubectl get clusterroles cluster-node-reader

接下来通过 cluster role binding 将 cluster role绑定到bob上

cat >> cluster_node_reader_binding_bob.yaml <<EOF
heredoc> kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-cluster-nodes
subjects:
- kind: User
  name: bob # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-node-reader
  apiGroup: rbac.authorization.k8s.io
heredoc> EOF
kubectl apply -f cluster_node_reader_binding_bob.yaml

kubectl get clusterrolebinding   read-cluster-nodes

7. 验证bob是否具有list node的权限

kubectl get nodes --as bob

本篇文章我主要讲解role和role binding授权用户已特定的行为访问集群中的特定资源,在这个系列的中我将详细讲解service accounts。

文章翻译自,行文时略有删减

最后一篇文章
thenewstack.io/a-practical…
上一篇文章