一、背景
Kubernetes 主要通过 API Server 对外提供服务,对于这样的系统来说,如果不加以安全限制,那么可能导致请求被滥用,甚至导致整个集群崩塌。
Kubernetes 中提供了良好的多租户认证管理机制,RBAC正式其中重要的一个,今天我们来详细聊聊 K8s 中的 RBAC。
二、相关概念
2.1在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限。
- User(用户):每个用户都有唯一的UID识别,并被授予不同的角色
- Role(角色):不同角色具有不同的权限
- Permission(权限):访问权限
- 用户-角色映射:用户和角色之间的映射关系
- 角色-权限映射:角色和权限之间的映射
2.2kubeconfig 介绍
kubeconfig文件保存了k8s集群的集群、用户、命名空间、认证的信息。kubectl命令使用kubeconfig文件来获取集群的信息,然后和API server进行通讯。
注意:用于配置对集群的访问的文件称为kubecconfig文件。也就是说,kubeconfig文件中包含的内容是集群的配置。但是,并不是必须有个文件名字叫kubeconfig
默认情况下,kubectl命令从$HOME/.kube目录下查找一个名字叫做config的文件。可以通过KUBECONFIG环境变量或者--kubeconfig参数来指定其他的kubeconfig文件。
kubeconfig中主要由如下部分组成:clusters(集群)、users(用户)、context(上下文)
2.2.1 kubeconfig支持多集群、多用户、多认证
kubelet使用证书认证(kubelet和api server进行认证)
用户使用token进行认证
管理员为不同的用户提供不同的证书
都可以使用kubeconfig来组织起集群、用户、命名空间的信息。同样,也可以使用context在集群和命名空间之间进行切换。
2.2.2 Context的定义
在kubeconfig中,context中将访问一个集群的参数进行分组。访问这个context名称就是访问这个参数组。context就是一组信息的别名,举例来说,当在高德中使用家的地址,公司的地址就是一个别名,就能迅速的定位到具体的地址信息。
每个context都有3个参数:cluster(集群) 、namespace(命名空间) 、user(用户)
默认情况下,kubectl命令从current context中来获取参数,然后与集群进行通讯
三、实战
3.1创建namespace
kubectl create namespace configns
3.2 使用权限创建服务账户
cat > access.yaml<< EOF
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: confignse-user
namespace: configns
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: configns-user-full-access
namespace: configns
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: configns-user-view
namespace: configns
subjects:
- kind: ServiceAccount
name: configns-user
namespace: configns
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: configns-full-access
EOF
如您所见,在 Role 定义中,我们添加了对该命名空间中所有内容的完全访问权限。 因为它是一个角色,而不是一个 ClusterRole,所以它将被应用于单个命名空间:configns。 有关 Kubernetes 中角色的更多详细信息,请查看官方文档.
kubectl create -f access.yaml
3.3 获取secret
创建sa用户后,系统会为sa创建对应的secret。
我们现在需要做的第一件事是获取服务帐户的秘密名称。运行以下命令并复制密钥的名称。
$ kubectl describe sa configns-user -n configns
Name: configns-user
Namespace: configns
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: configns-user-token-tncrk
Tokens: configns-user-token-tncrk
Events: <none>
$ skubectl get secret -n configns
NAME TYPE DATA AGE
configns-user-token-tncrk kubernetes.io/service-account-token 3 16m
我们现在需要获取服务帐户的令牌和证书颁发机构。为此,我们将使用 kubectl 读取它们。现在,由于 Kubernetes 的秘密是 base64 编码的,我们还需要对它们进行解码。
3.3.1 获取token
kubectl get secret -n configns configns-user-token-tncrk -o "jsonpath={.data.token}" |base64 -d
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1fVDJTS1NhM0V1enlHTGFuN3BfNGZmOVM2bm9RTmdLZjlqWlpnbzA3ZEEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJteW5hbWVzcGFjZSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJteW5hbWVzcGFjZS11c2VyLXRva2VuLXRuY3JrIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Im15bmFtZXNwYWNlLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIzNTcxNDg4YS1mOTc5LTQ1YjMtOTE4ZS1jNjJkYmJhYzlmMjIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6bXluYW1lc3BhY2U6bXluYW1lc3BhY2UtdXNlciJ9.oTghGOFPxyv0cJhQnrD7NdxPsil2JVZedJw5oIlHvlgY7B5ZMYbwhj9qd01GuZ5mjgiqKQJfndsf0fRziUR2TmgM4BQM-4MP8DJKG4eLW9zJx7pvrnFR-Ktf89AK-jHkmKg-yP7WS940NxeYctANh-sR4LJzJ-tRExNSOx54ZLW-dn4TuDo1pXj1DtOrHJsvhrP0CFaQWNTV1gDlucIKGo4dCU0LRiE1P1bgaHI4GBLTP2ez9VYtG24j9LLksvKWgWHu7zOKJlA2g1UDfWDF32343ddwADFe34%
3.3.2 获取ca
kubectl get secrets configns-user-token-tncrk -n mynamespace -o "jsonpath={.data['ca\.crt']}"
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1URXhOREF5TkRnME5sb1hEVE14TVRFeE1qQXlORGcwTmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2dPClpZdUdQWFVTc1ZWejBRSmRlTzNLK2JNQjl1TWNkc2xuTUlYdmI5Rmt3WjNCbjRNTHZaYUFrTC9RT2tNdkhEU1MKOTV4RElPTXRDZmJHWElKbEFJZ3YySUpTRUF6YmNNRE5hb2ZwZmpBVXVzUXd6TUhkdjVoRzRJbkg1UzRGdVFMaAp6Vm5jV1lFTDFORDFFZy9hWnMrTDFJemtGSHc1N1J3Q3hBY3dJcDY4azdLeFUyN24yOHYrVzVCY29HVWR0NGVoCkVaYVFOcGpNamRic3dHa1QwQVlLNFNWc1B2dDY5a2RsYlJld3gzYms5UEpYUFRqeWNkNmFMbUtDQk0yU1M0Q3EKbkJUM2NmS2l6ZGFza3VBTkFmWWQ4S0h4NE9rSXBMSHErM2JSeDltWDZYOUpXS1JIWVppM0VMZTVZa1NRcGQ3ZAo3ZXRKVmpsV0pFa3UwS3E5cW5VQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZMK2Q0NDdvMmpPbXN4dmE5TG5wTHpWVjdoRlFNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFCQlRnT2NPeVduWHJ5RTZ2YS9HNGlTU3c0MGZpNUZ2VnY0N0JMT0FBYUFjeURTNzFraQpnYmVERC9maUVSVkxWbi82Z1ZoektkaDRvMHZwaUxjNEZGejBhV1lhQlN6RVpnS1N5YzV5ejVxSndTNlJ4MjhSCmU5dEpsRUFWM3BYbXNTT3ppY2hRdVdiWkQ1NVFTT3ZXaEsvd3AveGxzR3ZEZSt4S0VMUmJTTGJmNzNCZzZvQ1gKTnZWWi9hSmovbk04WXhJOFZidzd1czZpK1FFMVRCVmpWZU1jSGlpTDByUlpnNkhEejY5THR4Qk1kRW9WQlJmbAp6TXdybE5laDJmbzFjTHpsRU1sVHIzUU93ZC9Rd0IyQ1MwcTZVOGRoZ1pVYkpTVmhWMHBCYVFDRmpLTS9jamFpCm96ajcvc2tUYjVhaDVqQVFqbFZBQi83cjlWVHk1U253sdfwfEWFWVWV#DF#3D2r%
3.4 创建kubeconfig
我们现在拥有所需的一切。剩下的唯一事情就是使用我们之前收集的数据创建 Kube 配置文件:
apiVersion: v1
kind: Config
preferences: {}
# Define the cluster
clusters:
- cluster:
certificate-authority-data: PLACE USER CA HERE
# You'll need the API endpoint of your Cluster here:
server: https://YOUR_KUBERNETES_API_ENDPOINT
name: my-cluster
# Define the user
users:
- name: configns-user
user:
as-user-extra: {}
client-key-data: PLACE USER CA HERE
token: PLACE USER TOKEN HERE
# Define the context: linking a user to a cluster
contexts:
- context:
cluster: my-cluster
namespace: configns
user: configns-user
name: configns
# Define current context
current-context: configns
四、总结
使用 kubeconfig 文件来组织有关集群、用户、命名空间和身份认证机制的信息。理解kubeconfig中各字段的含义,配合脚步可以轻松快速的自服务创建自己所需的配置文件。
参考链接:
标签:k8s,kubeconfig,RBAC,token,集群,user,context,configns From: https://blog.51cto.com/u_11791718/6209524