Kubernetes只读上下文

Kubernetes只读上下文,kubernetes,google-kubernetes-engine,kubectl,Kubernetes,Google Kubernetes Engine,Kubectl,我拥有对GKE集群的完全管理权限,但我希望能够使用只读权限创建kubernetes上下文。这样我就可以防止自己不小心弄乱集群。但是,当我需要进行更改时,我仍然希望能够临时切换到具有完全管理权限的模式(我可能会使用cloud shell来完全区分这两者) 我没有太多关于这方面的文档-似乎我可以根据我的电子邮件设置角色,但不能为一个用户设置两个角色 有没有办法做到这一点?或者有没有其他方法来防止胖手指删除产品 使用GKE有几种方法可以做到这一点。KUBECONFIG中的上下文由集群和用户组成。由于您

我拥有对GKE集群的完全管理权限,但我希望能够使用只读权限创建kubernetes上下文。这样我就可以防止自己不小心弄乱集群。但是,当我需要进行更改时,我仍然希望能够临时切换到具有完全管理权限的模式(我可能会使用cloud shell来完全区分这两者)

我没有太多关于这方面的文档-似乎我可以根据我的电子邮件设置角色,但不能为一个用户设置两个角色


有没有办法做到这一点?或者有没有其他方法来防止胖手指删除产品

使用GKE有几种方法可以做到这一点。KUBECONFIG中的
上下文
集群
用户
组成。由于您希望指向相同的
集群
,因此需要更改的是
用户
。用户可以对各种资源执行哪些操作的权限可以通过两种方式进行控制,即通过或通过。前者适用于项目范围,因此,除非您希望创建一个对项目中的所有集群(而不是特定集群)具有只读访问权限的主题,否则最好使用范围更窄的Kubernetes RBAC

以下类型的主体可以通过GKE集群进行身份验证,并对其应用Kubernetes RBAC策略(请参阅):

  • 已注册(人类)GCP用户
  • Kubernetes服务帐户
  • GCloud IAM服务帐户
  • 谷歌集团G套件的成员
  • 由于您不打算注册另一个人来完成此只读访问模式,而且G套件Google组可能过于苛刻,因此您可以选择Kubernetes服务帐户或GCloud IAM服务帐户。对于这个答案,我们将采用后者

    以下是步骤:

  • 在与Kubernetes群集相同的项目中创建GCloud IAM服务帐户
  • 创建本地
    gcloud
    配置,以避免干扰默认配置。正如您希望创建一个新的KUBECONFIG
    上下文
    而不是修改当前
    上下文
    用户
    ,这做了相同的事情,但对
    gcloud
    本身,而不是
    kubectl
    。运行命令
    gcloud config configurations create
  • 将此配置与您的GCloud IAM服务帐户关联:
    GCloud auth activate服务帐户--密钥文件=
  • 上下文
    用户
    添加到您的KUBECONFIG文件中,以便您可以作为此GCloud IAM服务帐户向GKE群集进行身份验证,如下所示:

    contexts:
    - ...
    - ...
    - name: <cluster-name>-read-only
      context:
        cluster: <cluster-name>
        user: <service-account-name>
    users:
    - ...
    - ...
    - name: <service-account-name>
      user:
        auth-provider:
          name: gcp
          config:
            cmd-args: config config-helper --format=json --configuration=<configuration-name>
            cmd-path: </path/to/gcloud/cli>
            expiry-key: '{.credential.token_expiry}'
            token-key: '{.credential.access_token}'
    
  • 试一试:

    $ kubectl use-context <cluster-name>-read-only
    $ kubectl get all --all-namespaces
    # see all the pods and stuff
    $ kubectl create namespace foo
    Error from server (Forbidden): namespaces is forbidden: User "<service-account-email>" cannot create resource "namespaces" in API group "" at the cluster scope: Required "container.namespaces.create" permission.
    
    $ kubectl use-context <original-namespace>
    $ kubectl get all --all-namespaces
    # see all the pods and stuff
    $ kubectl create namespace foo
    namespace/foo created
    
    $kubectl使用上下文-只读
    $kubectl获取全部--所有名称空间
    #看到所有的豆荚和东西了吗
    $kubectl创建命名空间foo
    来自服务器的错误(禁止):名称空间被禁止:用户“”无法在群集作用域中的API组“”中创建资源“名称空间”:必需的“container.namespaces.create”权限。
    $kubectl使用上下文
    $kubectl获取全部--所有名称空间
    #看到所有的豆荚和东西了吗
    $kubectl创建命名空间foo
    创建名称空间/foo
    
    $ kubectl use-context <cluster-name>-read-only
    $ kubectl get all --all-namespaces
    # see all the pods and stuff
    $ kubectl create namespace foo
    Error from server (Forbidden): namespaces is forbidden: User "<service-account-email>" cannot create resource "namespaces" in API group "" at the cluster scope: Required "container.namespaces.create" permission.
    
    $ kubectl use-context <original-namespace>
    $ kubectl get all --all-namespaces
    # see all the pods and stuff
    $ kubectl create namespace foo
    namespace/foo created