Table of Contents

使用 acs-engine 部署 Kubernetes 集群

重要事项

由于 acs-engine 产品在不断开发改进中,现有配置文件方法在后续不一定能成功。建议用户参考 Github - Azure Container Service Engine, 了解最新进展,交流技术问题。 现阶段关于 Kubernetes 的架构请参考链接:GitHub - Kubernetes

操作步骤

  1. 安装 acs-engine

    建议在 Ubuntu 16.04 中使用 acs-engine 0.8.0 进行部署。该系统版本是经过测试的较稳定的版本,其他 Linux 发行版本如 CentOS 可能在后续 Kubernetes 管理中有一些问题。若使用 acs-engine 的其他版本,使用的 Kubernetes.json 文件格式可能有所不同。

    您也可以用源码进行编译安装,本文对该部分不做介绍,参考:源码部署安装 ACS Engine

    acs-engine 下载地址:https://github.com/Azure/acs-engine/releases/tag/v0.8.0

    $ wget https://github.com/Azure/acs-engine/releases/download/v0.8.0/acs-engine-v0.8.0-linux-amd64.tar.gz
    $ tar zxvf acs-engine-v0.8.0-linux-amd64.tar.gz
    $ cd acs-engine-v0.8.0-linux-amd64/
    
  2. 创建服务主体

    您需要首先安装 Azure CLI 2.0。安装方法请参考:安装 Azure CLI 2.0

    $ az cloud set -n AzureChinaCloud
    $ az login  -u test@test.partner.onmschina.cn -p yourpassword
    $ az account set --subscription  "12345678-xxxx-xxxx-1234567890"
    $ az group create -n lqik8s07 -l chinanorth
    $ az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/12345678-xxxx-xxxx-1234567890/resourceGroups/lqik8s07"
    {
    "appId": "1d061005-xxxx-xxxx-xxxx-e17b62daacb0",
    "displayName": "azure-cli-2017-07-27-06-55-01",
    "name": "http://azure-cli-2017-07-27-06-55-01",
    "password": "e7efcbff-xxxx-xxxx-xxxx-4d1e5c4ca0a0",
    "tenant": "89e1b688-xxxx-xxxx-xxxx-54d0a43a4f0d"
    }
    

    这里生成的 appId 是下文中 Kubernetes.json 模板中的 ClientID,password 为 Secret。

    注意

    为了安全考虑,这里仅将服务主体的权限赋予了特定资源组,该资源组将用于创建 Kubernetes 的所有 Azure 资源。如果您需要将 Kubernetes 集群放在其他资源组,您需要额外再进行权限设置,否则在后续服务配置中会遇到权限拒绝等错误。设置方法为:

    $ az role assignment create --role "Contributor" --assignee "appid" --scope /subscriptions/12345678-xxxx-xxxx-1234567890/resourceGroups/lqik8s08
    

    为了测试方便,您也可以直接将权限赋予整个订阅,但我们不推荐在生产环境中这样做。方法如下:

    $ az role assignment create --role "Contributor" --assignee "appid" --scope /subscriptions/12345678-xxxx-xxxx-1234567890
    
  3. 编辑模板

    在使用该模板前,您应该已经完成了第二步,并已经准备好了 SSH 公钥和密钥对,这将用于登录您的 Kubernetes master 节点。

    Kubernetes.json 模板如下,将相关参数改成您的值,将文件保存在 acs-engine 命令的目录中。

    {
    "apiVersion": "vlabs",
    "location": "yourlocation",
    "properties": {
        "orchestratorProfile": {
        "orchestratorType": "Kubernetes",
        "orchestratorRelease": "1.6"
        },
        "masterProfile": {
        "count": 1,
        "dnsPrefix": "yourprefix",
        "vmSize": "Standard_F2"
        },
        "agentPoolProfiles": [
        {
            "name": "agentpool1",
            "count": 2,
            "vmSize": "Standard_F2",
            "availabilityProfile": "AvailabilitySet"
        }
        ],
        "linuxProfile": {
        "adminUsername": "yourusername",
        "ssh": {
            "publicKeys": [
            {
                "keyData": "yourkey"
            }
            ]
        }
        },
        "servicePrincipalProfile": {
        "ClientID": "appid",
        "Secret": "password "
        }
    }
    }
    

    参数说明:

    • location 决定了后续 Kubernetes master 节点的 DNS 名对应的 Azure 终结点是否正确,请确保一定要填写正确。在中国,可选值应该为 China North 或者 China East。
    • dnsprefix 决定了输出的文件夹,会在当前目录的 _output 下生成一个同名的文件夹,其中包括部署 Kubernetes 集群的参数文件。
    • 您可以调整模板中 masterProfile 和 agentPoolProfiles,修改其 count 和 VMsize 为您实际的需求。
    • 不同版本的 acs-engine 的 Kubernetes.json 模板中具体的参数名可能有所调整,若不确定,建议在 Github 中查找或提交问题。
  4. 生成 Azure 模板

    确认您使用的 acs-engine 版本是正确的,这将决定生成的模板配置。

    $ ./acs-engine version
    Version: v0.8.0
    GitCommit: 79572455
    GitTreeState: clean
    $ ./acs-engine generate kubernetes.json
    INFO[0000] Generating assets into _output/lqi07...
    
  5. 编辑查看模板

    在笔者测试阶段,为了在 Azure 中国区部署成功,部分模板参数需要做调整。在后续的开发中,这部分配置可能会被修正,请参考 GitHub 的最新进展。

    切换到模板目录 _output/yourprefix,编辑 azuredeploy.parameters.json。替换其中部分值如下:

    $ cd _output/lqi07
    $ vi azuredeploy.parameters.json
    

    修改 “kubernetesHyperkubeSpec” 的值为:crproxy.trafficmanager.net:6000/google_containers/hyperkube-amd64:v1.6.11
    修改“dockerEngineDownloadRepo” 的值为:https://mirror.kaiyuanshe.cn/docker-engine/apt/repo
    修改“kubernetesTillerSpec” 的值为:crproxy.trafficmanager.net:6000/kubernetes-helm/tiller:v2.6.1

  6. 部署 Kubernetes 集群

    该过程大约需要 20 分钟左右,其中包括创建 Azure 资源如 VNET,负载均衡,自定义路由,虚拟机,存储账号等,并配置虚拟机中 Kubernetes 各组件和服务。

    $ az group deployment create -g lqik8s07 --template-file azuredeploy.json  --parameters azuredeploy.parameters.json
    
  7. 测试

    acs-engine 默认会为每个区域生成一个 Kubernetes 的配置文件。根据您部署的区域,将该配置赋予您当前的会话,以便进行管理。

    $ export KUBECONFIG=kubeconfig/kubeconfig.chinanorth.json
    $ kubectl get nodes
    NAME                        STATUS    ROLES     AGE       VERSION
    k8s-agentpool1-30086461-0   Ready     agent     5m        v1.6.11
    k8s-agentpool1-30086461-1   Ready     agent     5m        v1.6.11
    k8s-master-30086461-0       Ready     master    5m        v1.6.11
    

