环境: 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 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个或者多个类似如下的模板:
- 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 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集群被创建起来,在部署中可以看到详细部署的进度:
Ⅶ. 创建一个测试服务
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
posted on 2017-10-21 11:16 走心的狗 阅读(...) 评论(...) 编辑 收藏