Kubernetes身份验证机制演示

栏目: 服务器 · 发布时间: 5年前

内容简介:Kubernetes有许多身份验证机制来验证谁实际访问群集资源。完整列表检查让我们显示文件及其结构(密码,用户名,userId):

Kubernetes有许多身份验证机制来验证谁实际访问群集资源。完整列表检查 身份验证策略列表 。在这个演示中,让我们测试最简单的 静态密码文件

演示先决条件

  • Minikube kubernetes集群
  • 静态密码文件名为users.csv

让我们显示文件及其结构(密码,用户名,userId):

$ pwd /Users/tomask79/workspace
$ cat users.csv tomask123,tomask79,100

使用基本身份验证启动Minikube群集

第一步是将位于当前目录中的密码文件users.csv挂载到Minikube中。 让我们使用/ var / lib / localkube / certs /目录来获取minikube vm和apiserver容器之间共享的内容。

$ minikube mount $(pwd)/:/<b>var</b>/lib/localkube/certs/mini
Mounting /Users/tomask79/workspace/ into /<b>var</b>/lib/localkube/certs/mini on the minikube VM
This daemon process needs to stay alive <b>for</b> the mount to still be accessible...

让进程按照建议运行并打开另一个终端,使用该文件作为静态密码资源启动minikube,这样实现基本身份验证。

$ minikube start --extra-config=apiserver.basic-auth-file=/<b>var</b>/lib/localkube/certs/mini/users.csv --kubernetes-version=v1.10.0
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

好的Minikube正在运行。当然,我们应该验证基本属性。

$ minikube ip
192.168.99.100
$ minikube version
minikube version: v0.28.2
$ kubectl cluster-info
Kubernetes master is running at https:<font><i>//192.168.99.100:8443</i></font><font>
KubeDNS is running at https:</font><font><i>//192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy</i></font><font>
</font>

通过基本身份验证与Kubernetes API交互

为了与 Kubernetes API服务器 交互,您基本上有两个选择:

  • 通过REST API直接调用
  • 使用最终调用REST API的Kubectl。

首先让我们尝试第一个选项,让pod在默认命名空间中运行。要通过针对API服务器的基本身份验证进行身份验证,文档说:

从http客户端使用基本身份验证时,API服务器需要
一个值为Basic BASE64ENCODED(USER:PASSWORD)的Authorization     标头。

首先让我们创建不正确凭据的Base64字符串(我们只配置了用户tomask79):

$ echo -n baduser:badpassword | base64
YmFkdXNlcjpiYWRwYXNzd29yZA==

现在使用此Base64字符串来获取在默认命名空间内运行的pod:

$ curl -H <font>"Authorization: Basic YmFkdXNlcjpiYWRwYXNzd29yZA=="</font><font> https:</font><font><i>//192.168.99.100:8443/api/v1/namespaces/default/pods -k</i></font><font>
{
  </font><font>"kind"</font><font>: </font><font>"Status"</font><font>,
  </font><font>"apiVersion"</font><font>: </font><font>"v1"</font><font>,
  </font><font>"metadata"</font><font>: {

  },
  </font><font>"status"</font><font>: </font><font>"Failure"</font><font>,
  </font><font>"message"</font><font>: </font><font>"Unauthorized"</font><font>,
  </font><font>"reason"</font><font>: </font><font>"Unauthorized"</font><font>,
  </font><font>"code"</font><font>: 401
}
</font>

我们得到了我们的期望结果。在下一步中,让我们准备正确凭据的Base64字符串:

$ cat users.csv tomask123,tomask79,100
$ echo -n tomask79:tomask123 | base64 dG9tYXNrNzk6dG9tYXNrMTIz

并再次在默认命名空间内运行pods:

$ curl -H <font>"Authorization: Basic dG9tYXNrNzk6dG9tYXNrMTIz"</font><font> https:</font><font><i>//192.168.99.100:8443/api/v1/namespaces/default/pods -k</i></font><font>
{
  </font><font>"kind"</font><font>: </font><font>"Status"</font><font>,
  </font><font>"apiVersion"</font><font>: </font><font>"v1"</font><font>,
  </font><font>"metadata"</font><font>: {

  },
  </font><font>"status"</font><font>: </font><font>"Failure"</font><font>,
  </font><font>"message"</font><font>: </font><font>"pods is forbidden: User \"tomask79\" cannot list pods in the namespace \"default\""</font><font>,
  </font><font>"reason"</font><font>: </font><font>"Forbidden"</font><font>,
  </font><font>"details"</font><font>: {
    </font><font>"kind"</font><font>: </font><font>"pods"</font><font>
  },
  </font><font>"code"</font><font>: 403
}
</font>

嗯,tomask79用户没有权限查看默认命名空间内的pod。那讲得通。 要解决这个问题,我们需要 RoleBinding ,它是单个命名空间和clusteroles之一。 clusterRoles 集群角色有四种默认类型:

  • cluster-admin
  • admin
  • edit
  • view

我们希望用户tomask79只能查看pod,所以让我们给他一个view集群角色:

$ kubectl create rolebinding tomask79-view-binding-<b>default</b> --clusterrole=view --user=tomask79 --namespace=<b>default</b>
rolebinding.rbac.authorization.k8s.io/tomask79-view-binding-<b>default</b> created

