Google Compute Engine

我们将在Google Compute Engine里构建一个Deis集群!

请在阅读本文时,获取源码并参考contrib/gce中的脚本。

必要条件

为了开通VM实例,让我们先准备一些Google的东西。

安装Google云SDK

安装Google云SDK。你必须使用你的Google账号登录:

  1. $ gcloud auth login

创建新项目

Google开发者控制台创建一个新项目。你将得到一个类似orbital-gantry-285的项目ID。我们将把它作为SDK工具的默认值:

  1. $ 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:

  1. $ sudo pip install pyyaml

然后进入contrib/gce目录:

  1. $ cd contrib/gce

最后,创建gce-user-data文件:

  1. $ ./create-gce-user-data $(curl -s https://discovery.etcd.io/new)

我们将拥有了一个用于启动CoreOS节点的gce-user-data文件。

启动实例

生成一个用于Deis主机通讯用的SSH密钥:

  1. $ ssh-keygen -q -t rsa -f ~/.ssh/deis -N '' -C deis

创建一些/var/lib/docker使用的持久化硬盘。CoreOS默认的根分区只有大概4GB,不足以保存Docker镜像和实例。以下命令将创建3块32GB的硬盘:

  1. $ gcutil adddisk --zone us-central1-a --size_gb 32 cored1 cored2 cored3
  2. Table of resources:
  3. +--------+---------------+--------+---------+
  4. | name | zone | status | size-gb |
  5. +--------+---------------+--------+---------+
  6. | cored1 | us-central1-a | READY | 32 |
  7. +--------+---------------+--------+---------+
  8. | cored2 | us-central1-a | READY | 32 |
  9. +--------+---------------+--------+---------+
  10. | cored3 | us-central1-a | READY | 32 |
  11. +--------+---------------+--------+---------+

启动3个实例。你可以从gcloud compute images list列表输出中选择别的启动CoreOS镜像:

  1. $ 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
  2. Table of resources:
  3. +-------+---------------+--------------+---------------+---------+
  4. | name | network-ip | external-ip | zone | status |
  5. +-------+---------------+--------------+---------------+---------+
  6. | core1 | 10.240.33.107 | 23.236.59.66 | us-central1-a | RUNNING |
  7. +-------+---------------+--------------+---------------+---------+
  8. | core2 | 10.240.94.33 | 108.59.80.17 | us-central1-a | RUNNING |
  9. +-------+---------------+--------------+---------------+---------+
  10. | core3 | 10.240.28.163 | 108.59.85.85 | us-central1-a | RUNNING |
  11. +-------+---------------+--------------+---------------+---------+
注意
开通脚本默认开通n1-standard-2实例。不推荐选择更小的实例规格。请在选择运行Deis的实例规格时参考“系统需求”中的资源要求。

负载均衡

deisctl工具使用SSH通道与远程主机进行通讯。如果你没有SSH密钥,以下命令将生成一个名为deis的密钥对:

  1. $ ssh-keygen -q -t rsa -f ~/.ssh/deis -N '' -C deis

生成新的发现URL

我们需要对Deis路由进行负载均衡,以便能访问Deis服务(控制器和构建器)及我们的应用。

  1. $ gcutil addhttphealthcheck basic-check --request_path /health-check
  2. $ gcutil addtargetpool deis --health_checks basic-check --region us-central1 --instances core1,core2,core3
  3. $ gcutil addforwardingrule deisapp --region us-central1 --target_pool deis
  4. Table of resources:
  5. +---------+-------------+--------------+
  6. | name | region | ip |
  7. +---------+-------------+--------------+
  8. | deisapp | us-central1 | 23.251.153.6 |
  9. +---------+-------------+--------------+

注意转发规则的外网IP地址。我们需要用它作为后续步骤的Deis登录端点。现在,开放CoreOS节点的端口:

  1. $ gcutil addfirewall deis-router --target_tags deis --allowed "tcp:80,tcp:2222"

配置DNS

我们可以使用gcloud工具在Google云DNS里创建DNS记录。本示例中我们将使用deisdemo.io作为域名。创建zone:

  1. $ gcloud dns managed-zone create --dns_name deisdemo.io. --description "Example Deis cluster domain name" deisdemoio
  2. Creating {'dnsName': 'deisdemo.io.', 'name': 'deisdemoio', 'description':
  3. 'Example Deis cluster domain name'} in eco-theater-654
  4. Do you want to continue (Y/n)? Y
  5. {
  6. "creationTime": "2014-07-28T00:01:45.835Z",
  7. "description": "Example Deis cluster domain name",
  8. "dnsName": "deisdemo.io.",
  9. "id": "1374035518570040348",
  10. "kind": "dns#managedZone",
  11. "name": "deisdemoio",
  12. "nameServers": [
  13. "ns-cloud-d1.googledomains.com.",
  14. "ns-cloud-d2.googledomains.com.",
  15. "ns-cloud-d3.googledomains.com.",
  16. "ns-cloud-d4.googledomains.com."
  17. ]
  18. }

注意JSON输出中的nameServers数组。我们需要将上游域名服务器设置成这些值。

现在编辑zone添加Deis端点和通配DNS:

  1. $ gcloud dns records --zone deisdemoio edit
  2. {
  3. "additions": [
  4. {
  5. "kind": "dns#resourceRecordSet",
  6. "name": "deisdemo.io.",
  7. "rrdatas": [
  8. "ns-cloud-d1.googledomains.com. dns-admin.google.com. 2 21600 3600 1209600 300"
  9. ],
  10. "ttl": 21600,
  11. "type": "SOA"
  12. }
  13. ],
  14. "deletions": [
  15. {
  16. "kind": "dns#resourceRecordSet",
  17. "name": "deisdemo.io.",
  18. "rrdatas": [
  19. "ns-cloud-d1.googledomains.com. dns-admin.google.com. 1 21600 3600 1209600 300"
  20. ],
  21. "ttl": 21600,
  22. "type": "SOA"
  23. }
  24. ]
  25. }

你需要使用JSON对象添加两条记录。这是一个编辑添加两条A记录的例子:

  1. {
  2. "additions": [
  3. {
  4. "kind": "dns#resourceRecordSet",
  5. "name": "deisdemo.io.",
  6. "rrdatas": [
  7. "ns-cloud-d1.googledomains.com. dns-admin.google.com. 2 21600 3600 1209600 300"
  8. ],
  9. "ttl": 21600,
  10. "type": "SOA"
  11. },
  12. {
  13. "kind": "dns#resourceRecordSet",
  14. "name": "deis.deisdemo.io.",
  15. "rrdatas": [
  16. "23.251.153.6"
  17. ],
  18. "ttl": 21600,
  19. "type": "A"
  20. },
  21. {
  22. "kind": "dns#resourceRecordSet",
  23. "name": "*.dev.deisdemo.io.",
  24. "rrdatas": [
  25. "23.251.153.6"
  26. ],
  27. "ttl": 21600,
  28. "type": "A"
  29. }
  30. ],
  31. "deletions": [
  32. {
  33. "kind": "dns#resourceRecordSet",
  34. "name": "deisdemo.io.",
  35. "rrdatas": [
  36. "ns-cloud-d1.googledomains.com. dns-admin.google.com. 1 21600 3600 1209600 300"
  37. ],
  38. "ttl": 21600,
  39. "type": "SOA"
  40. }
  41. ]
  42. }

安装Deis平台

现在你已经完成了集群开通,请参考“安装Deis平台”开始平台安装。