• 使用acs-engine在Azure中国区部署kubernetes集群详解


    转载请注明出处:http://www.cnblogs.com/wayneiscoming/p/7649642.html

    1. acs-engine简介

      ACS是微软在2015年12月推出的一项基于容器的云端PaaS服务。说简单点,acs-engine就是一个ARM模板生成器,用户只需要配置几个简单的参数来描述容器集群的规格,然后acs-engine将这个容器集群描述文件转化成一组ARM(Azure Resource Manager)模板,然后用户可以使用azure的cli命令来自动化地在Azure公有云上生成容器集群。

      ACS完全基于开源组件,目前ACS支持主流的编排框架有:DC/OS,Swarm,Kubernetes。acs-engine也已经在GitHub上开源(https://github.com/azure/acs-engine)。

      目前有人说无法在中国区使用acs-engine,但是实测acs-engine可以在中国区部署k8s集群了,下面将对部署过程进行详细介绍。至于k8s集群这里先不进行详细介绍,请参考其他资料,后续我也将介绍一些关于k8s的相关内容。

     2. acs-engine部署

      环境: CentOS7,acs-enginev0.8.0

      1. 首先获取acs-engine源码包,由于官方已经提供编译好的acs-engine,所以懒人可以直接下载解压,不用通过源码编译。但是源码包中包含了模板文件,建议一起下载:

    # wget https://github.com/Azure/acs-engine/releases/download/v0.8.0/acs-engine-v0.8.0-linux-amd64.zip
    # wget https://github.com/Azure/acs-engine/archive/v0.8.0.zip

      2. 安装依赖软件:

    # yum install golang
    # yum install git

      3. 运行go get all命令安装ACS引擎需要的依赖组件

      4. 解压源码包和编译好的acs-engine:

    # cd ~
    # unzip acs-engine-v0.8.0-linux-amd64.zip
    # unzip v0.8.0.zip

      5. 运行acs-engine命令:

    # echo "export PATH=$PATH:$HOME/v0.8.0" >> ~/.bash_profile
    # source ~/.bash_profile
    # acs-engine 
    ACS-Engine deploys and manages Kubernetes, Swarm Mode, and DC/OS clusters in Azure
    
    Usage:
      acs-engine [command]
    
    Available Commands:
      generate    Generate an Azure Resource Manager template
      help        Help about any command
      version     Print the version of ACS-Engine
    
    Flags:
          --debug   enable verbose debug logs
      -h, --help    help for acs-engine
    
    Use "acs-engine [command] --help" for more information about a command.
    View Code

    3. Kubernetes集群搭建

      由于目前acs-engine源码中已经加入了Azure中国区,所以我们无需修改源码,只需要在第三步编辑集群定义文件时中指定微软云中国区,acs-engine会在生成的ARM模板中将Kubernetes的镜像源替换成国内可以访问的地址。

    Ⅰ. 集群说明

      我创建的是1个master节点2个node节点的集群,创建后的集群架构如下:

      

      

      使用ARM模板创建的集群会在Azure中为master节点创建LoadBalancer,而至于node节点,则会在当你在k8s中将一个服务的访问方式设置为LoadBalancer后,k8s集群会访问Azure的API为node节点创建一个LoadBalancer,并且添加上Public IP,k8s集群服务访问方式这里暂不详细说明。

    Ⅱ. 生成SSH密钥

       创建的k8s集群默认是通过SSH密钥登录的,因此我们要首先生成SSH密钥,这里只做Linux举例,windows/mac请自行查阅相关资料。

    # mkdir ~/.ssh
    # chmod 700 ~/.ssh
    # ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/b/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/b/.ssh/id_rsa.
    Your public key has been saved in /home/b/.ssh/id_rsa.pub.

    Ⅲ. 创建服务主体账号密码

      k8s集群需要能够访问你的微软云并创建删除相关资源,因此需要给k8s集群配置服务主体账号密码。你可以选择Azure CLI、Powershell、或者在Portal中直接创建,当然,你的Azure账号必须有应用程序注册的权限。这里介绍下Azure CLI和Portal中创建的方式。

      1> Azure CLI 2.0

    # az cloud set -n AzureChinaCloud
    # az login
    # az account set --subscription="${SUBSCRIPTION_ID}"
    # az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}"

        之后你将得到一个json格式的tenant账号密码等信息: (需要注意的是以上命令生成的密码有效期只有一年,而Azure应用程序账号密码有效期可以选择一年/三年/永久,需要指定密码有效期要在后面加 --years 参数。你可以在Portal - Azure Active Directory - 应用程序注册 中找到名字为以下displayName的账号)

    {
         "appId": "xxxxx-xxxxxxx-xxxxxxx-xxxxxx-xxxxxx",
         "displayName": "azure-cli-2017-10-13-08-20-35",
         "name": "http://azure-cli-2017-10-13-08-20-35",
         "password": "87ads6f7s6d7f87ad6sf78a6s7df7asf",
         "tenant": "xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxxx"
    }

       你可以登录来验证下你的应用程序账号:

    # az login --service-principal -u NAME -p PASSWORD --tenant TENANT
    # az vm list-sizes --location chinaeast

      2> Portal

      

    Ⅳ. 编辑集群定义文件

      在你下载的源码包中有最简单的集群定义文件举例,文件位置在 examples/kubernetes.json,修改这个文件以满足你的集群要求,关于集群定义文件详细信息请参考官方说明,这里给出我使用的配置举例:{  "apiVersion": "vlabs",

      "location": "chinaeast",   #这里一定要指定location为中国区,否则生成的ARM模板中k8s镜像的地址为azureedge域名的地址,国内无法访问。
      "properties": {
        "orchestratorProfile": {
          "orchestratorType": "Kubernetes",
          "kubernetesConfig": {
    "clusterSubnet": "10.244.0.0/16", #pod使用的地址空间 "dnsServiceIP": "10.4.0.10", "serviceCidr": "10.4.0.0/16" #service使用的地址空间 } }, "masterProfile": { #master节点配置 "count": 1, #master主机数量 "dnsPrefix": "k8s-preproduction", #生成的k8s集群可以通过dnsPrefix.chinaeast.cloudapp.chinacloudapi.cn来访问 "vnetSubnetID": "/subscriptions/xxxxxxxxxxx/resourceGroups/Pre-Production/providers/Microsoft.Network/virtualNetworks/XXXVNET/subnets/default", #指定部署到现有的subnet,否则会生成一个新的subnet "firstConsecutiveStaticIP": "10.0.0.7", #master的起始IP "storageProfile": "ManagedDisks", #指定使用托管磁盘 "distro": "ubuntu", #使用ubuntu镜像,对于k8s集群,acs-engine目前只支持ubuntu镜像。对于Swarm集群可以指定rhel镜像 "vmSize": "Standard_DS2_v2" #虚拟机规模 }, "agentPoolProfiles": [ #node节点配置 { "name": "preagpool1", "count": 2, "vmSize": "Standard_DS2_v2", "vnetSubnetID": "/subscriptions/xxxxxxxxxxx/resourceGroups/Pre-Production/providers/Microsoft.Network/virtualNetworks/XXXVNET/subnets/default", "storageProfile": "ManagedDisks", #node节点默认不使用托管磁盘,需要使用这里必须指定 "distro": "ubuntu", "availabilityProfile": "AvailabilitySet" } ], "linuxProfile": { "adminUsername": "sshuser", "ssh": { "publicKeys": [ #这里给出步骤Ⅰ生成的ssh密钥 { "keyData": "ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx sshuser@acs-engine-test" } ] } }, "servicePrincipalProfile": { #这里给步骤Ⅱ生成的appID和password "clientId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } } }

     Ⅴ. 生成ARM模板

      使用刚编辑好的kubernetes.json作为输入参数,执行以下命令生成ARM模板:  

    # acs-engine generate examples/kubernetes.json

      生成的模板位于_output/"dnsPrefix"路径下,将会生成3个或者多个类似如下的模板:

    1. apimodel.json - 集群配置文件
    2. azuredeploy.json - 核心的ARM (Azure Resource Model)模板,用来部署k8s集群
    3. azuredeploy.parameters.json - 部署参数文件,其中的参数可以自定义
    4. certificate and access config files - kubernetes需要的一些证书,这些证书文件和它依赖的kube config配置文件也存放在和ARM模板同级目录下面

      需要注意的是,当修改已有的Docker容器集群的时候,应该修改apimodel.json文件来保证最新的部署不会影响到目前集群中已有的资源。举个例子,如果一个容器集群中的节点数量不够的时候,可以修改apimodel.json中的集群节点数量,然后重新运行acs-engine命令并将apimodel.json作为输入参数来生成新的ARM模板。这样部署以后,集群中的旧的节点就不会有变化,新的节点会自动加入。

       可以看到apimodel以及parameters文件中k8s的镜像地址已经换成crproxy.trafficmanager.net,这个地址国内可以访问的到,这里我们还需要修改parameters文件中的两个参数:

    "dockerEngineDownloadRepo": {
      "value": "https://mirror.kaiyuanshe.cn/docker-engine/apt/repo/"      #由于当前mirror.azure.cn有证书问题,我们这里把docker-engine源替换到其他源
    },
    "kubernetesTillerSpec": {
       "value": "crproxy.trafficmanager.net:6000/kubernetes-helm/tiller:v2.6.1"    #这里没有自动替换到trafficmanager地址而扔使用的azureedge地址,手动将其替换
    }

    Ⅵ. 部署ARM模板

       1> Azure CLI 2.0

    $ az cloud set -n AzureChinaCloud
    
    $ az login
    
    $ az account set --subscription "<SUBSCRIPTION NAME OR ID>"
    
    $ az group create 
        --name "<RESOURCE_GROUP_NAME>" 
        --location "<LOCATION>"
    
    $ az group deployment create 
        --name "<DEPLOYMENT NAME>" 
        --resource-group "<RESOURCE_GROUP_NAME>" 
        --template-file "./_output/<INSTANCE>/azuredeploy.json" 
        --parameters "./_output/<INSTANCE>/azuredeploy.parameters.json"

      2> Powershell

    Add-AzureRmAccount
    
    Select-AzureRmSubscription -SubscriptionID <SUBSCRIPTION_ID>
    
    New-AzureRmResourceGroup `
        -Name <RESOURCE_GROUP_NAME> `
        -Location <LOCATION>
    
    New-AzureRmResourceGroupDeployment `
        -Name <DEPLOYMENT_NAME> `
        -ResourceGroupName <RESOURCE_GROUP_NAME> `
        -TemplateFile _output<INSTANCE>azuredeploy.json `
        -TemplateParameterFile _output<INSTANCE>azuredeploy.parameters.json

      不出意外你将在resource group里看到k8s集群被创建起来,在部署中可以看到详细部署的进度:

      

      若kube-dns以及kubernetes-dashboard服务无法正常启动,需要安装网络组建(flannel、calico等),这里给出flannel部署方式,calico可以在cluster文件kubernetesConfig中配置networkPolicy: "calico"。

    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: flannel
    rules:
      - apiGroups:
          - ""
        resources:
          - pods
        verbs:
          - get
      - apiGroups:
          - ""
        resources:
          - nodes
        verbs:
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - nodes/status
        verbs:
          - patch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: flannel
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: flannel
    subjects:
    - kind: ServiceAccount
      name: flannel
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: flannel
      namespace: kube-system
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: kube-flannel-cfg
      namespace: kube-system
      labels:
        tier: node
        app: flannel
    data:
      cni-conf.json: |
        {
          "name": "cbr0",
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        }
      net-conf.json: |
        {
          "Network": "10.244.0.0/16",
          "Backend": {
            "Type": "vxlan"
          }
        }
    ---
    apiVersion: extensions/v1beta1
    kind: DaemonSet
    metadata:
      name: kube-flannel-ds
      namespace: kube-system
      labels:
        tier: node
        app: flannel
    spec:
      template:
        metadata:
          labels:
            tier: node
            app: flannel
        spec:
          hostNetwork: true
          nodeSelector:
            beta.kubernetes.io/arch: amd64
          tolerations:
          - key: node-role.kubernetes.io/master
            operator: Exists
            effect: NoSchedule
          serviceAccountName: flannel
          initContainers:
          - name: install-cni
            image: quay.io/coreos/flannel:v0.9.0-amd64
            command:
            - cp
            args:
            - -f
            - /etc/kube-flannel/cni-conf.json
            - /etc/cni/net.d/10-flannel.conf
            volumeMounts:
            - name: cni
              mountPath: /etc/cni/net.d
            - name: flannel-cfg
              mountPath: /etc/kube-flannel/
          containers:
          - name: kube-flannel
            image: quay.io/coreos/flannel:v0.9.0-amd64
            command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr" ]
            securityContext:
              privileged: true
            env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            volumeMounts:
            - name: run
              mountPath: /run
            - name: flannel-cfg
              mountPath: /etc/kube-flannel/
          volumes:
            - name: run
              hostPath:
                path: /run
            - name: cni
              hostPath:
                path: /etc/cni/net.d
            - name: flannel-cfg
              configMap:
                name: kube-flannel-cfg
    flannel.yaml

    Ⅶ. 创建一个测试服务

       1> 使用SSH密钥通过master IP或者FQDN连接到k8s集群中

       2> 查看集群状态,正常的话node都应该为ready状态,pods为running

    # kubectl get nodes
    # kubectl get pods --all-namespaces

      3> 创建一个nginx deployment,成功后你将看到一个running的nginx pod

    # kubectl run nginx --image nginx
    # kubectl get pods -o yaml
    # curl curl 10.244.1.4 (pod IP)

       

      4> 创建nginx服务

    # kubectl expose deployment nginx --port=80
    # kubectl get service
    # curl 10.0.105.199 (service IP)

        

       5> 设置服务可以通过外部访问

      k8s的服务外部访问方式有LoadBalancer、NodePort、Ingress,这里暂不进行过多赘述,我们使用LoadBalancer方式。

    # kubectl edit svc nginx

       将type从ClusterIP改为LoadBalancer,保存退出。之后k8s集群将会自动为node节点创建一个Azure LoadBalancer和一个public IP

      6> 访问服务

      当EXTERNAL-IP从Pending状态变为一个public IP时,则可以通过浏览器进行服务访问了。

    # kubectl get svc

      

      

      至此,通过acs-engine搭建k8s集群结束。

    Ⅶ. 一些关于acs-engine的问题

      上周与acs的开发人员进行了交流,以下是一些咨询的问题以及答案:

      1. Scale up/down master with acs-engine?  -> Not supported

      2. Scale down nodes with acs-engine? -> Not supported

      3. CentOS supported? -> Maybe later

      4. How to roll back if scale up failed? -> Don't know

      5. When is AKS available in China? -> 2018 Q2

    官方链接:

    https://github.com/Azure/acs-engine

  • 相关阅读:
    Java 将Clob字段转换成String字符串
    Java BigDecimal详解
    java循环创建对象应该在循环体内还是循环体外
    Java 通过身份证获取生日和性别
    Java将数据进行分组处理
    Java 2进制和16进制的转换
    Map-HashMap 与 IF 判断内存占用对比
    Groovy脚本-通用SQL开关
    Oracle用户、授权、角色管理
    【docker随笔系列】安装sqlserver
  • 原文地址:https://www.cnblogs.com/wayneiscoming/p/7649642.html
Copyright © 2020-2023  润新知