在Azure AKS集群运维和应用运维场景中,通常会有多个角色,并需要对不同的角色进行授权,后文针对几种常用的角色进行授权示例。
AKS使用Azure AD作为身份认证有两种模式,Azure AD Authentication with Kubernetes RBAC 和Azure AD Authentication with Azure RBAC。将在这两种模式下,对几种角色进行授权测试验证。
在进行授权时,所使用的管理员账号需要是Azure 订阅的Owner或者 并具备AKS的Cluster admin 权限。此处使用我个人账户,已具备此权限。
后续步骤将在AD域中创建个测试账号,也可以创建组,把对应用户加到组里就行。
集群管理员:clusteradmin1 ,具备集群管理及应用管理的一切权限。
应用管理员:appadmin1,具备所有namespace下应用管理权限,但不能修改集群配置。
项目应用管理员:projectadmin1,具备单一namespace下应用管理权限。
项目应用只读人员:projectreader1,具备单一namespace下应用只读权限。
以上权限,角色不光要在命令行中可以执行对应权限,也要在portal上能查看对应资源。
注意:
两种认证模式切换前,对所有的自定义role,clusterrole及rolebinding,clusterrolebinding进行备份。
### 1. 创建AD域账户
AAD_PW = Laocai@2023
az ad user create --display-name "clusteradmin1" --user-principal-name clusteradmin1@3162003qq.onmicrosoft.com --password $AAD_PW
az ad user create --display-name "appadmin1" --user-principal-name appadmin1@3162003qq.onmicrosoft.com --password $AAD_PW
az ad user create --display-name "projectadmin1" --user-principal-name projectadmin1@3162003qq.onmicrosoft.com --password $AAD_PW
az ad user create --display-name "projectreader1" --user-principal-name projectreader1@3162003qq.onmicrosoft.com --password $AAD_PW
如果需要创建组,并把用户添加到组里,按照这个方法
az ad group create --display-name grp-appadm --mail-nickname grp-appadm
GRP_APPADM_ID = $( az ad group list --display-name grp-appadm --query [].id -o tsv)
# 查询appadmin1的id
APPADM_ID = $( az ad user list --display-name "appadmin1" --query [].id -o tsv)
# 把user appadmin1 添加到组 grp-appadm
az ad group member add --group grp-appadm --member-id $APPADM_ID
# 记下组的id,后续如果要对组授权,使用id作为对象
[root@ffffcentos ~]# echo $GRP_APPADM_ID
1caa8c26-fbce-4c55-9a19-0adb0a82f79c
在az role assignment 或者Kubernetes RBAC 对组进行授权时,使用的组的id,比如1caa8c26-fbce-4c55-9a19-0adb0a82f79c。
对用户授权时候,使用的 userPrincipalName ,就是创建用户时候的参数--user-principal-name 的值 appadmin1@3162003qq.onmicrosoft.com
### 2. AKS环境准备
创建一个AKS, Authentication and Authorization 设定为 Azure AD Authentication with Kubernetes RBAC。
配置可以选低一点,节点size B2ms,数量1。其他默认即可。
记录下AKS ID
AKS_ID = $( az aks show --resource-group RG-cf-demo --name aks-test --query id -o tsv)
### 3. 应用环境准备
管理员创建namespace和nginx deployment
kubectl create namespace mobile
kubectl -n mobile create deploy front --image=nginx --replicas=2 --port=80
kubectl -n mobile expose deploy front
查看资源已创建
[root@ffffcentos ~]# kubectl -n mobile get all
NAME READY STATUS RESTARTS AGE
pod/front-c95584cb9-9nl9g 1 /1 Running 0 36 s
pod/front-c95584cb9-h54z5 1 /1 Running 0 36 s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT ( S ) AGE
service/front ClusterIP 10.0 .171.168 < non e> 80 /TCP 4 s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/front 2 /2 2 2 37 s
NAME DESIRED CURRENT READY AGE
replicaset.apps/front-c95584cb9 2 2 2 37 s
### 4. 基于Kubernetes RBAC授权
授权集群管理员:clusteradmin1 ,具备集群管理及应用管理的一切权限。
授予AKS的 Contributor 权限
授予AKS 二级资源组Contributor 权限,在Properties — Infrastructure resource group 查看,默认名是MC_RG开头,如MC_RG-cf-demo_aks-test_westus2。此资源组下是AKS的虚拟机规模集,路由表,负载均衡等信息。
az role assignment create --assignee clusteradmin1@3162003qq.onmicrosoft.com --role "Contributor" --scope $AKS_ID
az role assignment create --assignee clusteradmin1@3162003qq.onmicrosoft.com --role "Contributor" --scope /subscriptions/3c398848-b31e-427a-aa4e-3b87b2ae6064/resourceGroups/MC_RG-cf-demo_aks-test_westus2
授权集群管理能力
kubectl create clusterrolebinding rb-clusteradmin1 --clusterrole=cluster-admin --user=clusteradmin1@3162003qq.onmicrosoft.com
以上,clusteradmin1 已经具备了集群管理的能力,可以修改集群配置,扩容节点。重建pod,或者是删除应用。
授权应用管理员:appadmin1,具备所有namespace下应用管理权限,但不能修改集群配置。
授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用
az role assignment create --assignee appadmin1@3162003qq.onmicrosoft.com --role "Reader" --scope $AKS_ID
授权应用管理能力
kubectl create clusterrolebinding rb-appadmin1 --clusterrole=admin --user=appadmin1@3162003qq.onmicrosoft.com
可以变更应用,比如删除pod。但是不能变更集群配置,比如扩容节点。
授权项目应用管理员:projectadmin1,具备单一namespace下应用管理权限。
授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用
az role assignment create --assignee projectadmin1@3162003qq.onmicrosoft.com --role "Reader" --scope $AKS_ID
授权项目应用管理能力
kubectl -n mobile create rolebinding rb-projectadmin1 --clusterrole=admin --user=projectadmin1@3162003qq.onmicrosoft.com
# 正常情况下,如果 projectadmin1 通过命令行访问aks,上面的步骤已经足够了。
# 如果想通过portal查看deployment,需要额外赋予一个namespace read的权限。
# 不然在查看workloads-- deployments,pods等,namespace的下拉框无法选择到mobile namespace
kubectl create clusterrole ns-reader --verb=get,list,watch --resource=namespaces
kubectl create clusterrolebinding rb-projectadmin1-2 --clusterrole=ns-reader --user=projectadmin1@3162003qq.onmicrosoft.com
授权ns-reader前
授权ns-reader后,能看到所有namespace,但是mobile namespace 之外的deployment,pod是无法查看的
可以查看、编辑mobile namespace下资源
授权项目应用只读人员:projectreader1,具备单一namespace下应用只读权限。
和上面项管理员类似,clusterrole ns-reader 已存在,就不用再次创建了。
授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用
az role assignment create --assignee projectreader1@3162003qq.onmicrosoft.com --role "Reader" --scope $AKS_ID
授权项目应用查看能力,使用现成的role为view
kubectl -n mobile create rolebinding rb-projectreader1 --clusterrole=view --user=projectreader1@3162003qq.onmicrosoft.com
# 正常情况下,如果 projectadmin1 通过命令行访问aks,上面的步骤已经足够了。
# 如果想通过portal查看deployment,需要额外赋予一个namespace read的权限。
# 不然在查看workloads-- deployments,pods等,namespace的下拉框无法选择到mobile namespace
# clusterrole ns-reader 之前已经创建过了
kubectl create clusterrolebinding rb-projectreader1-2 --clusterrole=ns-reader --user=projectreader1@3162003qq.onmicrosoft.com
登录portal,确认只具备mobile namespace权限,且为只读
### 5. 基于Azure RBAC授权
Azure RBAC和Kubernetes RBAC之间切换,先把role,rolebinding,clusterrole,clusterrolebinding做备份,切换可能丢失。
直接在portal上AKS—Cluster configuration 中修改成 Azure AD authentication with Azure RBAC
删除之前的授权,重新进行测试,或者重建一个AKS集群。
授权集群管理员:clusteradmin1 ,具备集群管理及应用管理的一切权限。
直接使用Azure自带的role,这两个操作也可以在portal上面操作
# 授权AKS管理权限
az role assignment create --assignee clusteradmin1@3162003qq.onmicrosoft.com --role "Azure Kubernetes Service Cluster Admin Role" --scope $AKS_ID
# 授权应用管理权限
az role assignment create --assignee clusteradmin1@3162003qq.onmicrosoft.com --role "Azure Kubernetes Service RBAC Cluster Admin" --scope $AKS_ID
授权应用管理员:appadmin1,具备所有namespace下应用管理权限,但不能修改集群配置。
授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用
az role assignment create --assignee appadmin1@3162003qq.onmicrosoft.com --role "Azure Kubernetes Service Cluster User Role" --scope $AKS_ID
授权应用管理能力,此角色不能删除或修改quota及namespace
az role assignment create --assignee appadmin1@3162003qq.onmicrosoft.com --role "Azure Kubernetes Service RBAC Admin" --scope $AKS_ID
授权项目应用管理员:projectadmin1,具备单一namespace下应用管理权限。
授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用
az role assignment create --assignee projectadmin1@3162003qq.onmicrosoft.com --role "Azure Kubernetes Service Cluster User Role" --scope $AKS_ID
授权项目应用管理能力
# 授权单个namespace权限,这一步只能通过命令,无法在portal上操作。在AKS_ID后面接namespace,示例如下
az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee projectadmin1@3162003qq.onmicrosoft.com --scope $AKS_ID /namespaces/mobile
linux 使用一个新用户, az login 登录projectadmin1@3162003qq.onmicrosoft.com ,并连接到aks,测试权限
[caifeng@ffffcentos ~]$ kubectl get po -n mobile
NAME READY STATUS RESTARTS AGE
front-c95584cb9-pb529 1 /1 Running 0 12 h
front-c95584cb9-tkgd8 1 /1 Running 0 12 h
[caifeng@ffffcentos ~]$ kubectl -n mobile delete po front-c95584cb9-pb529
pod "front-c95584cb9-pb529" deleted
[caifeng@ffffcentos ~]$ kubectl get ns
Error from server (Forbidden): namespaces is forbidden: User "projectadmin1@3162003qq.onmicrosoft.com" cannot list resource "namespaces" in API group "" at the cluster scope: User does not have access to the resource in Azure. Update role assignment to allow access.
和之前Kubernetes RBAC时一样,只具备单一namespace的权限,无法get namespace,但在命令行通过操作mobile namespace下资源是没问题的。
如果想通过portal查看deployment,需要额外赋予一个namespace read的权限。
不然在查看workloads-- deployments,pods等,namespace的下拉框无法选择到mobile namespace
需要创建一个新的Aure role并授权
# 这步用管理员权限做
# 创建一个新的role, namespace-reader.json
# role 生效的范围是订阅,本订阅内其他aks也可以使用这个role
{
"Name" : "AKS Namespace Reader",
"Description" : "Lets you view all namespace in cluster.",
"Actions" : [],
"NotActions" : [],
"DataActions" : [
"Microsoft.ContainerService/managedClusters/namespaces/read"
],
"NotDataActions" : [],
"assignableScopes" : [
"/subscriptions/3c398848-b31e-427a-aa4e-3b87b2ae6064"
]
}
# 把这个role 授权给用户,范围是AKS,不要带namespace
az role assignment create --role "AKS Namespace Reader" --assignee projectadmin1@3162003qq.onmicrosoft.com --scope $AKS_ID
使用projectadmin1@3162003qq.onmicrosoft.com 登录portal 测试mobile namespace权限。
授权项目应用只读人员:projectreader1,具备单一namespace下应用只读权限。
和上面项管理员类似,AKS Namespace Reader 已存在,就不用再次创建了。
授予AKS的 Reader 权限,便于从portal上看到AKS集群和应用
az role assignment create --assignee projectreader1@3162003qq.onmicrosoft.com --role "Azure Kubernetes Service Cluster User Role" --scope $AKS_ID
授权项目应用管理能力
# 授权单个namespace权限,这一步只能通过命令,无法在portal上操作。在AKS_ID后面接namespace,示例如下
az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee projectreader1@3162003qq.onmicrosoft.com --scope $AKS_ID /namespaces/mobile
# 授权namespace read 权限,范围是AKS,不要带namespace
az role assignment create --role "AKS Namespace Reader" --assignee projectreader1@3162003qq.onmicrosoft.com --scope $AKS_ID
以上k8s role都采用了系统自带的,也可以自己定义role的范围。
如果是Azure Role,可以在portal上选择一个已有role,点击后面的clone复制出来一个进行修改。或者见上面自己创建一个role-definition的文件导入进去,role的定义方法可以参照portal上现有的role json。
### 参考文档
https://learn.microsoft.com/en-us/azure/aks/manage-azure-rbac
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞4
添加新评论0 条评论