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命令:

 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-AzureRmAccountSelect-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集群被创建起来,在部署中可以看到详细部署的进度:

  

Ⅶ. 创建一个测试服务

  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集群结束。

官方链接:

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

原文地址:http://www.cnblogs.com/wayneiscoming/p/7649642.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

使用acs-engine在Azure中国区部署kubernetes集群详解相关推荐

  1. 在 Azure 上部署 Kubernetes 集群

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

  2. 部署Kubernetes集群(二进制 v1.18.8版)

    第一章 kubernetes 功能介绍 · kubernetes 从入门到实践 · 看云 二进制 部署Kubernetes集群 组件版本 组件 版本 二进制包下载地址 备注 centos 7.8.20 ...

  3. 部署kubernetes集群

    在本例中使用三台机器来部署kubernetes集群 172.16.36.50 master 172.16.36.51 cti-1 172.16.36.54 cti-4 关闭三台机器的防火墙 syste ...

  4. 使用Kubespray部署Kubernetes集群

    Kubespray是Google开源的一个部署生产级别的Kubernetes服务器集群的开源项目,它整合了Ansible作为部署的工具.项目地址:https://github.com/kubernet ...

  5. 容器编排技术 -- 使用Minikube 部署 Kubernetes 集群

    容器编排技术 -- 使用Minikube 部署 Kubernetes 集群 单机部署 创建Kubernetes cluster(单机版)最简单的方法是minikube: 首先下载kubectl cur ...

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

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

  7. ② kubeadm快速部署Kubernetes集群

    文章目录 1. 安装要求 2. 目标 3. 准备环境 4. 所有节点安装Docker/kubeadm/kubelet 4.1 安装Docker(以一台为例,其他相同) 4.2 添加kubernetes ...

  8. 【云原生 · Kubernetes】部署Kubernetes集群

    [云原生 · Kubernetes]搭建Harbor仓库 接着上次的内容,后续来了! 在master节点执行脚本k8s_master_install.sh即可完成K8S集群的部署,具体步骤参考如下(1 ...

  9. RKE部署Kubernetes集群

    安装docker 在各个节点建立自定义账户,使其可以用命令操作docker useradd <user_name> passwd <user_name> usermod -aG ...

最新文章

  1. shell date 格式化
  2. Android异步消息处理机制完全解析,带你从源码的角度彻底理解
  3. 解决MariaDB无法远程连接
  4. Java 洛谷 P1914 小书童——密码
  5. 电脑中没有oracle服务器,用AnySQL在没有oracle客户端的服务器上发送邮件
  6. mysql count if 去重_MYSQL数据去重
  7. spark 应用程序性能优化:12 个优化方法
  8. 网络编程(part5)--文件读写偏移量及文件描述符
  9. Silverlight中摄像头的运用—part2
  10. 二、Zabbix-zabbix server部署-LNMP
  11. CISCO技术(1.7万)
  12. snaker工作流核心表学习
  13. 干了5年的前端,实在熬不动了...
  14. Linux文件系统管理-常用命令df\du\fsck\dumpe2fs
  15. 运放搭建的跟随电路作用与分析
  16. c++11中的declval和decltype
  17. mysql的prepared_statement
  18. Kotlin协变和逆变
  19. 传感器系列之4.7地磁传感器
  20. mac安装软件没权限Anywhere ---“XX” is damaged and can’t be opened. You should move it to the Trash 解决方案

热门文章

  1. Nodejs前端服务器压缩图片
  2. spring boot aop 记录方法执行时间
  3. 前端几个笔试题及答案(bd)
  4. Java基础知识回顾--线程
  5. ecs使用脚本安装oracle
  6. insert /*+ APPEND */
  7. oracle 11g ORA-12541: TNS: 无监听程序 (DBD ERROR: OCIServerAttach)
  8. iPhone比小米贵3000,贵在哪里?
  9. QQ旋风爆缓冲区溢出漏洞
  10. CCNA第五章WAN连接