25.7. 使用采用 Google Compute Engine 的 Red Hat Enterprise Linux Atomic Host

Google Compute Engine(GCE)是提供运行谷歌基础架构虚拟机的服务。这个文档显示如何在 GCE 中运行 Red Hat Enterprise Linux Atomic Host。

25.7.1. 概述

Red Hat Enterprise Linux Atomic Host 旨在利用 Red Hat Enterprise Linux 7 中原有的强大技术,即采用为使用 Docker 引擎运行的容器优化的 Red Hat Enterprise Linux 7 变体。Google Compute Engine( GCE)是提供运行谷歌基础架构虚拟机的服务。这些 VM 可用来运行 Red Hat Enterprise Linux Atomic Host。
该文档解释了如何在 GCE 中启动 Red Hat Enterprise Linux Atomic Host。有关 Red Hat Enterprise Linux Atomic Host 的完整概述及信息,请查看《Red Hat Enterprise Linux Atomic Host 入门》文档。
如果要了解更多信息,请参考:
  1. 《Red Hat Enterprise Linux Atomic Host 入门》 - 这个文档提供 Red Hat Enterprise Linux Atomic Host 原则的信息,以及如何使用该产品的说明。

25.7.2. 启用 Google Compute Engine

25.7.2.1. 创建名称并设置账单

执行以下步骤创建并设置 Google Compute Engine 账单:
  1. 登录谷歌帐户,进入 https://console.developers.google.com/project 中的 **Google 开发者控制台**。这个开发者控制台提供您可以使用的项目列表。
  2. 选择要启用的项目。如果要创建新项目,则请点击红色 创建项目 按纽。此时会提示选择项目名称和 ID。如果您的项目属于具体域,则项目 ID 格式为 \<domain\>:\<your-chosen-project-id\>。然后会为您显示项目面板。
  3. 要激活 Google Compute Engine,请点击右栏目中的 账单 & 设置 菜单项目设置账单。然后点击 启用账单。填写随后出现的表格。在您可以使用这个服务前,Google Compute Engine 将提示您设置账单。不激活账单则无法使用 Google Compute Engine。注:激活后约 5 分钟即可使用您的帐户。

25.7.2.2. 下载和设置 GCE 工具

要管理您的 Google Compute Engine 资源,首先请下载并安装 gcloud 命令后工具:
  1. 执行以下命令安装 Google Cloud SDK:
    $ curl https://sdk.cloud.google.com | bash
  2. 在安装过程中,会多次提示您提供必要信息。首先,会要求您指定 Google Cloud SDK 的目标目录:
    提取目录(这样会创建目录 google-cloud-sdk)(/home/user):
  3. 然后会询问您是否允许向谷歌报告用量,以便其可以使用这个数据改进此工具。
  4. 然后安装 Google Cloud SDK。随后会多次提示您配置个人资料。您可以指定 rc 文件,更改 $PATH 变量,并启用 bash 完成功能。在 $PATH 变量中添加这些程序可让您在不提供完整路径的情况下运行这些程序。启用 bash 完成功能还可让您与之前使用自动完成功能输入的多个参数保持一致。
  5. 重启终端以便 PATH 的更改生效。比如可使用:
    $ source ~/.bash-profile-file
  6. 使用 bash 配置文件路径替换 bash-profile-file,通常是 ~/.bashrc 文件。

25.7.2.3. 验证 GCE

运行以下命令验证谷歌云平台:
$ gcloud auth login
上述命令启动了一个网页浏览器,显示您谷歌帐户的登录对话。执行登录。在登录过程中需要允许 Google Compute Engine 访问您谷歌帐户中的一些信息。可使用 --no-launch-browser 选项在不启动浏览器的情况下进行验证,详情请查看 https://cloud.google.com/compute/docs/gcloud-compute/#auth

25.7.2.4. 设置项目默认选项

使用命令行模板 `gcloud config unset default`可以设定项目默认值,这样就不会将常用标签的命令选项传递给每个命令。要列出当前默认值,请执行`gcloud config list` 命令。模板 `gcloud config unset default` 会删除项目默认。
执行以下命令设定默认项目:
$ gcloud config set project project_id
其中 project_id 代表您在 创建项目并设置收费周期 中创建的项目 id。
执行以下命令设定默认区:
$ gcloud config set compute/zone zone
其中 zone 决定该实例所在地理位置。可用区列表详情,请查看 https://developers.google.com/compute/docs/zones#available

25.7.3. 启动 Red Hat Enterprise Linux Atomic Host 实例

