[Kubernetes] 如何创建用于连接集群的用户

* Kirimen(大阪府十三市)

大家好!
我是来自Beyond Inc.大阪办公室的拉面大王Hide。
这是我的第14篇帖子。

上次我写了一篇关于如何使用 Cloudflare Workers 设置基本身份验证的文章!
设置过程相对简单,但如果设置出错,您可能根本无法访问网站。
为了避免出错,我介绍了一种简单易懂的设置方法,如果您感兴趣,请查看一下。

如何将基本身份验证与 Cloudflare Workers 结合使用

概述

我想创建一个单独的用户来连接到 Kubernetes 集群,但我不知道该怎么做
我还想调整该用户的权限,但我真的不知道该怎么做。
哦?我卡住了吗?

 

你有没有想过类似的事情?
我也知道可以创建一个单独的用户来连接集群,但越研究越觉得难……
经过多次尝试,我终于成功了,所以如果你也想创建一个,可以参考我的方法!
试试看吧!

防范措施

本指南并未解释 Kubernetes 的基本概念或资源。
此外,对于各个云平台(例如 EKS 或 GKE)上的托管 Kubernetes 集群,添加用户的方法可能有所不同。如果
您在云平台上运行 Kubernetes,请参阅相应的文档。

程序

1. 创建并编码密钥

1-1. 创建私钥和公钥

*请在{username}中输入您的用户名

cd .kube/ openssl genrsa -out {UserName}.key 2048 openssl req -new -key {UserName}.key -out {UserName}.csr -subj "/CN={UserName}"

例如:如果用户名是 example-test

openssl genrsa -out example-test.key 2048 openssl req -new -key example-test.key -out example-test.csr -subj "/CN=example-test"

1-2.使用 base64 编码

cat {UserName}.csr | base64 | tr -d "\n"

编码后的值将被输出,请记下来。

例子:

[example-test@bastion01 ~]$ cat example-test.csr | base64 | tr -d "\n" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2. 应用创建的 CSR 并进行设置

2-1.创建 YAML 文件