并且这次再次从默认命名空间运行pods:

$ curl -H <font>"Authorization: Basic dG9tYXNrNzk6dG9tYXNrMTIz"</font><font> https:</font><font><i>//192.168.99.100:8443/api/v1/namespaces/default/pods -k</i></font><font>
{
  </font><font>"kind"</font><font>: </font><font>"PodList"</font><font>,
  </font><font>"apiVersion"</font><font>: </font><font>"v1"</font><font>,
  </font><font>"metadata"</font><font>: {
    </font><font>"selfLink"</font><font>: </font><font>"/api/v1/namespaces/default/pods"</font><font>,
    </font><font>"resourceVersion"</font><font>: </font><font>"1054"</font><font>
  },
  </font><font>"items"</font><font>: []
}
</font>

API服务器返回了pod!

Kubectl和具有不同用户的多个上下文

大多数情况下,您希望使用 Kubectl 与API Server进行 迭代 。通过Kubectl的配置允许您通过切换上下文来 访问多个集群 。让我们使用这个想法并使用相同的集群创建新的kubectl上下文,但是使用新注册的tomask79用户

首先让我们将新用户添加到当前的kubectl配置中:

$ kubectl config set-credentials tomask79 --username=tomask79 --password=tomask123
User <font>"tomask79"</font><font> set.
</font>

很好,让我们检查一下用户添加的配置:

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/tomask79/.minikube/ca.crt
    server: https:<font><i>//192.168.99.100:8443</i></font><font>
  name: minikube
contexts:
- context:
    cluster: minikube
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /Users/tomask79/.minikube/client.crt
    client-key: /Users/tomask79/.minikube/client.key
- name: tomask79
  user:
    password: tomask123
    username: tomask79
</font>

我们希望能够在访问相同的minikube集群时在用户之间切换,所以让我们添加一个上下文指向minikube集群,但需要通过tomask79用户访问:

$ kubectl config set-context tomask79-context --cluster=minikube --user=tomask79
Context <font>"tomask79-context"</font><font> created.
</font>

好的,让我们切换到新的上下文:

$ kubectl config use-context tomask79-context
Switched to context <font>"tomask79-context"</font><font>.
</font>

并显示最终配置:

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/tomask79/.minikube/ca.crt
    server: https:<font><i>//192.168.99.100:8443</i></font><font>
  name: minikube
 contexts:
 - context:
    cluster: minikube
    user: minikube
 name: minikube
 - context:
   cluster: minikube
   user: tomask79
 name: tomask79-context
current-context: tomask79-context
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /Users/tomask79/.minikube/client.crt
    client-key: /Users/tomask79/.minikube/client.key
- name: tomask79
  user:
    password: tomask123
    username: tomask79
</font>

现在来自kubectl运行的所有内容都将作为“tomask79”用户身份!

$ kubectl get pods
No resources found.

这些是我们已经授予tomask79用户的默认命名空间中的pod。 现在让我们试试kube-public命名空间:

$ kubectl get -n kube-<b>public</b> pods
No resources found.
Error from server (Forbidden): pods is forbidden: User <font>"tomask79"</font><font> cannot list pods in the namespace </font><font>"kube-public"</font><font>
</font>

Kube-public命名空间仍然禁止tomask79用户。如果我们尝试在他的帐户下创建RoleBinding,该怎么办?)

$ kubectl create rolebinding tomask79-view-binding-<b>public</b> --clusterrole=view --user=tomask79 --namespace=kube-<b>public</b>
Error from server (Forbidden): rolebindings.rbac.authorization.k8s.io is forbidden: User <font>"tomask79"</font><font> cannot create rolebindings.rbac.authorization.k8s.io in the namespace </font><font>"kube-public"</font><font>
</font>

说得通。因此,让我们切换到默认上下文,允许tomask79用户访问kube-public命名空间 并切换回tomask79上下文来测试它。

$ kubectl config use-context minikube
Switched to context <font>"minikube"</font><font>.
$ kubectl create rolebinding tomask79-view-binding-<b>public</b> --clusterrole=view --user=tomask79 --namespace=kube-<b>public</b>
rolebinding.rbac.authorization.k8s.io/tomask79-view-binding-<b>public</b> created
$ kubectl config use-context tomask79-context
Switched to context </font><font>"tomask79-context"</font><font>.
$ kubectl get -n kube-<b>public</b> pods
No resources found.
</font>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网站项目管理

网站项目管理

[美] 阿什利·弗里德莱因 / 李保庆、杨磊、王增东 / 电子工业出版社 / 2002-11 / 32.00元

这本书全方位地介绍了如何建立和最终交付一个具有很高商业价值的成功网站,讲解从项目管理的角度入手,撇开烦琐的技术细节,更加关注Web项目实施中诸如成本、进度、工作范围等问题,涉及了一个商业网站在实施过程中可能遇到的所有管理细节。书内附国际一流网站开发专家的深邃见解;涵盖了网络项目管理的关键原则及案例研究;通过友情链接,还为读者提供了模板、论坛、术语表、相关链接以及有关因特网知识的测验题。一起来看看 《网站项目管理》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码