设为首页 收藏本站
查看: 926|回复: 0

[经验分享] 使用acs-engine在Azure中国区部署kubernetes集群详解

[复制链接]

尚未签到

发表于 2018-1-5 10:37:14 | 显示全部楼层 |阅读模式
  转载请注明出处: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>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个或者多个类似如下的模板:


  • apimodel.json - 集群配置文件
  • azuredeploy.json - 核心的ARM (Azure Resource Model)模板,用来部署k8s集群
  • azuredeploy.parameters.json - 部署参数文件,其中的参数可以自定义
  • 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>

  
$ 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431820-1-1.html 上篇帖子: 使用Kubernetes需要注意的一些问题(FAQ of k8s) 下篇帖子: 【云计算】Kubernetes、Marathon等框架需要解决什么样的问题?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表