cloud-init でのカスタム・ネットワーク設定

インスタンスのカスタム・ネットワークの設定には cloud-init を 使うこともできます。

しかし、 cloud-init を使おうとする前に、これから使おうとするイメージ・ソース をどれにするかをまず決めてください。というのも、全てのイメージに cloud-init パッケージがインストールされているわけではないからです。 これを書いている時点では、 images.linuxcontainers.org で提供されている イメージには cloud-init パッケージはインストールされていません。そのため、 このガイドで説明されている設定オプションはどれも動かないでしょう。一方、 cloud-images.ubuntu.com で提供されているイメージには必要なパッケージが インストールされており、アーカイブのテンプレートディレクトリには 以下のファイル

  • cloud-init-meta.tpl
  • cloud-init-user.tpl
  • cloud-init-vendor.tpl
  • cloud-init-network.tpl

と、それ以外に cloud-init に無関係なファイルが置かれています。

cloud-images.ubuntu.com にあるイメージで提供されるテンプレートは metadata.yaml に以下のような設定を含んでいます。

/var/lib/cloud/seed/nocloud-net/network-config:
  when:
    - create
    - copy
  template: cloud-init-network.tpl

そのため、インスタンスを作成するかコピーすると、事前に定義したテンプレートから ネットワーク設定が新たに生成されます。

cloud-init は、network-config ファイルを使い、Ubuntu リリースに応じて ifupdown もしくは netplan のどちらかを使って、システム上の関連する設定 を行います。

デフォルトではインスタンスの eth0 インタフェースで DHCP クライアントを使うように なっています。

これを変更するためには設定ディクショナリ内の user.network-config キーを 使ってあなた自身のネットワーク設定を定義する必要があります。その設定が デフォルトの設定をオーバーライドするでしょう(これはテンプレートがそのように 構成されているためです)。

例えば、ある特定のネットワーク・インタフェースを静的 IPv4 アドレスを持ち、 カスタムのネームスペースを使うようにするには、以下のようにします。

config:
  user.network-config: |
    version: 1
    config:
      - type: physical
        name: eth1
        subnets:
          - type: static
            ipv4: true
            address: 10.10.101.20
            netmask: 255.255.255.0
            gateway: 10.10.101.1
            control: auto
      - type: nameserver
        address: 10.10.10.254

この結果、インスタンスの rootfs には以下のファイルが作られます。

  • /var/lib/cloud/seed/nocloud-net/network-config
  • /etc/network/interfaces.d/50-cloud-init.cfg (ifupdown を使う場合)
  • /etc/netplan/50-cloud-init.yaml (netplan を使う場合)

実装詳細

cloud-init によって /var/lib/cloud/seed/nocloud-net にある以下のファイルを使って インスタンスの設定を生成することができます。

  • user-data (必須)
  • meta-data (必須)
  • vendor-data (省略可能)
  • network-config (省略可能)

network-config ファイルはイメージに付属するテンプレートで提供されるデータを使って LXD によって書き出されます。これは metadata.yaml で調整されますが、 LXD に関する 限り、設定キーとテンプレートの内容はハードコーディングされていません。これは純粋に イメージのデータであり、必要なら変更できます。

"ubuntu:" イメージソースからのイメージで提供されるデフォルトの cloud-init-network.tpl は以下のようになっています。

{% if config\_get("user.network-config", "") == "" %}version: 1
config:
    - type: physical
      name: eth0
      subnets:
          - type: {% if config_get("user.network_mode", "") == "link-local" %}manual{% else %}dhcp{% endif %}
            control: auto{% else %}{{ config_get("user.network-config", "") }}{% endif %}

テンプレートの文法は pongo2 (訳注: https://github.com/flosch/pongo2 ) テンプレート・エンジンで使われているものです。 (訳注: LXD 用に) config_get と いうカスタム関数が定義されており、インスタンス設定から値を取得するのに使用できます。

そのようなテンプレート構造で利用可能なオプションには以下のものがあります。

  • eth0 インタフェースでデフォルトで DHCP を使用する
  • user.network_modelink-local に設定し、手動でネットワークを設定する
  • user.network-config を定義することにより cloud-init を設定する