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",
})


2418

被折叠的 条评论
为什么被折叠?