排错

IO timeout error

Kubernetes 使用 apiserver 组件用于通信和管理集群服务。若出现该错误,请排查 apiserver 是否正确启动,以及 master 节点上端口是否打开。

登录到 master 节点,看是否有 apiserver 的 docker 容器在运行。

root@k8s-master-30086461-0:~# docker ps -a | grep apiserver
fd40fbc2eb90    crproxy.trafficmanager.net:6000/google_containers/hyperkube-amd64@sha256:f44db072ffd2e0a356268468ea8acddedb35bc45f1a2de38e3f4a4c94ff873dd   "/hyperkube apiserver"  49 minutes ago  Up 49 minutes   k8s_kube-apiserve   _kube-apiserver-k8s-master-30086461-0_kube-system_dc4225866b646d6de7d22fad11386a75_0
7ed5d22d047c    crproxy.trafficmanager.net:6000/google_containers/pause-amd64:3.0   "/pause"    49 minutes ago  Up 49 minutes   k8s_POD_kube-apiserver-k8s-master-30086461-0_kube-system_dc4225866b646d6de7d22fad11386a75_0

查看 443 端口是否在被监听。

root@k8s-master-30086461-0:~# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:10248         0.0.0.0:*               LISTEN      1872/hyperkube
tcp        0      0 127.0.0.1:10249         0.0.0.0:*               LISTEN      2650/hyperkube
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      1160/etcd
tcp        0      0 10.240.255.5:2379       0.0.0.0:*               LISTEN      1160/etcd
tcp        0      0 10.240.255.5:2380       0.0.0.0:*               LISTEN      1160/etcd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1223/sshd
tcp6       0      0 :::443                  :::*                    LISTEN      2188/hyperkube
tcp6       0      0 :::4194                 :::*                    LISTEN      1872/hyperkube
tcp6       0      0 :::31811                :::*                    LISTEN      2650/hyperkube
tcp6       0      0 :::10250                :::*                    LISTEN      1872/hyperkube
tcp6       0      0 :::10251                :::*                    LISTEN      2366/hyperkube
tcp6       0      0 :::10252                :::*                    LISTEN      2338/hyperkube
tcp6       0      0 :::10255                :::*                    LISTEN      1872/hyperkube
tcp6       0      0 :::8080                 :::*                    LISTEN      2188/hyperkube
tcp6       0      0 :::22                   :::*                    LISTEN      1223/sshd
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1033/dhclient

如果没有该容器,docker ps -a 查看运行 kubelet 的容器,检查其日志输出是否有相关错误,根据错误进行问题解决。

root@k8s-master-30086461-0:~# docker ps -a | grep kubelet
5135c1bedfa8    crproxy.trafficmanager.net:6000/google_containers/hyperkube-amd64:v1.6.11   "/hyperkube kubelet -"  53 minutes ago  Up 53 minutes   tender_rosalind
root@k8s-master-30086461-0:~# docker logs 513 > /tmp/kubelet.log 2>&1

如果有容器在运行,但是 443 端口并没有被监听。查看位于 /etc/kubernetes/manifests/ 下配置文件 kube-apiserver.yaml 是否有问题。或者查看 apiserver 容器的日志输出,方法与上一步类似。

测试成功,说明 Kubernetes 集群搭建完成。您可以开始在集群中部署您应用了。由于 Kubernetes 技术是开源产品,关于其具体使用中的问题,若与 Azure 平台无关,建议咨询开源社区或在 Github 中寻求支持。