如何设置上DigitalOcean一个CoreOS集群

如果您在您的基础设施使用CoreOS计划,你将要设立的第一件事是CoreOS集群。为了CoreOS机以形成簇,其etcd2实例必须连接。在本教程中,我们将给予一步一步的指导,...

介绍

如果您计划在基础架构中使用CoreOS,那么您首先需要设置的是CoreOS集群。 为了CoreOS机以形成簇,其etcd2实例必须连接。 在本教程中,我们将给出分步说明,以便在DigitalOcean上快速创建一个3节点CoreOS集群。

先决条件

如果你不熟悉与CoreOS是建立在(Docker,etcd2,和车队)的组件,强烈建议您阅读到CoreOS系统组件介绍 您将要特别注意覆盖部分etcd2 ,因为这部分是集群发现过程是至关重要的。

SSH密钥

您创建的每个CoreOS服务器在其创建过程中都需要至少安装一个SSH公钥。 关键(S)将被安装到core用户的授权密钥文件中,您将需要相应的私钥(S)登录到您的CoreOS服务器。

:如果您还没有与DigitalOcean帐户关联的SSH密钥,通过下面的步骤本教程的1-3,现在这样做如何使用DigitalOceanDropletSSH密钥 然后,您将要通过运行以下命令将您的私钥添加到客户端计算机上的SSH代理:

ssh-add

欲了解更多有关此步骤,请参阅这篇文章

DigitalOcean个人访问令牌

如果您在使用DigitalOcean API来创建你CoreOS机计划,请参阅本教程 ,了解如何生成和使用个人访问令牌有写权限的信息。

现在你已经有了前提条件,让我们开始构建我们的CoreOS集群!

生成新的发现URL

设置新的CoreOS集群的第一步是生成一个新的发现URL,一个存储对等CoreOS地址和元数据的唯一地址。 要做到这一点,最简单的方法是使用https://discovery.etcd.io ,免费的搜索服务。 新发现的URL可以通过访问生成https://discovery.etcd.io/new在Web浏览器或通过运行以下curl的命令:

curl -w "\n" "https://discovery.etcd.io/new?size=3"

任一方法将返回一个新的,唯一的发现URL,看起来像下面(突出部分将是一个独特的令牌):

https://discovery.etcd.io/5c1574906b3502aa9d8dc43c1b185775

您将使用生成的发现URL创建新的CoreOS集群。 同样发现URL必须在指定etcd2要添加到特定CoreOS集群的各服务器的云配置的部分。

现在,我们有一个发现URL,让我们来看看如何创建cloud-config使用它的文件。

写一个Cloud-Config文件

CoreOS使用了一个名为cloud-config ,它允许你声明定制的网络配置,systemd单位和其他操作系统级的项目。 此文件是以YAML格式编写的,它使用缩进来表示数据层次结构。 cloud-config时,机器启动文件处理,并提供了一种与配置的机器etcd2设置,将允许他们发现,他们应该加入集群。

我们将介绍如何编写一个最小的cloud-config让工作CoreOS集群启动和运行。 对于项目的完整列表,可以与云配置进行配置,检查出的官方文档 他们还提供了一个有用的工具,它可以检查你的云-config文件的语法, 云配置验证

最小云配置

如前所述,集群中每个CoreOS计算机的对等地址与发现URL一起存储。 因此,集群中的每台机器必须使用相同的URL发现并在其自己的IP地址,通过它在哪里etcd2服务即可到达。 这些将在指定的cloud-configetcd2部,并在下面的代码块被示出。

您还需要指定一个units部分,这将启动etcd2fleet所必需的工作CoreOS集群服务。

这是一个基本的cloud-config可与您的CoreOS机器被用来制造新的群集(替代的价值的文件discovery与先前生成的发现URL):

#cloud-config

coreos:
  etcd2:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new:
    discovery: https://discovery.etcd.io/<discovery_token>
    # multi-region deployments, multi-cloud deployments, and Droplets without
    # private networking need to use $public_ipv4:
    advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
    initial-advertise-peer-urls: http://$private_ipv4:2380
    # listen on the official ports 2379, 2380 and one legacy port 4001:
    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
    listen-peer-urls: http://$private_ipv4:2380
  fleet:
    public-ip: $private_ipv4   # used for fleetctl ssh command
  units:
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start

注: #cloud-config必需的线条。 $private_ipv4$public_ipv4替代变量在云的配置完全支持DigitalOcean -这些变量将与您的新VPS的实际相应的IP地址替换。 此外, fleet ,如果你不打算使用部分不需要fleetctl ssh命令。

这种cloud-config脚本可用于建立可用于测试目的的基本CoreOS; 不幸的是,它不是很安全。 :对于较严重的设置,应按照本教程建立一个安全CoreOS集群如何使用TLS / SSL和防火墙规则保护您的CoreOS集群

创建CoreOS集群