可以在 GCE 中使用 Red Hat Enterprise Linux Atomic Host 映象前,需要将其从 qcow2 文件转换为 RAW 映象,方法是下载 qcow2 文件,然后将其转换为 tar 文件。将这个文件上传到 GCE,然后创建实例。

25.7.3.1. 创建 Red Hat Enterprise Linux Atomic Host RAW 文件

执行以下步骤创建可以上传到 GCE 的 RAW 文件。
  1. 从红帽客户门户网站下载 Red Hat Enterprise Linux Atomic Host qcow2 文件,如 第 1 章 下载 Red Hat Enterprise Linux 所述。
  2. 使用 xz 压缩 qcow2 映象。请运行以下命令解压缩该映象:
    $ xz -d rhel-atomic-cloud-7.1-0.x86_64.qcow2.xz
  3. 必须将 qcow2 映象转换为 RAW 磁盘文件后方可在 GCE 中华使用。可使用 qemu 完成此操作。
    $ qemu-img convert -S 4096 -f qcow2 -O raw rhel-atomic-cloud-7.1-0.x86_64.qcow2 disk.raw
  4. 将原始磁盘文件上传到 GCE 前需使用 tar 打包。原始文件名为 disk.raw。
    $ tar -Szcf rhel-atomic-cloud-7.1-0.x86_64.tar.gz disk.raw
  5. 上传的原始磁盘文件将保存在谷歌云存储桶中。如果还没有生成存储桶,则可以使用 gsutil 生成一个。
    $ gsutil mb gs://bucketname
  6. 使用 gsutil 上传原始磁盘文件。
    $ gsutil cp rhel-atomic-cloud-7.1-0.x86_64.tar.gz gs://bucketname
  7. 可使用原始文件前,必须将其生成为 GCE 映象。
    $ gcloud compute images create GCE_IMAGE_NAME --source-uri gs://bucketname/rhel-atomic-cloud-7.1-0.x86_64.tar.gz
  8. 查看 gcloud compute images list 的输出结果,确认该映象是否已上传且可用

25.7.3.2. 创建 Red Hat Enterprise Linux Atomic Host 实例

执行以下命令创建 Atomic Host 实例:
$ gcloud compute instances create my-atomic-instance --machine-type n1-standard-1 --image GCE_IMAGE_NAME --metadata-from-file startup-script=<your-statup-script>
其中:
my-atomic-instance 是这个示例中的实例名称。实例名称可包含小写字母、数字和横线(最后一个字符除外,最后一个字符不得为横线)。
--machine-type 设定您需要的机器类型。机器类型可决定内存、虚拟核数量、以及虚拟机允许的持久磁盘限制。详情请参看 https://developers.google.com/compute/docs/machine-types
--image 设定要使用的映象。映象包含启动实例所需操作系统和 root 文件系统。GCE 会自动创建 root 持久磁盘保存 root 文件系统。GCE_IMAGE_NAME 是您在上一步中创建的映象。
--metadata-from-file 指定本地元数据服务器为实例环境提供的元数据。使用这个标签可指定首次启动 Red Hat Enterprise Linux Atomic Host 实例时自动执行的脚步。详情请查看 第 25.7.3.3 节 “生成实例时执行自定义脚本”。请注意:需要 "user-data" 密钥,且无法使用自定义密钥替换,因为 Red Hat Enterprise Linux Atomic Host 实例的启动脚本是由 cloud-init 程序而不是 GCE 代理处理。

注意

运行该实例前会阻断这个命令。首次创建该实例时,必须引导并进行自动配置。这需要一些时间,并延迟实例登录。

25.7.3.3. 生成实例时执行自定义脚本

如上所述,可在创建实例时使用 *--metadata-from-file* 选项指定首次启动实例时要执行的自定义脚本。可以在该脚本中运行任一系统命令,因为这些命令需要 root 权限方可运行。例如:
--metadata-from-file startup-script=<your-startup-script>
使用以下内容调用 startup.sh 脚本:
#! /bin/sh
touch newfile
这行创建名为 "newfile" 的新文件。

注意

Red Hat Enterprise Linux Atomic Host 实例的启动脚本不是由 GCE 代理而是由 cloud-init 程序处理。因此不能在 --metadata-from-file 中使用自定义密钥。为 Red Hat Enterprise Linux Atomic Host 实例配置自定义脚本时必须使用user-data 密钥。
作为本地保存启动脚本的备用脚本,可将您的脚本上传到谷歌云存储中,然后使用 --metadata 选项访问该脚本。如果您的脚本长度超过 32,768 字节上限,则需要此操作。详情请查看 http://developers.google.com/compute/docs/howtos/startupscript#googlecloudstorage

