为 kubectl 配置集群访问权限

本页面介绍如何在 Google Kubernetes Engine 中为 kubectl 命令行工具配置集群访问权限。

概览

如果您在 Google Cloud Platform 项目中运行多个集群,则需要选择与 kubectl 通信的集群。您可以通过在 Kubernetes 的 kubeconfig 文件中设置当前上下文来为 kubectl 设置默认集群。此外,您可以使用 --cluster 标志针对具体集群运行 kubectl 命令。

以下部分说明了 kubeconfig 的工作方式,如何为 kubectl 设置默认集群,以及如何针对具体集群运行各个 kubectl 命令。

准备工作

请执行以下步骤为此任务做准备:

  • 确保您已启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 确保您已安装 Cloud SDK
  • 设置默认项目 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用的是地区级集群,请设置默认计算地区
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用的是区域级集群,请设置默认计算区域
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

Kubernetes 配置文件

Kubernetes 使用名为 kubeconfig 的 YAML 文件存储 kubectl 的集群身份验证信息。kubeconfig 包含 kubectl 在运行命令时引用的上下文列表。默认情况下,该文件保存在 $HOME/.kube/config

上下文是一组访问参数。每个上下文都包含一个 Kubernetes 集群、一个用户和一个命名空间。当前上下文是 kubectl 当前的默认集群:所有 kubectl 命令都针对该集群运行。

使用 gcloud container clusters create 创建集群时,系统会自动将条目添加到环境中的 kubeconfig,并且当前上下文将更改为该集群:

gcloud container clusters create my-cluster
Creating my-cluster...done
Fetching cluster endpoint and auth data.
kubeconfig entry generated for my-cluster

当您使用 Google Cloud Platform Console 或使用 gcloud 通过其他计算机创建集群时,您所在环境的 kubeconfig 不会进行更新。此外,如果项目团队成员使用 gcloud 从他们的计算机上创建集群,他们的 kubeconfig 会进行更新,但您的不会。请按照以下说明将这些集群添加到本地 kubeconfig

关于集群端点

所有集群都有一个规范端点。此端点是 kubectl 和其他服务用来与集群 master 通信的 Kubernetes API 服务器的 IP 地址。该端点显示在 GCP Console 中集群“详细信息”标签的端点字段下,以及 gcloud container clusters describe 命令输出中的 endpoint 字段里。

运行 gcloud container clusters get-credentials 时,您会看到该命令将集群端点作为更新 kubeconfig 的一部分。

专用集群有两个唯一的端点值:privateEndpoint(内部 IP 地址)和 publicEndpoint(外部 IP 地址)。默认情况下,如果针对专用集群运行 get-credentials,系统会将外部 IP 地址设置为端点。如果您希望使用内部 IP 作为端点,请参阅使用专用集群的内部 IP 地址生成 kubeconfig 条目

关于针对 kubectl 的身份验证

通过验证 kubectl 提供的凭据,并检索与用户或服务帐号身份关联的电子邮件地址,所有 GKE 集群都配置为接受 GCP 用户和服务帐号身份。因此,这些帐号的凭据必须包含 userinfo.email OAuth 范围才能成功进行身份验证。

当您使用 gcloud新集群现有集群设置环境的 kubeconfig 时,gcloud 会为 kubectl 提供 gcloud 本身使用的相同凭据。例如,如果您使用 gcloud auth login,那么您的个人凭据(包含 userinfo.email 范围)会提供给 kubectl。这样一来,GKE 集群就能够对 kubectl 客户端进行身份验证。

或者,您可以选择对 kubectl 进行配置,使其在 Compute Engine 实例上运行时使用 GCP 服务帐号的凭据。不过,默认情况下,userinfo.email 范围并不包含在 Compute Engine 实例创建的凭据中。因此,您必须明确添加此范围,例如在创建 Compute Engine 实例时使用 --scopes 标志。

当用户或 GCP 服务帐号经过身份验证后,还必须获得授权才能对 GKE 集群执行任何操作。如需了解如何配置授权,请参阅基于角色的访问权限控制

查看 kubectl 的当前上下文

要查看 kubectl 的当前上下文,请运行以下命令:

kubectl config current-context

查看 kubeconfig

要查看您的环境的 kubeconfig,请运行以下命令:

kubectl config view

该命令返回生成 kubeconfig 条目所针对的所有集群的列表。如果系统列出了某一 GKE 集群,您可以在当前环境中对其运行 kubectl 命令。否则,您需要为该集群生成 kubeconfig 条目

生成 kubeconfig 条目

要对在 GCP Console 中、从其他计算机或由其他项目成员创建的集群运行 kubectl 命令,您需要在自己的环境中生成 kubeconfig 条目。

要生成 kubeconfig 条目,请运行以下命令:

gcloud container clusters get-credentials [CLUSTER_NAME]

其中,[CLUSTER_NAME] 是集群的名称。

kubeconfig 条目包含:

  1. gcloud auth list 中所示的您的凭据,或
  2. 应用的默认凭据(如果已配置)。

使用专用集群的内部 IP 地址生成 kubeconfig 条目

运行 get-credentials 时,您可以指定 --internal-ip,以便将专用集群的内部 IP 地址写入 kubeconfig

gcloud container clusters get-credentials --internal-ip [CLUSTER_NAME]

kubectl 命令设置默认集群

如果您之前为集群生成了 kubeconfig 条目,可以通过运行 gcloud container clusters get-credentialskubectl 的当前上下文更改为该集群。

举例来说,假设一个项目有两个集群 my-clustermy-new-cluster,当前上下文是 my-new-cluster,但是您希望针对 my-cluster 运行所有 kubectl 命令。

要将当前上下文切换为 my-cluster,您需要运行以下命令:

gcloud container clusters get-credentials my-cluster

针对特定集群运行单个 kubectl 命令

您可以针对特定集群运行单个 kubectl 命令,只需将 kubeconfig显示的该集群名称作为 --cluster 标志的参数传入即可。

举例来说,假设一个环境中有两个集群 my-clustermy-new-cluster,当前上下文为 my-cluster。您希望将某个应用部署到 my-new-cluster,但您不希望更改当前上下文

要将应用部署到 my-new-cluster,您需要运行以下命令:

kubectl run my-app --image gcr.io/my-bucket/my-app:1.0 --cluster my-new-cluster

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 文档