Microsoft Azure Kubernetes 服务 (AKS) 上的 Kubernetes#

你可以通过 Azure 门户网站或使用 Azure 命令行工具来创建 Kubernetes 集群。

本页介绍了使用命令行设置 Kubernetes 集群所需的命令。如果你更喜欢使用 Azure 门户,请参阅 Azure Kubernetes 服务快速入门

  1. 准备你的 Azure Shell 环境。你有两个选择,一是使用 Azure 交互式 shell,二是本地安装 Azure 命令行工具。下面是每种方法的说明。

    • 使用 Azure 交互式 ShellAzure 门户包含一个交互式 Shell,你可以用它与你的 Kubernetes 集群进行通信。要访问此 Shell,请前往 portal.azure.com 并点击下面的按钮。

      ../../_images/cli_start.png

    注意

    • 如果你遇到类似 could not retrieve token from local cache(无法从本地缓存检索令牌)的错误,请尝试刷新浏览器窗口。

    • 首次执行此操作时,系统会要求你创建一个存储帐户,你的 Shell 文件系统将存放在该帐户中。

    • 本地安装命令行工具。你可以通过本地安装软件包来访问 Azure CLI。

      为此,首先请遵循 Azure 文档中的安装说明。然后运行以下命令,将你的本地 CLI 与你的帐户连接起来。

      az login
      

      你需要打开一个浏览器,并按照终端中的说明进行登录。

  2. 激活正确的订阅。Azure 使用订阅的概念来管理支出。你可以通过运行以下命令获取你的帐户有权访问的订阅列表

    az account list --refresh --output table
    

    选择你想用来创建集群的订阅,并将其设置为默认订阅。如果你只有一个订阅,可以忽略此步骤。

    az account set --subscription <YOUR-CHOSEN-SUBSCRIPTION-NAME>
    
  3. 创建一个资源组。Azure 使用资源组的概念将相关资源组织在一起。我们需要在给定的数据中心位置创建一个资源组。我们将在此资源组内部创建计算资源。

    az group create \
       --name=<RESOURCE-GROUP-NAME> \
       --location=centralus \
       --output table
    

    其中

    • --name 指定你的资源组名称。我们建议使用能够唯一标识此 hub 的名称。例如,如果你正在为加州大学伯克利分校 2018 年春季 Data100 课程创建一个资源组,你可以给它一个 <RESOURCE-GROUP-NAME>ucb_2018sp_data100_hub 的名称。

    • --location 指定你希望资源所在的数据中心位置。在本例中,我们使用了 centralus 位置。有关其他选项,请参阅支持 AKS 的 Azure 位置列表。请注意,并非所有位置都提供所有 VM 大小。要查看推荐位置的列表,请转到Azure 门户 > 虚拟机,点击“创建...”,然后在 区域 的下拉列表中查看推荐位置。

    • --output table 指定输出应为人类可读的格式,而不是默认的 JSON 输出。当手动执行命令时,我们大多数情况下都会使用这个选项。

    考虑为你的 Azure 账户设置云预算,以确保你不会意外超支。

  4. 选择一个集群名称。

    在接下来的步骤中,我们将运行一些命令,要求你输入集群名称。我们建议使用描述性强且简短的名称。在本节的其余部分,我们将把它称为 <CLUSTER-NAME>

    下一步将在你的文件系统上创建一些文件,因此首先创建一个文件夹来存放这些文件。我们建议给它起一个与你的集群相同的名字

    mkdir <CLUSTER-NAME>
    cd <CLUSTER-NAME>
    
  5. 创建一个 ssh 密钥以保护你的集群。

    ssh-keygen -f ssh-key-<CLUSTER-NAME>
    

    它会提示你添加一个密码,如果你愿意,可以留空。这将创建一个名为 ssh-key-<CLUSTER-NAME>.pub 的公钥和一个名为 ssh-key-<CLUSTER-NAME> 的私钥。请确保将它们都放入我们之前创建的文件夹中,并妥善保管!

    此命令还会在你的终端屏幕上打印一些内容。你不需要对这些文本做任何操作。

  6. 创建一个虚拟网络和子网。

    Kubernetes 默认不附带强制执行 networkpolicy 资源的控制器。networkpolicy 资源很重要,因为它们定义了 Kubernetes Pod 如何安全地相互通信以及与外部源(例如互联网)通信。

    要在 Azure 中启用此功能,我们必须首先创建一个启用了 Azure 自身网络策略的虚拟网络

    本文档的这一部分遵循了 Microsoft Azure 关于创建 AKS 集群并启用网络策略的教程,其中包含了使用 Calico 网络策略的信息。

    az network vnet create \
       --resource-group <RESOURCE-GROUP-NAME> \
       --name <VNET-NAME> \
       --address-prefixes 10.0.0.0/8 \
       --subnet-name <SUBNET-NAME> \
       --subnet-prefix 10.240.0.0/16
    

    其中

    • --resource-group 是你创建的 ResourceGroup(资源组)

    • --name 是你想分配给你的虚拟网络的名称,例如 hub-vnet

    • --address-prefixes 是你的虚拟网络的 IP 地址前缀

    • --subnet-name 是你期望的子网名称,例如 hub-subnet

    • --subnet-prefixes 是子网的 CIDR 格式的 IP 地址前缀

    我们现在将检索刚刚创建的虚拟网络和子网的应用程序 ID,并将它们保存到 bash 变量中。

    VNET_ID=$(az network vnet show \
       --resource-group <RESOURCE-GROUP-NAME> \
       --name <VNET-NAME> \
       --query id \
       --output tsv)
    SUBNET_ID=$(az network vnet subnet show \
       --resource-group <RESOURCE-GROUP-NAME> \
       --vnet-name <VNET-NAME> \
       --name <SUBNET-NAME> \
       --query id \
       --output tsv)
    

    我们将创建一个 Azure Active Directory (Azure AD) 服务主体供集群使用,并为虚拟网络分配参与者角色。确保 SERVICE-PRINCIPAL-NAME 是易于识别的,例如 binderhub-sp

    SP_PASSWD=$(az ad sp create-for-rbac \
       --name <SERVICE-PRINCIPAL-NAME> \
       --role Contributor \
       --scopes $VNET_ID \
       --query password \
       --output tsv)
    SP_ID=$(az ad app list \
       --filter "displayname eq '<SERVICE-PRINCIPAL-NAME>'" \
       --query [0].appId \
       --output tsv)
    

    你需要对你的订阅拥有所有者角色才能成功完成此步骤。

  7. 创建一个 AKS 集群。

    在此阶段,你可能希望考虑自定义你的部署。Hub23 部署指南包含了在 Azure 上部署具有自动缩放和多个节点池的 Kubernetes 集群的说明。这些说明可以组合使用,以便所有节点池都可以自动缩放。

    以下命令将在我们之前创建的资源组内请求一个 Kubernetes 集群。

    az aks create \
       --name <CLUSTER-NAME> \
       --resource-group <RESOURCE-GROUP-NAME> \
       --ssh-key-value ssh-key-<CLUSTER-NAME>.pub \
       --node-count 3 \
       --node-vm-size Standard_D2s_v3 \
       --service-principal $SP_ID \
       --client-secret $SP_PASSWD \
       --dns-service-ip 10.0.0.10 \
       --docker-bridge-address 172.17.0.1/16 \
       --network-plugin azure \
       --network-policy azure \
       --service-cidr 10.0.0.0/16 \
       --vnet-subnet-id $SUBNET_ID \
       --output table
    

    其中

    • --name 是你希望用来指代你的集群的名称

    • --resource-group 是你创建的 ResourceGroup(资源组)

    • --ssh-key-value 是创建的 ssh 公钥

    • --node-count 是你希望在 Kubernetes 集群中拥有的节点数量

    • --node-vm-size 是你想要使用的节点大小,这取决于你的集群用途以及每个用户需要多少 RAM/CPU。这里有一份所有可能的节点大小列表供你选择,但并非所有大小在你所在地区都可用。如果在创建集群时遇到错误,你可以尝试更改区域或节点大小。

    • --service-principal 是我们创建的服务主体的应用程序 ID

    • --client-secret 是我们创建的服务主体的密码

    • --dns-service-ip 是分配给 Kubernetes DNS 服务的 IP 地址

    • --docker-bridge-address 是 Docker 桥接器的特定 IP 地址和网络掩码,使用标准 CIDR 表示法

    • --network-plugin 是要使用的 Kubernetes 网络插件。在本例中,我们使用了 Azure 自己的实现。

    • --network-policy 是要使用的 Kubernetes 网络策略。在本例中,我们使用了 Azure 自己的实现。

    • --service-cidr 是一个 CIDR 表示法的 IP 范围,用于分配服务集群 IP

    • vnet-subnet-id 是我们创建的子网的应用程序 ID

    • 此命令将安装默认版本的 Kubernetes。你可以传递 --kubernetes-version 来安装不同的版本。

    这应该需要几分钟时间,然后你就会拥有一个可以工作的 Kubernetes 集群!

    (可选)准备自动缩放,其中

    • --vm-set-type VirtualMachineScaleSets 将集群部署为规模集。

    • --enable-cluster-autoscaler 为你的集群启用自动缩放功能

    • --min-count 3 是最小节点数

    • --max-count 6 是最大节点数

    你也可以稍后使用以下命令启用自动缩放功能:

    SP_POOLNAME=$(az aks nodepool list \
       --resource-group <RESOURCE-GROUP-NAME> \
       --cluster-name <CLUSTER-NAME> \
       --query [0].name \
       --output tsv)
    az aks nodepool update \
       --name $SP_POOLNAME \
       --cluster-name <CLUSTER-NAME> \
       --resource-group <RESOURCE-GROUP-NAME> \
       --enable-cluster-autoscaler \
       --min-count <DESIRED-MINIMUM-COUNT> \
       --max-count <DESIRED-MAXIMUM-COUNT>
    

    或者使用 --update-cluster-autoscaler 更新参数。

    az aks update \
       --name <CLUSTER-NAME> \
       --resource-group <RESOURCE-GROUP-NAME> \
       --update-cluster-autoscaler \
       --min-count <DESIRED-MINIMUM-COUNT> \
       --max-count <DESIRED-MAXIMUM-COUNT> \
       --output table
    

    必须同时定义 --min-count--max-count

    请在这里阅读更多关于自动缩放器可用选项的信息。

  8. 如果你在本地使用 Azure CLI,请安装 kubectl,这是一个从命令行访问 Kubernetes API 的工具。

    az aks install-cli
    

    注意:kubectl 已经安装在 Azure Cloud Shell 中。

  9. 从 Azure 获取凭据以使 kubectl 能够工作

    az aks get-credentials \
       --name <CLUSTER-NAME> \
       --resource-group <RESOURCE-GROUP-NAME> \
       --output table
    

    其中

    • --name 是你给集群起的名字

    • --resource-group 是你创建的 ResourceGroup(资源组)

    这会自动更新你的 Kubernetes 客户端配置文件。

  10. 检查你的集群是否功能齐全

    kubectl get node
    

    响应应该列出三个正在运行的节点及其 Kubernetes 版本!每个节点的状态都应为 Ready,请注意这可能需要一些时间。