25.7.4. 登录 Red Hat Enterprise Linux Atomic Host 实例

gcloud 工具有一个内置 ssh 命令,可让您使用该实例名称登录该实例。
请执行以下命令登录您的实例:
$ gcloud compute ssh cloud-user@my-atomic-instance
其中,*cloud-user* 是默认用户名。如果没有创建 SSH 密钥,则会提示您创建密码。详情请查看 第 25.7.4.1 节 “使用密码保护的 SSH 密钥”

注意

出于安全考虑,标准谷歌映象不提供作为 root 直接进行 SSH 连接的功能。该实例生成器及所有使用 --authorized_ssh_keys 标签或元数据 sshKeys 值添加的用户都自动成为该帐户的管理员,可运行 sudo,而无需任何密码。高级用户可修改 /etc/ssh/sshd_config 并长期 sshd 以更改此策略,但不建议这样做。

警告

GNOME 用户会在尝试通过 SSH 连接到 GCE 时偶尔会看到 "Agent admitted failure to sign using the key" 信息。这是由尝试使用错误 SSH 密钥的 GNOME 密钥环管理造成,详情请查看 第 25.7.8 节 “已知问题”
登录后,可在其他 Red Hat Enterprise Linux 机器中使用。您在实例中有 root 权限并全面控制所有方面。要成为 root,请执行:
cloud-user@my-atomic-instance$ sudo -i
如果需要退出您的实例,可执行以下命令:
cloud-user@my-atomic-instance$ exit
安装 Red Hat Enterprise Linux Atomic Host 后,就可以运行 Linux 容器。有关如何配置和维护 Red Hat Enterprise Linux Atomic Host 的详情,请查看《Red Hat Enterprise Linux Atomic Host 入门》一文。有关如何配置 Linux 容器的详情,请查看《在 Red Hat Enterprise Linux 7 和 Red Hat Enterprise Linux Atomic 中使用 Docker 容器入门》

25.7.4.1. 使用密码保护的 SSH 密钥

首次使用 SSH 登录实例时,gcloud 会在您的本地机器中生成一个 ssh 公钥/私钥对,并将公钥复制到您的项目中。需使用 ssh 将这些密钥记录到您的实例中。首次生成这些密钥时,gcutil 会要求您输入并确认密码短语:
WARNING: You don't have an ssh key for Google Compute Engine. Creating one now...
Enter passphrase (empty for no passphrase):
虽然可以将密码短语留为空白,但强烈建议您生成一个密码短语以保护您的 SSH 密钥。一般不会要求您输入此密码短语,但如果没有使用密码保护这些密钥,恶意用户就可能使用这些密钥进入您的实例。

25.7.5. 监控 Red Hat Enterprise Linux Atomic Host 实例

谷歌云 SDK 提供个很多监控实例参数的方法。要查看当前 gcloud 环境的常规信息,请运行:
$ gcloud info
执行 *describe* 命令查找有关具体实例的详情:
$ gcloud compute instances describe my-atomic-instance
canIpForward: false
creationTimestamp: '2014-11-11T02:15:58.372-08:00'
disks:
- autoDelete: true
  boot: true
  deviceName: persistent-disk-0
  index: 0
  interface: SCSI
  kind: compute#attachedDisk
  mode: READ_WRITE
  source: https://www.googleapis.com/compute/v1/projects/eighth-saga-761/zones/europe-west1-b/disks/my-atomic-instance2
  type: PERSISTENT
id: '6632858316955862880'
kind: compute#instance
machineType: https://www.googleapis.com/compute/v1/projects/eighth-saga-761/zones/europe-west1-b/machineTypes/n1-standard-1
metadata:
  fingerprint: owFsCDPRlkY=
  kind: compute#metadata
name: my-atomic-instance2
networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
	name: external-nat
	natIP: 23.251.142.75
	type: ONE_TO_ONE_NAT
  name: nic0
  network: https://www.googleapis.com/compute/v1/projects/eighth-saga-761/global/networks/default
  networkIP: 10.240.184.150
scheduling:
  automaticRestart: true
  onHostMaintenance: MIGRATE
selfLink: https://www.googleapis.com/compute/v1/projects/eighth-saga-761/zones/europe-west1-b/instances/my-atomic-instance2
serviceAccounts:
- email: 464767924601-compute@developer.gserviceaccount.com
  scopes:
  - https://www.googleapis.com/auth/devstorage.read_only