{
UserName 中输入用户名* 在 { EncodeValue } 中输入编码后的值

vi {UserName}-csr.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: {UserName} spec: request: {EncodeValue} signerName: kubernetes.io/kube-apiserver-client usages: - client auth

例子:

vi example-test-csr.yaml apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: example-test spec: request: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx signerName: kubernetes.io/kube-apiserver-client usages: - client auth

2-2.应用yaml文件

kubectl apply -f {UserName}-csr.yaml

例子:

[example-test@bastion01 ~]$ kubectl apply -f example-test-csr.yaml certificatesigningrequest.certificates.k8s.io/example-test created

2-3. 检查是否已应用

*状态为“待处理”,因为该客户服务请求尚未获得批准。
*请注意“名称”栏中输出的值。

kubectl 获取 csr

例子:

[example-test@bastion01 ~]$ kubectl get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION example-test 12s kubernetes.io/kube-apiserver-client xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 〈none〉 Pending

2-4.批准企业社会责任

* 输入您之前在 {CsrName} 中记下的 NAME 值

kubectl 证书批准 {CsrName}

例子:

[example-test@bastion01 ~]$ kubectl certificate approve example-test certificatesigningrequest.certificates.k8s.io/example-test approved

2-5. 检查企业社会责任审批

*如果“条件”列显示“已批准”,则表示已批准。

kubectl 获取 csr

例子:

[example-test@bastion01 ~]$ kubectl get csr NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION example-test 14m kubernetes.io/kube-apiserver-client xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 〈none〉 Approved,Issued

2-6.创建crt文件

* 输入您之前在 {CsrName} 中记下的 NAME 值

kubectl get csr {CrtName} -o jsonpath='{.status.certificate}' | base64 -d > {CrtName}.crt

3. 添加用户和上下文

3-1. 添加用户和证书信息

*请在{UserName}中输入您的用户名

kubectl config set-credentials {UserName} --client-key={UserName}.key --client-certificate={UserName}.crt --embed-certs=true

例子:

[example-test@bastion01 ~]$ kubectl config set-credentials example-test --client-key=example-test.key --client-certificate=example-test.crt --embed-certs=true User "example-test"

*设置将自动添加到 .kube/config 文件中,如下所示。

cat ~/.kube/config
- 名称:example-test 用户:客户端证书数据:xxxxxxxxxxxxxxxxxxxxx 客户端密钥数据:xxxxxxxxxxxxxxxxxxxxxxxx

3-2. 记下集群名称

cat ~/.kube/config

例如:
*name 是集群名称

apiVersion: v1 clusters: - cluster: certificate-authority-data: xxxxxxxxxxxxxxxxxxxxxxx server: https://xxxxxxxxxxxxxxxxxxxxxxx name: xxxxxxxxxxxxxxx

3-3.添加到上下文

*请在{UserName}中输入您的用户名
*请在{ClusterName}中输入您之前记下的值

kubectl config set-context {UserName} --cluster={ClusterName} --user={UserName}

例子:

[example-test@example-testbastion01 ~]$ kubectl config set-context example-test --cluster=xxxxxxxxxxxx --user=example-test 已创建上下文“example-test”。.

*设置将自动添加到 .kube/config 文件中,如下所示。

contexts: - context: cluster: xxxxxxxxxxx user: xxxxxxxxxxxxxx name: xxxxxxxxxxxxxxx - context: cluster: xxxxxxxxxxxxxx user: example-test name: example-test

 

4. 授予权限

创建新的集群角色并授予其所有权限

1. 创建集群角色。
*在 {ClusterRoleName} 中输入集群角色名称。
*参考下表设置 {VerbName} 和 {ResourceName}。

kubectl create clusterrole {ClusterRoleName} --verb={VerbName} --resource={ResourceName}

主要资源名称和动词名称列表

资源名称 命名空间 节点 豆荚 服务 Ingress 秘密 配置映射
动词名称 评论
得到 获取资源
列表 列出资源
创造 创建资源
更新 更新资源
修补 部分更新资源
删除 删除资源
删除集合 批量删除资源
手表 监控资源变化

 

示例:Pod 的只读权限。

[example-test@bastion01 ~]$ kubectl create clusterrole pod-readonly --verb=get,list,watch --resource=pods clusterrole.rbac.authorization.k8s.io/pod-readonly 已创建

2. 检查已创建的集群角色。
*请在{ClusterRoleName}中输入集群角色名称。

kubectl describe clusterrole {ClusterRoleName}

例子:

[example-test@bastion01 ~]$ kubectl describe clusterrole pod-readonly 名称:pod-readonly 标签:<none>注释:<none> PolicyRule: 资源 非资源 URL 资源名称 动词 --------- ----------------- -------------- ----- pods [] [] [get list watch]

3. 将创建的集群角色的权限授予用户
。*在 {ClusterRoleName} 中输入集群角色绑定名称
*在 {UserName} 中输入用户名

kubectl create clusterrolebinding {ClusterRoleBindingName} --clusterrole={ClusterRoleName} --user={UserName}

例子:

[example-test@bastion01 ~]$ kubectl create clusterrolebinding pod-readonly-binding --clusterrole=pod-readonly --user=example-test clusterrolebinding.rbac.authorization.k8s.io/pod-readonly-binding created

4. 确认权限已授予
。如果用户中指定的用户名在“主题”中,则没有问题。

kubectl describe clusterrolebinding {ClusterRoleBindingName}

例子:

[example-test@bastion01 ~]$ kubectl describe clusterrolebinding pod-readonly-binding 名称:pod-readonly-binding 标签:<none>注释:<none>角色:类型:集群角色 名称:pod-readonly-binding 主题:类型 名称 命名空间 ---- ---- -------- 用户 example-test

要分配预定义的集群角色:

1. 授予用户预定义集群角色的权限。
* {ClusterRoleName} 是集群角色绑定名称。
* {ClusterRoleName} 是集群角色名称。
* {UserName} 是用户名。

kubectl create clusterrolebinding {ClusterRoleBindingName} --clusterrole={ClusterRoleName} --user={UserName}

例子:

[example-test@bastion01 ~]$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=example-test clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-binding created

*预定义集群角色列表

默认集群角色 默认集群角色绑定 解释
集群管理员 系统:主组 允许超级用户对任何资源执行任何操作。在集群角色绑定中使用时,它将授予对集群中所有资源以及所有命名空间的完全控制权限。在角色绑定中使用时,它将授予对角色绑定命名空间中的所有资源(包括命名空间本身)的完全控制权限。
行政 没有任何 此角色允许管理访问权限,旨在通过角色绑定在命名空间内授予。在角色绑定中使用时,此角色允许对命名空间中的大多数资源进行读/写访问,包括在命名空间内创建角色和角色绑定。此角色不允许对资源配额或命名空间本身进行写入访问。
编辑 没有任何 此角色授予对命名空间中大多数对象的读/写权限。此角色不授予查看或修改角色或角色绑定的权限。但是,此角色授予对密钥的访问权限,并允许 Pod 以命名空间中任何服务帐户的身份运行,并且可用于获取命名空间中任何服务帐户的 API 访问级别。
看法 没有任何 此角色授予对命名空间中大多数对象的只读访问权限,但无法查看角色或角色绑定。此角色不允许查看密钥,因为读取密钥内容将使用户能够访问命名空间中任何服务帐户的凭据。此角色授予用户以命名空间中任何服务帐户的身份访问 API 的权限(一种权限提升形式)。
・参考资料
使用基于角色的访问控制 (RBAC) 授权
https://kubernetes.io/ja/docs/reference/access-authn-authz/rbac/

 

2. 检查权限是否已授予。
*如果用户中指定的用户名在“主题”列表中,则没有问题。

kubectl describe clusterrolebinding {ClusterRoleBindingName}

例子:

[example-test@bastion01 ~]$ kubectl describe clusterrolebinding cluster-admin-binding 名称:cluster-admin-binding 标签:<none>注释:<none>角色:类型:集群角色 名称:集群管理员 主题:类型 名称 命名空间 ---- ---- --------- 用户 example-test

5. 运行检查

5-1. 改变语境

*请在{UserName}中输入您的用户名
*您使用的用户将在此处切换

kubectl config use-context {UserName}

例子:

[example-test@bastion01 ~]$ kubectl config use-context example-test 切换到上下文“example-test”。.

5-2. 检查上下文(当前用户)

kubectl config current-context

例子:

[example-test@bastion01 ~]$ kubectl config current-context example-test

5-3. 使用 kubectl 执行命令

*如果您已授予 Pod 只读权限,则将显示如下:

[example-test@bastion01 ~]$ kubectl get po NAME READY STATUS RESTARTS AGE xxxx-f5p2t 1/1 Ready 0 261d
 
[example-test@bastion01 ~]$ kubectl get node 来自服务器的错误(禁止访问):nodes 被禁止访问:用户“example-test”无法在集群范围内列出 API 组“”中的资源“nodes”。
 

概括

您觉得如何?
通过在 Kubernetes 中创建用户来连接集群,您可以自由地管理用户权限。
重复使用具有集群管理员权限的用户可能会导致操作过程中出现意外情况,因此,
如果多人操作系统,我们建议创建尽可能类似于 Linux 用户的用户!
请以此为参考来操作 Kubernetes!

如果您觉得这篇文章有用,请点击【点赞】!
5
加载中...
5票,平均分:1.00/15
1,290
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

隐藏@基础设施工程师

一切都始于一次非常有趣的面试。
我职业生涯中期加入了大阪的系统解决方案部门,
目前负责服务器和云的构建与运维!
我持有LPIC1、AWS SAA和OCI架构师助理认证。

事实上,我超爱拉面,
在大阪已经探访过100多家拉面店了(。-∀-)我正在努力成为Nibi Beyond

我也有推特账号,请关注我哦 (´∇`)
点击右上角的推特图标!!