现在,你知道你的cloud-config在新CoreOS集群对每一台机器的文件将包括,让我们创建CoreOS集群。 因为Droplets可以通过DigitalOcean控制面板或API创建,我们将向您展示如何使用这两种方法创建您的CoreOS集群。

数字海洋控制面板

首先,访问DigitalOcean控制面板 ,然后点击创建按钮Droplet

接下来,选择CoreOS作为您的Linux发行版,然后选择要使用的通道(稳定,测试或Alpha)。

然后选择所需的Droplet大小。 如果你做基本测试,更小的尺寸是好的。

接下来,选择首选的数据中心区域。

选择附加选项 ,请选择专用网络用户数据 复制和粘贴的cloud-config脚本到用户数据文本字段。 它应该看起来像这样:

用户数据

接下来,选择至少一个要用于登录到Droplet的SSH密钥。

根据完成并创建部分, 创建至少三Droplet并指定其主机名。 在我们的例子中,我们会打电话给他们coreos-01,coreos-02,coreos-03:

创建3个Droplet

最后,点击创建按钮创建将成为您CoreOS集群的Droplet。

要了解更多关于Droplet创建过程中,使用DigitalOcean控制面板,请参阅本指南

数字海洋API

如果使用DigitalOcean API来创建你的CoreOSDroplet,你可以指定你的cloud-config通过user_data在Droplet创作POST请求的参数-只需粘贴在那里整个脚本。

让我们假设,我们要创建三个1 GBDroplet命名coreos-01,coreos-02,而且,coreos-03与专用网络,在NYC3数据中心使用CoreOS稳定通道图像,和cloud-config文件前面所示。 下面是一个例子curl的命令,你可以运行使用DigitalOcean API来创建它:

curl -X POST "https://api.digitalocean.com/v2/droplets" \
      -d'{"names":["coreos-01","coreos-02","coreos-03"],"region":"nyc3","size":"1GB","private_networking":true,"image":"coreos-stable","user_data":
"#cloud-config

coreos:
  etcd2:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new:
    discovery: https://discovery.etcd.io/<discovery_token>
    # multi-region deployments, multi-cloud deployments, and Droplets without
    # private networking need to use $public_ipv4:
    advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
    initial-advertise-peer-urls: http://$private_ipv4:2380
    # listen on the official ports 2379, 2380 and one legacy port 4001:
    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
    listen-peer-urls: http://$private_ipv4:2380
  fleet:
    public-ip: $private_ipv4   # used for fleetctl ssh command
  units:
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start",
      "ssh_keys":[ <SSH Key ID(s)> ]}' \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json"

注意:这就像一个正常的多Droplet创建请求,增加的例子的cloud-config通过传递user_data参数。

您必须替换为你的SSH密钥ID(S)或指纹(S) <SSH Key ID(s)> ,并确保$TOKEN设置为你读一个/写DigitalOcean个人的访问令牌。

使用适当的替换运行此命令后,将创建您的3节点CoreOS集群。

有关使用API的更多信息,请参见本教程

验证群集

要验证我们的3机器集群是否正确形成,我们必须SSH到其中一个集群成员。

登录到coreos-01机为core通过SSH用户,并使用-A选项转发你的SSH代理。 请记住用公共IP地址替换:

ssh -A core@coreos-01_public_IP

在命令提示符下,输入以下fleetctl命令显示集群的所有成员:

fleetctl list-machines

您应该看到群集中的所有在线的机器,可识别的名单由各自peer-addr的IP地址。 下面是一个输出示例:

MACHINE     IP      METADATA
59b2fffd... 10.131.29.141   -
853b0df3... 10.131.63.121   -
cd64a2e3... 10.131.63.120   -

如果你看到所有你所创建的机器,所有的人都知道对方经由etcd2 ,你的集群已形成正确的!

警告:一定要建立iptables来限制你的CoreOS集群内访问端口4001的机器,集群建立后。 这将防止外部未经授权的用户控制您的CoreOS计算机。 供生产使用,你应该认真考虑以下的步骤本指南,以确保一个CoreOS集群TLS / SSL证书和防火墙规则

添加新计算机

如果您想新机添加到现有CoreOS集群,简单地创建使用相同的一个新的Dropletcloud-config (和发现URL)。 您的新CoreOS机器将自动加入现有群集。

如果您忘记了您使用的发现URL,您可以在集群的其中一个成员上查找。 使用下面grep在现有的一台机器的命令:

grep DISCOVERY /run/systemd/system/etcd2.service.d/20-cloudinit.conf

您将看到一行包含原始发现网址,如下所示:

Environment="ETCD_DISCOVERY=https://discovery.etcd.io/575302f03f4fb2db82e81ea2abca55e9"

结论

您的基本CoreOS集群已设置,现在您可以继续使用它进行测试! 如果您正在寻求建立一个安全的CoreOS群集,请按照本教程: 如何使用TLS / SSL和防火墙规则保护您的CoreOS集群

本系列的其余教程将向您展示有关CoreOS的更多信息,以及如何使用Docker容器和服务发现与您的CoreOS集群。