转载请注明出处: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.

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 ~/.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=
# 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

使用acs-engine在Azure中国区部署kubernetes集群详解的更多相关文章

  1. 在 Azure 上部署 Kubernetes 集群

    在实验.演示的时候,或者是生产过程中,我经常会需要运行一些 Docker 负载.虽然这在本地计算机上十分容易,但是当你要在云端运行的时候就有点困难了.相比于本地运行,在云端运行真的太复杂了.我尝试了几 ...

  2. 二进制部署 Kubernetes 集群

    二进制部署 Kubernetes 集群   提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernet ...

  3. 和我一步步部署 kubernetes 集群

    和我一步步部署 kubernetes 集群 本系列文档介绍使用二进制部署最新 kubernetes v1.6.1 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群: 在部署的过程中, ...

  4. 使用kubeadm部署Kubernetes集群

    一.环境架构与部署准备 1.集群节点架构与各节点所需安装的服务如下图: 2.安装环境与软件版本: Master: 所需软件:docker-ce 17.03.kubelet1.11.1.kubeadm1 ...

  5. 使用Rancher的RKE快速部署Kubernetes集群

    简要说明: 本文共涉及3台Ubuntu机器,1台RKE部署机器(192.168.3.161),2台Kubernetes集群机器(3.162和3.163). 先在Windows机器上,将rke_linu ...

  6. 基于TLS证书手动部署kubernetes集群(下)

    一.master节点组件部署 承接上篇文章--基于TLS证书手动部署kubernetes集群(上),我们已经部署好了etcd集群.flannel网络以及每个节点的docker,接下来部署master节 ...

  7. 高可用Kubernetes集群-15. 部署Kubernetes集群统一日志管理

    参考文档: Github:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsear ...

  8. 高可用Kubernetes集群-14. 部署Kubernetes集群性能监控平台

    参考文档: Github介绍:https://github.com/kubernetes/heapster Github yaml文件: https://github.com/kubernetes/h ...

  9. kubeadm部署Kubernetes集群

    Preface 通过kubeadm管理工具部署Kubernetes集群,相对离线包的二进制部署集群方式而言,更为简单与便捷.以下为个人学习总结: 两者区别在于前者部署方式使得大部分集群组件(Kube- ...

随机推荐

  1. 团队作业4--第一次项目冲刺(Alpha版本)预备工作

    小组说明 我们组是从周一开始对项目进行研究讨论并编程的,因为我们看截止日期是周日,就从周一才开始,起步晚了,是我们认识上的失误,导致我们周一周二的步伐没有协调好,项目进展的不稳定,但是我们在上周末并不 ...

  2. 201521123074 《Java程序设计》第5周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口定义了解:接口(interface)就是方法声明和常量值的集合. 几种接口讲解 ...

  3. ubuntu下php不能显示中文的问题的解决过程。

    在阿里的ECS上的ubuntu平台上成功的安装了apache2和php5与mysql,并进行了测试. 如图所示:

  4. Java课程设计——GUI密码生成器团队博客

    1.团队名称.团队成员介绍(需要有照片) 1.1团队名称 小黄人 1.2团队成员介绍 吴玲:组长,现任院就业会策划部副部长 郭琪容:组员,现任院硬件协会会长 2. 项目git地址 吴 玲 郭琪容 3. ...

  5. 201521123029《Java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容.** 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 ...

  6. Window10中利用Windbg与虚拟机(window7)中调试驱动建立方法

    想起自己的windbg配置就转载:eqera的windows内核调试配置,真的是获益良多希望他不会介意我转载他的博客,帮了我很多,记录下来给我也给大家, 其中我主要看的是VMWare的pipe建立,而 ...

  7. Hibernate的Configuration对象的configure()方法

    Configuration configuration=new Configuration(); configuration.configure(); 在Hibernate底层实现configure( ...

  8. Hibernate中fetch和lazy介绍

    fetch ,指定关联对象抓取的方式,可以设置fetch = "select" 和 fetch = "join".select方式时先查询返回要查询的主体对象( ...

  9. 【京东账户】——Mysql/PHP/Ajax爬坑之页头页尾加载

    一.引言 实现京东的账户项目,有一个小功能,页头页尾加载.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.实现 原理: 用php文件分别写一个的页头和一个页尾,放在前后两个div里. ...

  10. 用Atom打造简单的java编译器以及对于可能出现的问题解答

    如何用Atom打造简单的javaIDE 自己一直比较喜欢Atom编辑器,前段时间给Atom配置好了C/C++的运行环境,自己心里还是感觉挺好的,最近在学习java ,偶然的机会让我看到了一篇文章,就是 ...