k8s权限控制RBAC

1、简介

kubernetes集群所有的交互都是通过apiServer来进行的,因此k8s对权限的控制就尤其重要。

从1.6版本起,kubernetes默认启用RBAC访问控制策略。RBAC(Role-Based Access Control):基于角色的访问控制

相关概念:

RBAC中4种顶级资源:Role、ClusterRole、RoleBinding、ClusterRoleBinding

  • Role:角色,包含一组权限的规则。没有拒绝规则,只是附加运行。Namespace隔离,只作用于命名空间

  • ClusterRole:和Role的区别,Role只作用于命名空间内,ClusterRole作用于整个集群,也就是所有Namespace

  • RoleBinding:作用于命名空间内,将ClusterRole或Role绑定于User、Group或ServiceAccount

  • ClusterRoleBinding:作用于整个集群,将ClusterRole或Role绑定于User、Group或ServiceAccount

  • 用户:k8s有两种用户:User和ServiceAccount。其中user是给人来使用的,serviceAccount是给进程来使用的。当一个运行在k8s中的进程需要访问apiServer时,我们就需要给其创建一个serviceAccount,并通过role来限制这个serviceAccount的权限,最后通过rolebinding将role绑定到该serviceAccount上。

可以通过kubectl create 来创建role、clusterrole、rolebinding、clusterrolebinding和serviceAccount

在这里插入图片描述

 

1.1 创建serviceAccount

命令如下:

kubectl create sa <Name>
或
kubectl create serviceAccount <Name>


# 例如
kubectl create serviceaccount my-sa
  • Name: 要创建的serviceAccount的名字

 

1.2 创建role

命令如下:

kubectl create role <RoleName> [options]

常用options:
    --resource=[]:
        Resource that the rule applies to
    --verb=[]:
        Verb that applies to the resources contained in the rule
        
# 例如: 创建一个名为role-test的role,可以操作的资源为pod和deployment,可以进行的操作为get,create,list,watch,update,delete
kubectl create role role-test --resource=pod,deployment --verb=get,create,list,watch,update,delete
  • RoleName:要创建的role的名字
  • –resource:指定该role可以操作的资源,例如pod、deployment、service等
  • –verb:指定该role对资源可以进行的操作,例如get、list、watch、update、create、delete、patch等

 

1.3 创建rolebinding

命令如下:

kubectl create rolebinding <RBNAME> [options]

常用options:
   --role='':
        Role this RoleBinding should reference
   --serviceaccount=[]:
        Service accounts to bind to the role, in the format <namespace>:<name>. The flag can be
        repeated to add multiple service accounts.
   --clusterrole='':
        ClusterRole this RoleBinding should reference

# 例如 将role-test和my-sa进行绑定,绑定后my-sa就拥有了role中定义的规则
kubectl create rolebinding rb-test --role=role-test --serviceaccount=my-sa
  • RBNAME:rolebinding的名字
  • –role:要进行绑定的role的name
  • –clusterrole:要进行绑定的clusterrole的name
  • –serviceaccount:要进行绑定的serviceaccount的name

 

2、实战案例

下面将使用client go编写一个程序,该程序可以对default命名空间下的deploy进行create、update、get和delete的操作。最后将该程序部署到k8s的deploy中。

代码如下:

package main

import (
	"context"
	"github.com/gin-gonic/gin"
	appsv1 "k8s.io/api/apps/v1"
	corev1 "k8s.io/api/core/v1"
	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	appsresv1 "k8s.io/client-go/kubernetes/typed/apps/v1"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/util/retry"
	"k8s.io/klog/v2"
	"net/http"
)

func main() {
   
   

	// 1、创建配置文件,由于要在k8s中运行,使用InClusterConfig可以获取到serviceAccount的配置
	config, err := rest.InClusterConfig()
	if err != nil {
   
   
		panic(err)
	}

	// 2、创建clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
   
   
		panic(err)
	}
	deployClient := clientset.AppsV1().Deployments(corev1.NamespaceDefault)

	r := gin.Default()
	r.PUT("/deploy", func(c *gin.Context) {
   
   
		if err := CreateDeploy(deployClient); err != nil {
   
   
			JsonErr(c, err)
			return
		}

		c.JSON(http.StatusOK, gin.H{
   
   
			"message": "success",
		})
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值