kubectl 操作 Kubernetes 的权限控制

栏目: 编程工具 · 发布时间: 6年前

内容简介:Kubernetes 集群的安全性的重要程度不用强调,当我们与集群交互时,不管是通过Kubernetes 集群的访问权限控制由 kube-apiserver 负责,kube-apiserver 的访问权限控制由身份验证(authentication)、授权(authorization)和准入控制(admission control)三步骤组成,这三步骤是按序进行的。

Kubernetes 集群的安全性的重要程度不用强调,当我们与集群交互时,不管是通过 kubernetes-dashborad 还是通过命令行工具 kubectl 都需要进行身份验证和鉴权。那么我们是怎么利用 k8s 本身提供的能力来做身份验证和鉴权的呢?

Kubernetes 集群的访问权限控制由 kube-apiserver 负责,kube-apiserver 的访问权限控制由身份验证(authentication)、授权(authorization)和准入控制(admission control)三步骤组成,这三步骤是按序进行的。

  • authentication

    k8s 支持 tls client certificate、basic auth、token 等方式对客户端发起的请求进行身份校验。APIServer 启动时,可以指定一种 Authentication 方法,也可以指定多种方法。如果指定了多种方法,那么 APIServer 将会逐个使用这些方法对客户端请求进行验证,只要请求数据通过其中一种方法的验证,APIServer 就会认为 Authentication 成功。

  • authorization

    APIServer 支持多种 authorization mode,包括 Node、RBAC、Webhook 等。APIServer 启动时,可以指定一种 authorization mode,也可以指定多种 authorization mode,如果是后者,只要 Request 通过了其中一种 mode 的授权,那么该环节的最终结果就是授权成功。authorization-mode 的默认配置是 ”Node,RBAC”。Node 授权器主要用于各个 node 上的 kubelet 访问 apiserver 时使用的,其他一般均由 RBAC 授权器来授权。

    这里我们着重介绍一下 RBAC

kubectl 操作 Kubernetes 的权限控制

RBAC(Role-Based Access Control),它使用 “rbac.authorization.k8s.io” 实现授权决策,允许管理员通过 Kubernetes API 动态配置策略。在 RBAC API 中,一个角色(Role)包含了一组权限规则。

Role有两种: RoleClusterRole 。一个Role对象只能用于授予对某一单一命名空间(namespace)中资源的访问权限。ClusterRole对象可以授予与Role对象相同的权限,但由于它们属于集群范围对象。

RoleBinding: 角色绑定则是定义了将一个角色的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体(即 subject, 包括用户——User、用户组——Group、或者服务账户——Service Account)以及对被授予角色的引用。 在命名空间中可以通过 RoleBinding 对象进行用户授权,而集群范围的用户授权则可以通过 ClusterRoleBinding 对象完成。

在上面的基础上我们来创建具有特定权限的用户

我们创建一个用户 release 从名字可以看出他是干什么的,我们赋予这个用户可以在集群中发布服务的权限。

创建具有对应权限的用户

  • 创建 cluster role

    示例如下

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    name: cluster-release
    rules:
    - apiGroups: ["", "extensions", "apps", "batch"]
    resources: ["*"]
    verbs: ["update", "get", "watch", "list", "create", "patch"]
  • 绑定用户,创建 ClusterRoleBinding

    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRoleBinding
    metadata:
    name: cluster-release
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-release
    subjects:
    - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: release

创建 kubeconfig

kubeconfig其实就是集群的身份认证和鉴权的配置文件,它包含了集群信息,客户信息,上下文(context)等。并且根据不同的 context 可以实现多集群的访问。

这里我们用 tls client certificate 来作为身份验证的安全凭证,之前也说过也可以用 token 的方式。

1. 创建用户安全凭证(CA 证书)

  • 给用户创建 private key(比如给用户release)

    openssl genrsa -out release.key 2048

    说明

在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单位信息,需要提交给CA认证中心。在生成CSR文件时会同时生成私钥文件,请妥善保管和备份您的私钥。

生成CSR文件时,一般需要输入以下信息(中文需要UTF8编码):

Organization Name(O):申请单位名称法定名称,可以是中文或英文
Organization Unit(OU):申请单位的所在部门,可以是中文或英文
Country Code(C):申请单位所属国家,只能是两个字母的国家码,如中国只能是:CN
State or Province(S):申请单位所在省名或州名,可以是中文或英文
Locality(L):申请单位所在城市名,可以是中文或英文
Common Name(CN):申请SSL证书的具体网站域名
  • 创建证书签名请求(csr) CN(这里是用户名) O(这里是组)要显示指明
    openssl req -new -key release.key -out release.csr -subj "/CN=release/O=k8s"
  • 给用户release签发证书

    openssl x509 -req -in release.csr -CA /etc/kubernetes/ssl/ca.pem -CAkey /etc/kubernetes/ssl/ca-key.pem -CAcreateserial -out release.crt -days 365

    至此我们应该生成了证书 release.crt 和 release.key。

2. 生成 kubeconfig 文件

  • 先要指明 api-server 的地址
    export KUBE_APISERVER=https://172.31.xx.xx:6443
  • 设置k8s 集群信息
    sudo kubectl config set-cluster cluster.local --certificate-authority=/etc/kubernetes/ssl/ca.pem --embed-certs=true --server=${KUBE_APISERVER} --kubeconfig=release.kubeconfig
  • 设置用户安全凭证
    sudo kubectl config set-credentials release --client-certificate=release.crt --client-key=release.key --embed-certs=true --kubeconfig=release.kubeconfig
  • 设置 context 参数
    sudo kubectl config set-context release-context --cluster=cluster.local --user=release --kubeconfig=release.kubeconfig
  • 设置默认 context
    sudo kubectl config use-context release-context --kubeconfig=release.kubeconfig

至此生成好了 kubeconfig 文件。

kubectl config view 可以查看生成好的内容。

使用 kubeconfig

我们可以用生成好的 kubeconfig 文件来赋予 kubectl 操作集群的能力

示例如下

FROM ubuntu:16.04

COPYkubectl /usr/local/bin/
RUNchmod +x /usr/local/bin/kubectl
RUNmkdir /root/.kube
COPYconfig /root/.kube/

下面这张图总结了我们的工作

kubectl 操作 Kubernetes 的权限控制

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

ActionScript 3.0 Cookbook

ActionScript 3.0 Cookbook

Joey Lott、Darron Schall、Keith Peters / Adobe Dev Library / 2006-10-11 / GBP 28.50

Well before Ajax and Microsoft's Windows Presentation Foundation hit the scene, Macromedia offered the first method for building web pages with the responsiveness and functionality of desktop programs......一起来看看 《ActionScript 3.0 Cookbook》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具