status: RUNNING
tags:
  fingerprint: 42WmSpB8rSM=
zone: https://www.googleapis.com/compute/v1/projects/eighth-saga-761/zones/europe-west1-b
要从您的 Red Hat Enterprise Linux Atomic Host 实例串口中获取数据,请运行:
$ gcloud compute instances get-serial-port-output my-atomic-instance
这个命令会返回 GCE 实例串口的输出结果。使用这个命令,不需要登录即可获取该实例的信息,这在诊断时非常有帮助。

25.7.5.1. 找出实例的外部 IP 地址

默认情况下,会为实例分配新的临时外部 IP 地址。可以在以上 *gcutil getinstance* 的输出结果中找到此信息。另外,还可以运行以下命令获得您所有实例的地址:
$ gcloud compute instances list
NAME                ZONE           MACHINE_TYPE  INTERNAL_IP    EXTERNAL_IP   STATUS
my-atomic-instance  us-central1-a  n1-standard-1 10.240.184.150 23.251.142.75 RUNNING

25.7.6. 创建防火墙规则

默认情况下,谷歌计算引擎会阻断实例与互联网之间的所有连接。要打开类似 httpd 服务的端口,则必须手动创建防火墙规则。每个项目都有三个默认防火墙:
  1. 允许 SSH 访问所有实例的防火墙。
  2. 允许同一网络中实例间所有通讯的防火墙。
  3. 允许 ICMP 流量进入网络中任意实例的防火墙。
例如:要允许连接到您实例的 HTTP 请求,请使用以下 gcutil 命令创建新防火墙:
$ gcloud compute firewall-rules create http-allow --allow tcp:80
执行以上命令后,您可以:
  1. 创建名为 http-allow 的新防火墙以便允许端口 80 tcp 流量
  2. 为该项目中的默认网络分配防火墙。
  3. 允许所有网络内部源和网络外部源(包括通过互联网)向服务器发出请求。我们没有为防火墙指定允许源,以便将允许所有源均可以向分配给默认网络的实例发出请求。
  4. 在该网络中的所有实例应用这个防火墙。因为没有为您的防火墙指定目标,则该防火墙会将此规则应用于该网络的所有实例中。
请运行以下命令查看您的防火墙信息:
$ gcloud compute firewall-rules list
NAME                   NETWORK SRC_RANGES    RULES                        SRC_TAGS TARGET_TAGS
default-allow-icmp     default 0.0.0.0/0     icmp
default-allow-internal default 10.240.0.0/16 tcp:1-65535,udp:1-65535,icmp
default-allow-rdp      default 0.0.0.0/0     tcp:3389
default-allow-ssh      default 0.0.0.0/0     tcp:22
http-allow             default 0.0.0.0/0     tcp:80
可使用适当的 addfirewall 标签将源和目标限制为具体调用程序和实例。请运行 *gcutil help addfirewall* 或查看 https://cloud.google.com/sdk/gcloud/reference/compute/firewall-rules/ 支持标签完整列表。
防火墙只规定某个实例的进入流量,而不能阻止外出数据包。与某个实例建立连接后,则会允许通过那个连接的双向流量。要防止某个实例发送外出数据包,请使用其他技术,比如 iptables

注意

默认情况下,如果 10 分钟内没有任何活动,GCE 会断开 TCP 与实例的连接。要防止此情况出现,请配置 TCP keep-alives 如 https://developers.google.com/compute/docs/troubleshooting#communicatewithinternet 所述。

25.7.7. 删除 Red Hat Enterprise Linux Atomic Host 实例

执行以下命令删除 my-atomic-instance
$ gcloud compute instances delete my-atomic-instance
删除实例前会提示您确认。删除实例只需要几秒钟。在确认对话框中,gcloud 中会提示您将删除磁盘,除非有另一个实例仍在使用该磁盘。

25.7.8. 已知问题

以下是具体用于 GCE 环境中的 rhel-atomic-host-20141111 映象的已知问题。
  1. 执行 `gcutil ssh`会显示 "Agent admitted failure to sign using the key" 出错信息。
    连接 GCE 实例时,GNOME keyring 管理偶尔会尝试使用错误 SSH 密钥。要临时解决这个问题,请在执行 gcutil 前运行以下命令:
    $ ssh-add ~/.ssh/google_compute_engine
与 Red Hat Enterprise Linux Atomic 有关的常见问题,请查看《Red Hat Enterprise Linux Atomic Host 入门》指南。