Kubernetes怎么限制不同团队只能访问各自namespace

其他教程   发布日期:2025年02月22日   浏览次数:171

本文小编为大家详细介绍“Kubernetes怎么限制不同团队只能访问各自namespace”,内容详细,步骤清晰,细节处理妥当,希望这篇“Kubernetes怎么限制不同团队只能访问各自namespace”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

场景说明

假设有这么一个场景:一个 Kubernetes 集群,有多个 namespace,然后每个 namespace 由一个工程团队去使用,不同的工程团队之间无法访问和操作其他团队的 namespace 下的资源,实现资源和权限隔离的目的。

1 | 实现思路

可以利用 Kubernetes 的 RBAC 来实现:

  • 在各自的 namespace 下创建一个 ServiceAccount

  • 在这个 namespace 下创建一个 Role,定义这个 Role 的权限规则(rules)

  • 将这个 Role 和 ServiceAccount 进行绑定

  • 最后生成一个kubeconfig,给到各个团队通过 kubectl 命令行调用

2 | 实现的脚本

需要的配置文件已经写好,如下:

  • create_kubeconfig.sh

  1. #!/bin/bash
  2. # Created by lanbitou 03.29.2023
  3. ns=$1
  4. name=$ns
  5. user=$name
  6. kubeconfig=$ns"-config"
  7. # kubernetes master api server 地址, 需要替换掉
  8. apiserver="https://123.456.789.ABC:6443"
  9. cluster="cluster_name_"$ns
  10. context=$cluster
  11. name=$name ns=$ns envsubst < create-role-rolebinding.yaml | kubectl apply -f -
  12. if [ $? != 0 ]
  13. then
  14. echo "error, exit=1"
  15. exit 1
  16. fi
  17. token=$(kubectl -n $ns get secret $(kubectl -n $ns get secret | grep $user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
  18. echo $token
  19. kubectl config set-credentials $user --token=$token --kubeconfig=$kubeconfig
  20. kubectl config set-cluster $cluster --insecure-skip-tls-verify=true --server=$apiserver --kubeconfig=$kubeconfig
  21. kubectl config set-context $context --cluster=$cluster --user=$user --kubeconfig=$kubeconfig
  22. kubectl config use-context $context --kubeconfig=$kubeconfig
  23. echo $kubeconfig' is created in the current path.'

NOTE

这个脚本要在 Kubernetes admin 权限的 kubeconfig 下运行。

  • create-role-rolebinding.yaml

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. name: $name
  5. namespace: $ns
  6. ---
  7. apiVersion: rbac.authorization.k8s.io/v1
  8. kind: Role
  9. metadata:
  10. namespace: $ns
  11. name: $name
  12. rules:
  13. - apiGroups: ["", "extensions", "apps"]
  14. #resources: ["pods", "services", "configmaps", "secrets","deployments","replicasets","statefulsets","daemonsets","pods/log","pods/exec","namespaces"]
  15. resources: ["*"]
  16. verbs: ["*"]
  17. - apiGroups: ["batch"]
  18. resources: ["jobs","cronjobs"]
  19. verbs: ["*"]
  20. - apiGroups: ["apiextensions.k8s.io"]
  21. resources: ["customresourcedefinitions"]
  22. verbs: ["*"]
  23. # 如果发现生成的kubeconfig权限不足,可以根据提示,在这里添加对应的rule
  24. ---
  25. apiVersion: rbac.authorization.k8s.io/v1
  26. kind: RoleBinding
  27. metadata:
  28. name: $name
  29. namespace: $ns
  30. subjects:
  31. - kind: ServiceAccount
  32. name: $name
  33. namespace: $ns
  34. roleRef:
  35. kind: Role
  36. name: $name
  37. apiGroup: rbac.authorization.k8s.io

3 | 使用方式

假设,有 zhangsan,lisi,wangwu 三个团队,namespace 也是 zhangsan,lisi,wangwu。

那么执行脚本如下:

  1. $ bash create_kubeconfig.sh zhangsan
  2. $ bash create_kubeconfig.sh lisi
  3. $ bash create_kubeconfig.sh wangwu

即可在脚本所在目录,生成对应的kubeconfig:zhangsan-config, lisi-config 和 wangwu-config。 那么,不同团队对k8s集群的访问就可以这样进行:

  1. $ kubectl -n zhangsan --kube-config=zhangsan-config get all

以上就是Kubernetes怎么限制不同团队只能访问各自namespace的详细内容,更多关于Kubernetes怎么限制不同团队只能访问各自namespace的资料请关注九品源码其它相关文章!