注意

如果你使用 Azure 门户创建集群,则必须启用 RBAC。使用命令行工具时,RBAC 是默认启用的。

  1. 启用自动缩放(可选)

    如果你的集群已准备好进行自动缩放(--enable-cluster-autoscaler),请转到 Azure 门户启用自动缩放并设置规则来管理集群自动缩放器。

    导航到门户上你的活动订阅。

    在“资源”下,选择 VMSS。它的名称应该类似于 aks-nodepool1-<random-str>-vmss

    ../../_images/select_vmss.png

    从左侧菜单中,选择“缩放”。点击蓝色的“自定义自动缩放”按钮,一个自动生成的缩放条件表单将会出现。我们将向此条件添加两条新规则。

    • 当 10 分钟内平均 CPU 使用率大于 70% 时,将实例计数增加 1

    • 当 10 分钟内平均 CPU 使用率小于 5% 时,将实例计数减少 1

    ../../_images/scale_condition.png

    确保选中“按指标缩放”选项,然后点击“+ 添加规则”,另一个自动生成的表单将会出现。这个表单将预先填写好满足我们第一条规则所需的设置,因此点击“更新”保存它,然后再次点击“+ 添加规则”。

    ../../_images/scale_out.png

    第二个表单需要编辑以满足第二条规则,即当 10 分钟内平均 CPU 使用率小于 5% 时将实例计数减少 1。保存此规则,然后保存整个缩放条件,集群将自动更新。

    ../../_images/scale_in.png

    此表单还可用于更改之前通过使用缩放条件的“实例限制”部分(分别为“默认”、“最小”和“最大”)设置的 --node-count/--min-count/--max-count

恭喜!现在你的 Kubernetes 集群已经运行起来,是时候开始设置 Helm了。