Google Compute Engine
我们将在Google Compute Engine里构建一个Deis集群!
请在阅读本文时,获取源码并参考contrib/gce中的脚本。
必要条件
为了开通VM实例,让我们先准备一些Google的东西。
安装Google云SDK
安装Google云SDK。你必须使用你的Google账号登录:
$ gcloud auth login
创建新项目
在Google开发者控制台创建一个新项目。你将得到一个类似orbital-gantry-285的项目ID。我们将把它作为SDK工具的默认值:
$ gcloud config set project orbital-gantry-285
开启计费
- 重要说明
- 一旦你创建资源,如硬盘、实例,将开始产生费用。
在浏览器中点击进入项目控制台,然后进入“Billing & Settings”一节。点击“Enable billing”按钮并填写表单。要在GoogleCompute Engine里创建资源就必须这么做。
初始化Compute Engine
Google Compute Engine只有在网页控制台上初始化后才能通过命令行工具访问。在项目控制台点击COMPUTE -> COMPUTE ENGINE -> VM Instances。Compute Engine将花费一些时间初始化,然后就准备好通过gcutil创建资源。
云初始化
通过Deis的contrib/gce/create-gce-user-data脚本创建你的云初始化文件,同时创建一个新的etcd发现URL。首先,安装PyYAML:
$ sudo pip install pyyaml
然后进入contrib/gce目录:
$ cd contrib/gce
最后,创建gce-user-data文件:
$ ./create-gce-user-data $(curl -s https://discovery.etcd.io/new)
我们将拥有了一个用于启动CoreOS节点的gce-user-data文件。
启动实例
生成一个用于Deis主机通讯用的SSH密钥:
$ ssh-keygen -q -t rsa -f ~/.ssh/deis -N '' -C deis
创建一些/var/lib/docker使用的持久化硬盘。CoreOS默认的根分区只有大概4GB,不足以保存Docker镜像和实例。以下命令将创建3块32GB的硬盘:
$ gcutil adddisk --zone us-central1-a --size_gb 32 cored1 cored2 cored3
Table of resources:
+--------+---------------+--------+---------+
| name | zone | status | size-gb |
+--------+---------------+--------+---------+
| cored1 | us-central1-a | READY | 32 |
+--------+---------------+--------+---------+
| cored2 | us-central1-a | READY | 32 |
+--------+---------------+--------+---------+
| cored3 | us-central1-a | READY | 32 |
+--------+---------------+--------+---------+
启动3个实例。你可以从gcloud compute images list列表输出中选择别的启动CoreOS镜像:
$ for num in 1 2 3; do gcutil addinstance --image projects/coreos-cloud/global/images/coreos-alpha-494-0-0-v20141108 --persistent_boot_disk --zone us-central1-a --machine_type n1-standard-2 --tags deis --metadata_from_file user-data:gce-user-data --disk cored${num},deviceName=coredocker --authorized_ssh_keys=core:~/.ssh/deis.pub,core:~/.ssh/google_compute_engine.pub core${num}; done
Table of resources:
+-------+---------------+--------------+---------------+---------+
| name | network-ip | external-ip | zone | status |
+-------+---------------+--------------+---------------+---------+
| core1 | 10.240.33.107 | 23.236.59.66 | us-central1-a | RUNNING |
+-------+---------------+--------------+---------------+---------+
| core2 | 10.240.94.33 | 108.59.80.17 | us-central1-a | RUNNING |
+-------+---------------+--------------+---------------+---------+
| core3 | 10.240.28.163 | 108.59.85.85 | us-central1-a | RUNNING |
+-------+---------------+--------------+---------------+---------+
- 注意
- 开通脚本默认开通n1-standard-2实例。不推荐选择更小的实例规格。请在选择运行Deis的实例规格时参考“系统需求”中的资源要求。
负载均衡
deisctl工具使用SSH通道与远程主机进行通讯。如果你没有SSH密钥,以下命令将生成一个名为deis的密钥对:
$ ssh-keygen -q -t rsa -f ~/.ssh/deis -N '' -C deis
生成新的发现URL
我们需要对Deis路由进行负载均衡,以便能访问Deis服务(控制器和构建器)及我们的应用。
$ gcutil addhttphealthcheck basic-check --request_path /health-check
$ gcutil addtargetpool deis --health_checks basic-check --region us-central1 --instances core1,core2,core3
$ gcutil addforwardingrule deisapp --region us-central1 --target_pool deis
Table of resources:
+---------+-------------+--------------+
| name | region | ip |
+---------+-------------+--------------+
| deisapp | us-central1 | 23.251.153.6 |
+---------+-------------+--------------+
注意转发规则的外网IP地址。我们需要用它作为后续步骤的Deis登录端点。现在,开放CoreOS节点的端口:
$ gcutil addfirewall deis-router --target_tags deis --allowed "tcp:80,tcp:2222"
配置DNS
我们可以使用gcloud工具在Google云DNS里创建DNS记录。本示例中我们将使用deisdemo.io作为域名。创建zone:
$ gcloud dns managed-zone create --dns_name deisdemo.io. --description "Example Deis cluster domain name" deisdemoio
Creating {'dnsName': 'deisdemo.io.', 'name': 'deisdemoio', 'description':
'Example Deis cluster domain name'} in eco-theater-654
Do you want to continue (Y/n)? Y
{
"creationTime": "2014-07-28T00:01:45.835Z",
"description": "Example Deis cluster domain name",
"dnsName": "deisdemo.io.",
"id": "1374035518570040348",
"kind": "dns#managedZone",
"name": "deisdemoio",
"nameServers": [
"ns-cloud-d1.googledomains.com.",
"ns-cloud-d2.googledomains.com.",
"ns-cloud-d3.googledomains.com.",
"ns-cloud-d4.googledomains.com."
]
}
注意JSON输出中的nameServers数组。我们需要将上游域名服务器设置成这些值。
现在编辑zone添加Deis端点和通配DNS:
$ gcloud dns records --zone deisdemoio edit
{
"additions": [
{
"kind": "dns#resourceRecordSet",
"name": "deisdemo.io.",
"rrdatas": [
"ns-cloud-d1.googledomains.com. dns-admin.google.com. 2 21600 3600 1209600 300"
],
"ttl": 21600,
"type": "SOA"
}
],
"deletions": [
{
"kind": "dns#resourceRecordSet",
"name": "deisdemo.io.",
"rrdatas": [
"ns-cloud-d1.googledomains.com. dns-admin.google.com. 1 21600 3600 1209600 300"
],
"ttl": 21600,
"type": "SOA"
}
]
}
你需要使用JSON对象添加两条记录。这是一个编辑添加两条A记录的例子:
{
"additions": [
{
"kind": "dns#resourceRecordSet",
"name": "deisdemo.io.",
"rrdatas": [
"ns-cloud-d1.googledomains.com. dns-admin.google.com. 2 21600 3600 1209600 300"
],
"ttl": 21600,
"type": "SOA"
},
{
"kind": "dns#resourceRecordSet",
"name": "deis.deisdemo.io.",
"rrdatas": [
"23.251.153.6"
],
"ttl": 21600,
"type": "A"
},
{
"kind": "dns#resourceRecordSet",
"name": "*.dev.deisdemo.io.",
"rrdatas": [
"23.251.153.6"
],
"ttl": 21600,
"type": "A"
}
],
"deletions": [
{
"kind": "dns#resourceRecordSet",
"name": "deisdemo.io.",
"rrdatas": [
"ns-cloud-d1.googledomains.com. dns-admin.google.com. 1 21600 3600 1209600 300"
],
"ttl": 21600,
"type": "SOA"
}
]
}
安装Deis平台
现在你已经完成了集群开通,请参考“安装Deis平台”开始平台安装。