zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/wayneiscoming/p/7649642.html
Copyright © 2011-2022 走看看