kubeadm的rbac
什么是 Kubernetes RBAC基于角色的访问控制(Role-Based Access Control, 即 "RBAC"):使用 “rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过 Kubernetes API 动态配置策略。API 概述本节将介绍RBAC API所定义的四种顶级类型。用户可以像使用其他Kubernetes API资源一样
什么是 Kubernetes RBAC
基于角色的访问控制(Role-Based Access Control, 即 "RBAC"):使用 “rbac.authorization.k8s.io” API Group
实现授权决策,允许管理员通过 Kubernetes API 动态配置策略。
API 概述
本节将介绍RBAC API所定义的四种顶级类型。用户可以像使用其他Kubernetes API资源一样
(例如通过kubectl、API调用等)与这些资源进行交互。例如,命令 kubectl create -f (resource).yml
可以被用于以下所有的例子,当然,读者在尝试前可能需要先阅读以下相关章节的内容。[1]
RBAC 简易概览图
ClusterRole 与 Role
Role(角色): 是一系列权限的集合,例如一个角色可以包含读取 Pod 的权限和列出 Pod 的权限。Role 只能用来给某个特定 namespace 中的资源作鉴权。
对 namespace 、集群级资源 和 非资源类的 API(如 /healthz)使用 ClusterRole
ClusterRole: 对象可以授予与 Role 对象相同的权限,但由于它们属于集群范围对象,也可以使用它们授予对以下几种资源的访问权限:
集群范围资源(例如节点,即 node)
非资源类型 endpoint(例如 /healthz)
授权多个 Namespace
#下面例子描述了 default namespace 中的一个 Role 对象的定义,用于授予对 pod 的读访问权限
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default #有"namespace" 区分,指定default的名称空间
name: demo-role
rules:
- apiGroups: [""] # 空字符串""表明使用 core API group
resources: ["pods"]
verbs: ["get", "watch", "list", "create", "delete"]
#创建role实例,在default名称空间
[root@master01 role]# cat pods-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pods-reader
namespace: default
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
[root@master01 role]# kubectl apply -f pods-reader.yaml
[root@master01 role]# kubectl get role|grep pods-reader
pods-reader 2021-12-23T06:16:36Z
################################################################################
# 下面例子中 ClusterRole 定义可用于授予用户对某一个 namespace,或者
所有 namespace的 secret(取决于其绑定方式)的读访问权限
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
# ClusterRole 是集群范围对象,没有 "namespace" 区分
name: demo-clusterrole
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list", "create", "delete"]
#创建clusterrole
[root@master01 role]# cat cluster-pods-reader.yaml
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: csrolereader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
#查看clusterrole
[root@master01 role]# kubectl get clusterrole |grep csrolereader
csrolereader 2021-12-23T07:56:14Z
# ClusterRoleBinding 与 RoleBinding
RoleBinding:
把 Role 中定义的各种权限映射到subjects资源上。
subjects定义:
User,Service Account , Group,三种账号资源
从而让这些用户继承角色在 namespace 中的权限。
ClusterRoleBinding:
把ClusterRole 中定义的各种权限映射到subjects资源上。
subjects定义:
User,Service Account , Group,三种账号资源
让用户继承 ClusterRole 在整个集群中的权限。所以namespace名称空间,
RoleBinding: 可以引用在同一命名空间内定义的Role对象。
#创建一个rolebinding,把subject资源跟role角色绑定,使subject资源需要role角色的权限
[root@master01 role]# cat fengge-pods-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: fengge-pods-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pods-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: fengge
#绑定
[root@master01 role]# kubectl apply -f fengge-pods-reader.yaml
rolebinding.rbac.authorization.k8s.io/fengge-pods-reader created
[root@master01 role]# kubectl get rolebinding|grep fengge-pods-reader
fengge-pods-reader Role/pods-reader 11m
#使用fengge用户,验证结果,这里创建的fengge账号,只是为了测试在普通用户下,并不是k8s里面的账号fengge。
[root@master01 role]# useradd fengge
[root@master01 role]# cp -ra /root/.kube /home/fengge/
[root@master01 role]# chown -R fengge.fengge /home/fengge/
#切换context上下文
[root@master01 ~]# su - fengge
[fengge@master01 ~]$ kubectl config use-context fengge@k8s-fengge
#由于fengge用户绑定的role定义在default名称空间,
[fengge@master01 ~]$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
nginx-sa-68485b4475-dz26t 1/1 Running 0 24h
nginx-sa-68485b4475-l6llv 1/1 Running 0 24h
#除了default名称空间,其他名称空间都无法访问。
[fengge@master01 ~]$ kubectl get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "fengge" cannot list resource "pods" in API group "" in the namespace "kube-system"
#把fengge账号跟clusterrole角色进行绑定,一个账号绑定多个角色,那就以权限最大角色为准。但是最好删除账号之前角色绑定,否则会出现权限混乱。
[root@master01 role]# kubectl describe rolebinding fengge-pods-reader
Name: fengge-pods-reader
Labels: <none>
Annotations: Role:
Kind: Role
Name: pods-reader
Subjects: #fengge账号绑定pods-reader这个role角色
Kind Name Namespace
---- ---- ---------
User fengge
#删除rolebinding
[root@master01 role]# kubectl delete rolebinding fengge-pods-reader
rolebinding.rbac.authorization.k8s.io "fengge-pods-reader" deleted
[root@master01 role]# cat cluster-fengge-pods-reader.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cs-pods-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: csrolereader
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: fengge
#fengge账号绑定clusterrolebinding
[root@master01 role]# kubectl apply -f cluster-fengge-pods-reader.yaml
[root@master01 role]# kubectl get clusterrolebinding|grep cs
cs-pods-reader ClusterRole/csrolereader
#再次切换fengge账号进行验证,
[root@master01 ~]# su - fengge
[fengge@master01 ~]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.4.7.48:6443
name: k8s-fengge
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://10.4.7.48:6443
name: kubernetes
contexts:
- context:
cluster: k8s-fengge
user: fengge
name: fengge@k8s-fengge
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: fengge@k8s-fengge #当前fengge账号,如果context不是fengge,需要切换为fengge用户
kind: Config
preferences: {}
users:
- name: fengge
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
[fengge@master01 ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-sa-68485b4475-dz26t 1/1 Running 0 24h
nginx-sa-68485b4475-l6llv 1/1 Running 0 24h
#之前fengge账号绑定是role角色无法查看kube-system名称空间,但是绑定clusterrole就可以查看所以名称空间clusterrole定义的权限。
[fengge@master01 ~]$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-55b448c5dd-fg6dn 1/1 Running 0 8d
coredns-55b448c5dd-lptwc 1/1 Running 0 8d
etcd-master01 1/1 Running 3 8d
etcd-master02 1/1 Running 1 8d
kube-apiserver-master01 1/1 Running 6 8d
RoleBinding:
对象也可以引用一个 ClusterRole 对象用于在 RoleBinding 所在的命名空间内授予用户对所引
用的ClusterRole 中定义的命名空间资源的访问权限。这一点允许管理员在整个集群范围内首先
定义一组通用的角色,然后再在不同的命名空间中复用这些角色。
例如,尽管下面示例中的 RoleBinding 引用的是一个 ClusterRole 对象,
但是用户”dave”(即角色绑定主体)还是只能读取”development” 命名空间中的 secret(即RoleBinding所在的命名空间)
# 以下角色绑定允许用户"fengge"读取"kube-system"命名空间中的
# 先删除上面的fengge账号的clusterrolebinding。
[root@master01 role]# kubectl delete clusterrolebinding cs-pods-reader
clusterrolebinding.rbac.authorization.k8s.io "cs-pods-reader" deleted
#rolebinding绑定clusterrole,这个时候clusterrole只能访问rolebinding定义的namespace的clusterrole定义的verbs权限。
[root@master01 role]# cat rolebinding-clusterrole.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-kubens
namespace: kube-system # 这里表明仅授权读取"kube-system"命名空间中的资源。
subjects:
- kind: User
name: fengge
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: csrolereader
apiGroup: rbac.authorization.k8s.io
#通过rolebinding绑定clusterrole
[root@master01 role]# kubectl apply -f rolebinding-clusterrole.yaml
rolebinding.rbac.authorization.k8s.io/read-kubens created
#查看rolebinding是否创建成功,由于role角色是基于namespace的,rolebinding定义在kube-system名称空间,
所以rolebinding创建就在kube-system名称空间里
[root@master01 role]# kubectl get rolebinding -n kube-system |grep read-kubens
read-kubens ClusterRole/csrolereader 3m3s
#可以使用 ClusterRoleBinding 在集群级别和所有命名空间中授予权限。
下面示例中所定义的 ClusterRoleBinding 允许在用户组 ”manager” 中的任何用户都可以读取集群中任何命名空间中的 secret 。
3.设置fengge账号为指定名称空间管理员。
#查看k8s集群的clusterrole,下面的admin。cluster-admin等都是最高权限的
[root@master01 role]# kubectl get clusterrole|head
NAME CREATED AT
admin 2021-12-15T04:07:48Z
cluster-admin 2021-12-15T04:07:48Z
csrolereader 2021-12-23T07:56:14Z
edit 2021-12-15T04:07:48Z
flannel 2021-12-15T04:21:05Z
kubeadm:get-nodes 2021-12-15T04:07:51Z
nginx-ingress-clusterrole 2021-12-15T09:56:53Z
system:aggregate-to-admin 2021-12-15T04:07:48Z
system:aggregate-to-edit 2021-12-15T04:07:48Z
#查看clusterrole的admin角色
[root@master01 role]# kubectl get clusterrole admin -o yaml
#删除rolebinding
[root@master01 role]# kubectl delete rolebinding read-kubens -n kube-system
rolebinding.rbac.authorization.k8s.io "read-kubens" deleted
#把fengge这个账号设置为管理员账号,某个namespace名称空间的,由于当前clusterrole角色有admin,cluster-admin,
可以把fengge用户绑定到这两个的任何一个集群角色上,用rolebinding限制到某一个名称空间
#创建rolebinding文件
[root@master01 role]# cat rolebinding-admin-clusterrole.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: default-admin
namespace: default # 这里表明仅授权读取"default"命名空间中的资源。
subjects:
- kind: User
name: fengge
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
#执行
[root@master01 role]# kubectl apply -f rolebinding-admin-clusterrole.yaml
rolebinding.rbac.authorization.k8s.io/default-admin created
#查看,因为rolebinding定义在default名称空间
[root@master01 role]# kubectl get rolebinding -n default|grep default-admin
default-admin ClusterRole/admin 21s
#现在fengge账号具有default名称空间的管理权限,
[fengge@master01 ~]$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
nginx-sa-68485b4475-dz26t 1/1 Running 0 25h
nginx-sa-68485b4475-l6llv 1/1 Running 0 25h
#删除pod
[fengge@master01 ~]$ kubectl delete pod nginx-sa-68485b4475-dz26t
pod "nginx-sa-68485b4475-dz26t" deleted
#查看pod旧的被删除,
[fengge@master01 ~]$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
nginx-sa-68485b4475-bng9w 1/1 Running 0 6s
nginx-sa-68485b4475-l6llv 1/1 Running 0 25h
#查看其他名称空间都是提示无法访问,权限不够
[fengge@master01 ~]$ kubectl get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "fengge" cannot list resource "pods" in API group "" in the namespace "kube-system"
[fengge@master01 ~]$
#serviceaccount用户是在pod容器里,是指定pod具有什么样的权限
查看kube-flannel.yml 文件,里面就定义了serviceaccount,进行集群角色绑定
[root@master01 ~]# cat kube-flannel.yml
。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。
kind: ClusterRole #定义集群角色
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding #集群角色绑定
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount #定义了serviceaccount
metadata:
name: flannel
namespace: kube-system
---
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
#在kube-system名称空间就有flannel这个sa账号
[root@master01 ~]# kubectl get sa -n kube-system|grep flannel
flannel 1 8d
#同时这个文件里daemset也对container指定了serviceaccount的名字flannel
[root@master01 ~]# cat kube-flannel.yml
。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel #下面container指定serviceaccountname
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.11.0-ppc64le
command:
- cp
args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
volumeMounts:
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
containers: #container定义
- name: kube-flannel
image: quay.io/coreos/flannel:v0.11.0-ppc64le
command:
- /opt/bin/flanneld
args:
4.对资源的引用
大多数资源由代表其名字的字符串表示,例如 ”pods”,就像它们出现在相关API endpoint 的URL中一样。
然而,有一些Kubernetes API还 包含了”子资源”,比如 pod 的 logs。在Kubernetes中,pod logs endpoint的URL格式为:
GET /api/v1/namespaces/{namespace}/pods/{name}/log
在这种情况下,”pods”是命名空间资源,而”log”是pods的子资源。为了在RBAC角色中表示出这一点,
我们需要使用斜线来划分资源 与子资源。如果需要角色绑定主体读取pods以及pod log,您需要定义以下角色:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default
name: pod-and-pod-logs-reader
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
通过 resourceNames 列表,角色可以针对不同种类的请求根据资源名引用资源实例。当指定了 resourceNames 列表时,不同动作 种类的请求的权限,如使用 ”get”、”delete”、”update”以及”patch”等动词的请求,将被限定到资源列表中所包含的资源实例上。 例如,如果需要限定一个角色绑定主体只能 ”get” 或者 ”update” 一个 configmap 时,您可以定义以下角色:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default
name: configmap-updater
rules:
- apiGroups: [""]
resources: ["configmap"]
resourceNames: ["my-configmap"]
verbs: ["update", "get"]
值得注意的是,如果设置了 resourceNames,则请求所使用的动词不能是 list、watch、create或者deletecollection。 由于资源名不会出现在 create、list、watch和deletecollection 等API请求的URL中,所以这些请求动词不会被设置了resourceNames 的规则所允许,因为规则中的 resourceNames 部分不会匹配这些请求。 [1]
例子
绑定用户能查看所有 namespace
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
# 鉴于ClusterRole是集群范围对象,所以这里不需要定 义"namespace"字段
name: view-namespace-clusterrole
rules:
- apiGroups:
- ""
resources:
- namespaces
- namespaces/status
verbs:
- get
- list
- watch
定义 develop-role 用户对 default 命名空间详细权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: develop-role
namespace: default
rules:
- apiGroups:
- ""
resources:
- endpoints
- serviceaccounts
- configmaps
- persistentvolumeclaims
- persistentvolumes
- services
- replicationcontrollers
- replicationcontrollers/scale
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- pods
- pods/log
- pods/status
- pods/exec
verbs:
- create
- delete
- deletecollection
- patch
- update
- get
- list
- watch
- apiGroups:
- ""
resources:
- bindings
- events
- limitranges
- namespaces/status
- replicationcontrollers/status
- resourcequotas
- resourcequotas/status
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- daemonsets
- statefulsets
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- deployments
- deployments/scale
- replicasets
- replicasets/scale
verbs:
- get
- list
- watch
- update
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- get
- list
- watch
- apiGroups:
- batch
resources:
- cronjobs
- jobs
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- daemonsets
- statefulsets
- ingresses
- networkpolicies
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- deployments
- deployments/scale
- replicasets
- replicasets/scale
- replicationcontrollers/scale
verbs:
- get
- list
- watch
- update
- apiGroups:
- policy
resources:
- poddisruptionbudgets
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- networkpolicies
verbs:
- get
- list
- watch
默认角色 与 默认角色绑定
API Server 会创建一组默认的 ClusterRole 和 ClusterRoleBinding 对象。 这些默认对象中有许多包含 system: 前缀,
表明这些资源由 Kubernetes基础组件”拥有”。 对这些资源的修改可能导致非功能性集群(non-functional cluster)。
一个例子是 system:node ClusterRole 对象。 这个角色定义了 kubelet 的权限。如果这个角色被修改,
可能会导致kubelet 无法正常工作。
所有默认的 ClusterRole 和 ClusterRoleBinding 对象都会被标记为 kubernetes.io/bootstrapping=rbac-defaults。 [1]
面向用户的角色
通过命令 kubectl get clusterrole 查看到并不是所有都是以 system:前缀,它们是面向用户的角色。
这些角色包含超级用户角色(cluster-admin),即旨在利用 ClusterRoleBinding(cluster-status)
在集群范围内授权的角色, 以及那些使用 RoleBinding(admin、edit和view)在特定命名空间中授权的角色。
cluster-admin:超级用户权限,允许对任何资源执行任何操作。 在 ClusterRoleBinding 中使用时,
可以完全控制集群和所有命名空间中的所有资源。 在 RoleBinding 中使用时,可以完全控制 RoleBinding 所在命名空间中的所有资源,包括命名空间自己。
admin:管理员权限,利用 RoleBinding 在某一命名空间内部授予。 在 RoleBinding 中使用时,允许针对命名空间内大部分资源的读写访问, 包括在命名空间内创建角色与角色绑定的能力。 但不允许对资源配额(resource quota)或者命名空间本身的写访问。
edit:允许对某一个命名空间内大部分对象的读写访问,但不允许查看或者修改角色或者角色绑定。
view:允许对某一个命名空间内大部分对象的只读访问。 不允许查看角色或者角色绑定。 由于可扩散性等原因,不允许查看 secret 资源。
核心组件角色、其它组件角色 和 控制器(Controller)角色 这里不在一一列出。具体见参考链接中[1]。
Permissive RBAC
所谓 Permissive RBAC 是指授权给所有的 Service Accounts 管理员权限。不推荐的配置
$ kubectl create clusterrolebinding permissive-binding \
--clusterrole=cluster-admin \
--user=admin \
--user=kubelet \
--group=system:serviceaccounts
创建用户 shell 脚本
#!/usr/bin/env bash
# 注意修改KUBE_APISERVER为你的API Server的地址
KUBE_APISERVER=$1
USER=$2
USER_SA=system:serviceaccount:default:${USER}
Authorization=$3
USAGE="USAGE: create-user.sh <api_server> <username> <clusterrole authorization>\n
Example: https://192.168.1.2:6443 brand"
CSR=`pwd`/user-csr.json
SSL_PATH="/opt/kubernetes/ssl"
USER_SSL_PATH="/opt/kubernetes/create-user"
SSL_FILES=(ca-key.pem ca.pem ca-config.json)
CERT_FILES=(${USER}.csr $USER-key.pem ${USER}.pem)
if [[ $KUBE_APISERVER == "" ]]; then
echo -e $USAGE
exit 1
fi
if [[ $USER == "" ]];then
echo -e $USAGE
exit 1
fi
if [[ $Authorization == "" ]];then
echo -e $USAGE
exit 1
fi
# 创建用户的csr文件
function createCSR(){
cat>$CSR<<EOF
{
"CN": "USER",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
# 替换csr文件中的用户名
sed -i "s/USER/$USER_SA/g" $CSR
}
function ifExist(){
if [ ! -f "$SSL_PATH/$1" ]; then
echo "$SSL_PATH/$1 not found."
exit 1
fi
}
function ifClusterrole(){
kubectl get clusterrole ${Authorization} &> /dev/null
if (( $? !=0 ));then
echo "${Authorization} clusterrole there is no"
exit 1
fi
}
# 判断clusterrole授权是否存在
ifClusterrole
# 判断证书文件是否存在
for f in ${SSL_FILES[@]};
do
echo "Check if ssl file $f exist..."
ifExist $f
echo "OK"
done
echo "Create CSR file..."
createCSR
echo "$CSR created"
echo "Create user's certificates and keys..."
cd $USER_SSL_PATH
cfssl gencert -ca=${SSL_PATH}/ca.pem -ca-key=${SSL_PATH}/ca-key.pem -config=${SSL_PATH}/ca-config.json -profile=kubernetes $CSR| cfssljson -bare $USER_SA
# 创建 sa
kubectl create sa ${USER} -n default
# 设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=${SSL_PATH}/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${USER}.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials ${USER_SA} \
--client-certificate=${USER_SSL_PATH}/${USER_SA}.pem \
--client-key=${USER_SSL_PATH}/${USER_SA}-key.pem \
--embed-certs=true \
--kubeconfig=${USER}.kubeconfig
# 设置上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=${USER_SA} \
--namespace=development \
--kubeconfig=${USER}.kubeconfig
# 设置默认上下文
kubectl config use-context kubernetes --kubeconfig=${USER}.kubeconfig
# 创建 namespace
# kubectl create ns $USER
# 绑定角色
# kubectl create rolebinding ${USER}-admin-binding --clusterrole=admin --user=$USER --namespace=$USER --serviceaccount=$USER:default
kubectl create clusterrolebinding ${USER}-binding --clusterrole=${Authorization} --user=${USER_SA}
# kubectl config get-contexts
echo "Congratulations!"
echo "Your kubeconfig file is ${USER}.kubeconfig"
更多推荐
所有评论(0)