Kubernetes on Azure

    ACS 是 Microsoft Azure 在 2015 年推出的容器服务,支持 Kubernetes、DCOS 以及 Dockers Swarm 等多种容器编排工具。并且 ACS 的核心功能是开源的,用户可以通过 https://github.com/Azure/acs-engine 来查看和下载使用。

    以下文档假设用户已经安装好了 Azure CLI ,如未安装可以参考 操作。

    在创建 AKS 集群之前,首先需要开启容器服务

    然后创建一个资源组(Resource Group)用来管理所有相关资源

    1. az group create --name group1 --location centralus

    接下来就可以创建 AKS 集群了

    1. # Create aks
    2. az aks create --resource-group group1 --name myK8sCluster --node-count 3 --generate-ssh-keys

    稍等一会,集群创建好后安装并配置 kubectl

    1. # Install kubectl
    2. az aks install-cli
    3. # Configure kubectl
    4. az aks get-credentials --resource-group=group1 --name=myK8sCluster

    访问 Dashboard

    1. # Create dashboard
    2. az aks browse --resource-group group1 --name myK8SCluster

    手动扩展或收缩集群

    1. az aks scale --resource-group=group1 --name=myK8SCluster --agent-count 5
    1. # 查询当前集群的版本以及可升级的版本
    2. az aks get-versions --name myK8sCluster --resource-group group1 --output table
    3. # 升级到 1.8.1 版本
    4. az aks upgrade --name myK8sCluster --resource-group group1 --kubernetes-version 1.8.1

    下图动态展示了一个部署 v1.7.7 版本集群并升级到 v1.8.1 的过程:

    使用 Helm

    删除集群

    当集群不再需要时,可以删除集群

    1. az group delete --name group1 --yes --no-wait

    虽然未来 AKS 是 Azure 容器服务的下一代主打产品,但用户可能还是希望可以自己管理容器集群以保证足够的灵活性(比如自定义 master 服务等)。这时用户可以使用开源的 acs-engine 来创建和管理自己的集群。acs-engine 其实就是 ACS 的核心部分,提供了一个部署和管理 Kubernetes、Swarm 和 DC/OS 集群的命令行工具。它通过将容器集群描述文件转化为一组 ARM(Azure Resource Manager)模板来建立容器集群。

    在 acs-engine 中,每个集群都通过一个 json 文件来描述,比如一个 Kubernetes 集群可以描述为

    1. {
    2. "apiVersion": "vlabs",
    3. "properties": {
    4. "orchestratorProfile": {
    5. "orchestratorType": "Kubernetes",
    6. "orchestratorRelease": "1.8",
    7. "kubernetesConfig": {
    8. "networkPolicy": "",
    9. "enableRbac": true
    10. }
    11. },
    12. "masterProfile": {
    13. "count": 1,
    14. "dnsPrefix": "",
    15. },
    16. "agentPoolProfiles": [
    17. {
    18. "name": "agentpool1",
    19. "count": 3,
    20. "vmSize": "Standard_D2_v2",
    21. "availabilityProfile": "AvailabilitySet"
    22. }
    23. ],
    24. "adminUsername": "azureuser",
    25. "ssh": {
    26. "publicKeys": [
    27. {
    28. "keyData": ""
    29. }
    30. ]
    31. }
    32. },
    33. "servicePrincipalProfile": {
    34. "clientId": "",
    35. "secret": ""
    36. }
    37. }
    38. }

    orchestratorType 指定了部署集群的类型,目前支持三种

    • Kubernetes
    • Swarm
    • DCOS

    而创建集群的步骤也很简单

    1. # create a new resource group.
    2. az group create --name myResourceGroup --location "centralus"
    3. # start deploy the kubernetes
    4. acs-engine deploy --resource-group myResourceGroup --subscription-id <subscription-id> --auto-suffix --api-model kubernetes.json --location centralus --dns-prefix <dns-prefix>
    5. # setup kubectl
    6. export KUBECONFIG="$(pwd)/_output/<name-with-suffix>/kubeconfig/kubeconfig.centralus.json"
    7. kubectl get node

    RBAC 默认是不可以开启的,可以通过设置 enableRbac 开启

    1. "kubernetesConfig": {
    2. "enableRbac": true
    3. }

    自定义 Kubernetes 版本

    acs-engine 基于 hyperkube 来部署 Kubernetes 服务,所以只需要使用自定义的 hyperkube 镜像即可。

    1. {
    2. "kubernetesConfig": {
    3. "customHyperkubeImage": "docker.io/feisky/hyperkube-amd64:v1.9.0-dev"
    4. }
    5. }

    hyperkube 镜像可以从 Kubernetes 源码编译,编译步骤为

    1. # Build Kubernetes
    2. bash build/run.sh make KUBE_FASTBUILD=true ARCH=amd64
    3. cd cluster/images/hyperkube
    4. make VERSION=v1.9.0-dev
    5. cd ../../..
    6. # push docker image
    7. docker tag gcr.io/google-containers/hyperkube-amd64:v1.9.0-dev feisky/hyperkube-amd64:v1.9.0-dev

    添加 Windows 节点

    可以通过设置 osType 来添加 Windows 节点(完整示例见 )

    自定义网络插件

    acs-engine 默认使用 kubenet 网络插件,并通过用户自定义的路由以及 IP-forwarding 转发 Pod 网络。此时,Pod 网络与 Node 网络在不同的子网中,Pod 不受 VNET 管理。

    用户还可以使用 插件将 Pod 连接到 Azure VNET 中

    1. "properties": {
    2. "orchestratorProfile": {
    3. "orchestratorType": "Kubernetes",
    4. "kubernetesConfig": {
    5. "networkPolicy": "azure"
    6. }
    7. }
    8. }

    也可以使用 calico 网络插件

    1. "properties": {
    2. "orchestratorProfile": {
    3. "orchestratorType": "Kubernetes",
    4. "kubernetesConfig": {
    5. "networkPolicy": "calico"
    6. }
    7. }
    8. }

    在 AKS 预览版发布的同时,Azure 还同时发布了 Azure Container Registry(ACR)服务,用于托管用户的私有镜像。

    1. # Create ACR
    2. az acr create --resource-group myResourceGroup --name <acrName> --sku Basic --admin-enabled true
    3. # Login
    4. az acr login --name <acrName>
    5. # Tag the image.
    6. az acr list --resource-group myResourceGroup --query "[].{acrLoginServer:loginServer}" --output table
    7. docker tag azure-vote-front <acrLoginServer>/azure-vote-front:redis-v1
    8. # push image
    9. docker push <acrLoginServer>/azure-vote-front:redis-v1
    10. # List images.
    11. az acr repository list --name <acrName> --output table

    Azure 容器实例(ACI)提供了在 Azure 中运行容器的最简捷方式,它不需要用户配置任何虚拟机或其它高级服务。ACI 适用于快速突发式增长和资源调整的业务,但其本身的功能相对比较简单。 Virtual Kubelet 可以将 ACI 作为 Kubernetes 集群的一个无限 Node 使用,这样就无需考虑 Node 数量的问题,ACI 会根据运行容器自动管理集群资源。

    Azure - 图2

    可以使用 Helm 来部署 Virtual Kubelet:

    1. RELEASE_NAME=virtual-kubelet
    2. CHART_URL=https://github.com/virtual-kubelet/virtual-kubelet/raw/master/charts/virtual-kubelet-0.1.0.tgz
    3. helm install "$CHART_URL" --name "$RELEASE_NAME" --namespace kube-system --set env.azureClientId=<YOUR-AZURECLIENTID-HERE>,env.azureClientKey=<YOUR-AZURECLIENTKEY-HERE>,env.azureTenantId=<YOUR-AZURETENANTID-HERE>,env.azureSubscriptionId=<YOUR-AZURESUBSCRIPTIONID-HERE>,env.aciResourceGroup=<YOUR-ACIRESOURCEGROUP-HERE>,env.nodeName=aci, env.nodeOsType=<Linux|Windows>,env.nodeTaint=azure.com/aci

    在开启 RBAC 的集群中,还需要给 virtual-kubelet 开启对应的权限。最简单的方法是给 service account kube-system:default 设置 admin 权限(不推荐生产环境这么设置,应该设置具体的权限),比如

    1. kubectl create clusterrolebinding virtual-kubelet-cluster-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:default

    部署成功后,会发现集群中会出现一个新的名为 aci 的 Node:

    1. $ kubectl get nodes aci
    2. NAME STATUS ROLES AGE VERSION