fleetctl 使用時の注意点

fleetctl を使用する際の注意点

fleetサービスはetcd(ver1/2)において稼働する、cluster / proxyに対して、systemdの操作を簡易的に行える大変素晴らしいサービスです!

ただある設定が抜けていたり、etcd(クラスタ)が不調な場合、fleetctlからsystemdの登録ができないなどの事象が発生します。

では早速、自分のPC中で行っている設定を公開いたします。

fleetctl 基本登録について

通常は以下のようなコマンドを叩いて、Unitサービスを登録していきます。

fleetctl --tunnel 192.168.0.10 submit nginx-web@1 # systemdファイルを配置しますよ!
fleetctl --tunnel 192.168.0.10 load nginx-web@1 # chkconfigでいう 起動時onの設定にしますよ!
fleetctl --tunnel 192.168.0.10 start nginx-web@1 # systemdを起動しますよ!

ここで出てくるのがtunnelのclusterのIP指定。これが煩わしく、私の.bash_profileには以下の設定を埋め込んでいます。

eval "$(rbenv init -)" #ssh-addコマンド失敗をさけるため、evalチェックします。
ssh-add ~/.ssh/id_rsa #鍵情報を先に読み込みます
export FLEETCTL_SSH_USERNAME=core #fleetctlを動作させる時のuser名を指定します。
export FLEETCTL_TUNNEL=192.168.0.10 #--tunnelのIPを指定します。

上記のように設定し、下記のように読み込めば、煩わしい設定が不要になります。

$ source ~/.bash_profile

fleetctl submit nginx-web@1
fleetctl load nginx-web@1
fleetctl start nginx-web@1

あら、タイピング量が減って楽ですね。

但し!気をつけないといけないのが、「export FLEETCTL_TUNNEL=192.168.0.10」として固定していること

万一、192.168.0.10のサービスが完全ダウンしてしまうと、fleetctlコマンドが効かなくなってしまいます。

その場合は改めて、clusterのほかIPアドレスをFLEETCTL_TUNNELの環境変数に登録してください。

前回記事ご紹介:

【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(完)

【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB

【CoreOS】cloud-config解説〜インストール

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)

【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(完)

CoreOSでKeepalivedを使った冗長化+負荷分散

f:id:s-shota:20180128211259j:plain

前回記事の続きになります

【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(1)

*今回は実際の8080ポートの構成設定を行っていきたいと思います。

バックエンドサーバー用Unitファイルの作成

注(1):実際にはnginx-web@1/2と2つのファイルを作成してください 注(2):X-FLEETのマシンIDはcore01/core04の固有のIDを指定してください

[Unit]
Description=NginxWEB
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=0
Restart=always
ExecStartPre=/usr/bin/docker pull nginx:1.7.10
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm %p
ExecStart=/usr/bin/docker run --rm \
  --name %p \
  --net host \
  -v /srv/lb/web.conf:/etc/nginx/nginx.conf:ro \
  -v /srv/share/html:/usr/share/nginx/html \
  nginx:1.7.10 \
  nginx
ExecStop=/usr/bin/docker stop -t 2 %p

[X-Fleet]
MachineID=5b1639bd3cc347cf8fac0b9f597369e3

Nginx用configファイル作成

daemon off;
worker_processes 4;

events {
  worker_connections 1024;
}

http {
  server {
    listen       *:8080;
    root /usr/share/nginx/html;
    location / {
        index   index.html;
    }
  }
}

nginx用configの配置及び、index.html作成

#core01サーバーへ配布
scp web.conf core@192.168.0.10:/home/core
ssh core@192.168.0.10
sudo cp -a web.conf /srv/lb/
sudo mkdir -p /srv/share/html
sudo echo "server 1" > /srv/share/html/index.html

#core04サーバーへ配布
scp web.conf core@192.168.0.11:/home/core
ssh core@192.168.0.11
sudo cp -a web.conf /srv/lb/
sudo mkdir -p /srv/share/html
sudo echo "server 2" > /srv/share/html/index.html

Unitファイル登録

fleetctl submit nginx-web@{1,2}
fleetctl load nginx-web@{1,2}
fleetctl start nginx-web@{1,2}

fleetctl list-units
UNIT            MACHINE             ACTIVE  SUB
keepalived@1.service    5b1639bd.../192.168.0.10    active  running
keepalived@2.service    6d283167.../192.168.0.11    active  running
nginx-lb@1.service  5b1639bd.../192.168.0.10    active  running
nginx-lb@2.service  6d283167.../192.168.0.11    active  running
nginx-web@1.service 5b1639bd.../192.168.0.10    active  running
nginx-web@2.service 6d283167.../192.168.0.11    active  running

バッチリサービス起動していることが確認できました。

http://192.168.0.50にアクセスしてみましょう!

f:id:s-shota:20180128211617p:plain

上記のようにサーバーの名称が出てくると思います。

ただし今回の設定はRRと呼ばれる1/2に振り分ける設定ではなくip-hashと呼ばれる、同一クライアントからは常に同じサーバーにアクセスする設定となります。

※前項参照:

ロードバランサ設定

upstream backend { ip_hash; server 192.168.0.10:8080 max_fails=3 fail_timeout=30s ; server 192.168.0.11:8080 max_fails=3 fail_timeout=30s ; server 127.0.0.1:8080 down; }

もし簡単に切り替え確認をしたい場合は、ip_hashを省いてリロードすると簡単にバランシングがされているかチェックできます!

続いてサーバーがダウンした場合のフェイルオーバーについて

現在、VIPをcoreos01のサーバーが保持しています。

ssh core@192.168.0.10
$ ip a
〜〜〜
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:79:c4:9d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.0.50/24 scope global secondary enp0s3 <=ここ
       valid_lft forever preferred_lft forever

core01のを強制的にダウンさせ、core04にVIPが移行されるか確認してみます。

イメージ図

f:id:s-shota:20180128211703j:plain

#core01の停止
ssh core@192.168.0.10
$ sudo shutdown -h now

#core04にアクセスしVIPが委譲されているか確認
ssh core@192.168.0.11
core@coreos-04 ~ $ ip a
〜〜〜
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:ad:bd:0f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.0.50/24 scope global secondary enp0s3
$ exit
#unitの確認
fleetctl --tunnel 192.168.0.11 list-units
UNIT            MACHINE             ACTIVE  SUB
keepalived@2.service    6d283167.../192.168.0.11    active  running
nginx-lb@2.service  6d283167.../192.168.0.11    active  running
nginx-web@2.service 6d283167.../192.168.0.11    active  running

ブラウザで表示確認

http://192.168.0.50/へアクセス!

f:id:s-shota:20180128211745p:plain

リロードしても「server 2」しかもちろん出ませんが、VIPも移行されサービスも冗長化できていることが確認できました。

※lbのタイムアウト設定はご自身の環境に合わせて変更して下さい。今回は30sの3回失敗した場合に、もう1台へ転送するという設定です

upstream backend { ip_hash; server 192.168.0.10:8080 max_fails=3 fail_timeout=30s ; server 192.168.0.11:8080 max_fails=3 fail_timeout=30s ; server 127.0.0.1:8080 down; }

前回記事ご紹介:

【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(完)

【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB

【CoreOS】cloud-config解説〜インストール

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)

【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(1)

CoreOSでKeepalivedを使った冗長化+負荷分散

f:id:s-shota:20180128211259j:plain

前回記事構成のcoreos01及びcoreos04を利用しています。

【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB

構成

(1)IPアドレス192.168.0.50のVIP(virtual ip)を持ったサーバーにアクセス (2)Docker-Nginx 80番ポートに着信 (3)80番ポート着信後Docker-Nignx-Proxyが、Docker-nginx-webのcoreos01/coreos04のそれぞれの8080ポートにNAT転送

Unitファイル(systemd / fleet)を作成

UNITファイルを作成 X-FLEETにはcoreos01/coreos04のそれぞれのmachine-idを入れましょう。

[Unit]
Description=NginxLB
After=docker.service
Requires=docker.service
ConditionPathExists=/srv/lb/lb.conf

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=0
Restart=always
ExecStartPre=/usr/bin/docker pull nginx:1.7.10
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm %p
ExecStart=/usr/bin/docker run --rm \
  --name %p \
  --net host \
  -v /srv/lb/lb.conf:/etc/nginx/nginx.conf:ro \
  nginx:1.7.10 \
  nginx
ExecStop=/usr/bin/docker stop -t 2 %p

[X-Fleet]
MachineID=5b1639bd3cc347cf8fac0b9f597369e3

lb.conf

server {
    listen       80;
    server_name  www.example.jp;
    proxy_set_header Host            $host;
    proxy_set_header X-Real-IP       $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;

    location / {
        proxy_pass http://backend;
    }
}

#ロードバランサ設定
upstream backend {
      ip_hash;
      server 192.168.0.10:8080 max_fails=3 fail_timeout=30s ;
      server 192.168.0.11:8080 max_fails=3 fail_timeout=30s ;
      server 127.0.0.1:8080  down;
}

あらかじめlb.confをばら撒きます

#coreos01
scp lb.conf core@192.168.0.10:/home/core/
ssh core@192.168.0.10
sudo mkdir -p /srv/lb/
sudo cp -a lb.conf /srv/lb/

#coreos04
scp lb.conf core@192.168.0.11:/home/core/
ssh core@192.168.0.11
sudo mkdir -p /srv/lb/
sudo cp -a lb.conf /srv/lb/

fleet(systemd)にUnitを登録します。

fleetctl submit nginx-lb@{1,2}
fleetctl load nginx-lb@{1,2}
fleetctl start nginx-lb@{1,2}

fleetctl list-units --full
UNIT            MACHINE                     ACTIVE  SUB
keepalived@1.service    5b1639bd3cc347cf8fac0b9f597369e3/192.168.0.10   active  running
keepalived@2.service    6d28316711484f039eca4408627fdb0c/192.168.0.11   active  running
nginx-lb@1.service  5b1639bd3cc347cf8fac0b9f597369e3/192.168.0.10   active  running
nginx-lb@2.service  6d28316711484f039eca4408627fdb0c/192.168.0.11   active  running

ここまで設定できれば、192.168.0.50にアクセスして[502 Bad Gateway]の表示がnginxから出力されると思います。

次回はバックエンドの8080ポート(実際のWEBサービス)の設定に移ります。

続き

【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(完)

前回記事ご紹介:

【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB

【CoreOS】cloud-config解説〜インストール

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)

【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB

Docker + keepalivedで簡単ロードバランサ

今回はfleet + docker + keepalivedで簡単ロードバランサを構築したいと思います。

まず、docker hubに上記構成を目指すimageがあるか探してきます。

lesaux/docker-keepalived

ロードバランサの組み合わせは以前構築したCoreOSの環境下で以下の構成で動かしたいと思います。

f:id:s-shota:20180128210641j:plain

※わかりやすい図が書けない・・・・

systemd用サービスファイルの作成

※ファイル名はkeepalived@1.serviceとkeepalived@2.service と2つ作成してください

[Unit]
Description=KeepALived
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=30min
RestartSec=30
Restart=always
ExecStartPre=/usr/bin/docker pull lesaux/keepalived
ExecStartPre=-/usr/bin/docker kill %p-%i
ExecStartPre=-/usr/bin/docker rm %p-%i
ExecStart=/usr/bin/docker run --rm \
  --name %p-%i \
  --net=host \
  -v /mnt/keepalived/keepalived.conf:/etc/keepalived/keepalived.conf \
  --privileged=true \
  -e affinity:container==%p-%i \
  -e VIP=192.168.0.50 \
  lesaux/keepalived
ExecStop=-/usr/bin/docker stop -t 20 %p-%i

[X-Fleet]
MachineID=5b1639bd3cc347cf8fac0b9f597369e3

※各マシンIDは以下のコマンドで取得可能です*

$ export FLEETCTL_SSH_USERNAME=core
$ export FLEETCTL_TUNNEL=192.168.0.10
$ fleetctl list-machines --full
MACHINE                 IP      METADATA
4fb30e282c004f1794df9e91e56b14fb    192.168.0.31    cabinet=two,role=workers
5b1639bd3cc347cf8fac0b9f597369e3    192.168.0.10    cabinet=one,role=services
703c849bcb924af5891ca5aae95e4e89    192.168.0.21    cabinet=two,role=workers
a6776a02935e4f01857364587836e338    192.168.0.20    cabinet=one,role=services
fffe34c5dcfa4aabbb1ba684101e521e    192.168.0.30    cabinet=one,role=services

coreos-01とcoreos-03のサーバーに下記、keepalived.confを設定

$ ssh core@192.168.0.10
$ sudo mkdir -p /mnt/keepalived
$ sudo vim /mnt/keepalived/keepalived.conf
! Configuration File for keepalived

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s3
    virtual_router_id 1
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.50/24 dev enp0s3
    }
    unicast_peer {
        192.168.0.10/24 dev enp0s3
        192.168.0.11/24 dev enp0s3
    }
}

$ ssh core@192.168.0.11
$ sudo mkdir -p /mnt/keepalived
$ sudo vim /mnt/keepalived/keepalived.conf
! Configuration File for keepalived

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s3
    virtual_router_id 1
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.50/24 dev enp0s3
    }
    unicast_peer {
        192.168.0.10/24 dev enp0s3
        192.168.0.11/24 dev enp0s3
    }
}

KeepalivedのDockerを登録

$ fleetctl submit keepalived@{1,2} #systemdへのファイル送信
$ fleetctl load keepalived@{1,2} #systemd自動起動の設定
$ fleetctl start keepalived@{1,2} #systemd起動
$ fleetctl list-units --full #cluster/worker内のsystemd状況確認
UNIT            MACHINE                     ACTIVE  SUB
keepalived@1.service    5b1639bd3cc347cf8fac0b9f597369e3/192.168.0.10   active  running
keepalived@2.service    6d28316711484f039eca4408627fdb0c/192.168.0.11   active  running

VIPがcoreos-01についているか

#coreos-01にアクセス
$ ssh core@192.168.0.10
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:79:c4:9d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.0.50/32 scope global enp0s3
       valid_lft forever preferred_lft forever

#coreos-04にアクセス
$ ssh core@192.168.0.11
$ ip a
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:ad:bd:0f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global enp0s3

#ローカルからping 192.168.0.50
ping 192.168.0.50
PING 192.168.0.50 (192.168.0.50): 56 data bytes
64 bytes from 192.168.0.50: icmp_seq=0 ttl=64 time=0.353 ms
64 bytes from 192.168.0.50: icmp_seq=1 ttl=64 time=0.440 ms
64 bytes from 192.168.0.50: icmp_seq=2 ttl=64 time=0.538 ms

coreos-01にVIP 192.168.0.50がついていてpingが帰ってくることも確認できました。

つづいて coreos-01をダウンさせてVIPがのフェイルオーバーチェック

※ついでにping がどの程度欠けるか見てみました。*

$ ssh core@192.168.0.10
$ sudo shutdown -h now
$ ssh core@192.168.0.11
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:ad:bd:0f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.0.50/24 scope global secondary enp0s3

バッチリ移動しています。

pingについてはフェイルオーバーまでに5%のping パケットロスが発生しました。 ※この件についてはkeepalived.confでさらに向上できそうです。

次はVIPを持ったサーバーがNginxのNAT LBとして動くまでの設定をしてみたいと思います。

参考

Docker-keepalived systemd.unit

前回記事ご紹介:

【CoreOS】cloud-config解説〜インストール

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)

【CoreOS】新規ディスク、パーティションの自動マウント

CoreOS自動マウントについて

CoreOSのcloud-config解説〜インストールにて紹介するのを忘れてたのでささっと


coreosにはfstabがないのでcloud-config.ymlにて設定をします。

DISKのフォーマット

以下コマンドでフォーマットすることができます。 ※対象DISKがsdbの場合

wipefs -f /dev/sdb
mkfs.ext4 -f /dev/sdb
#マウントディレクトリ作成
mkdir -p /mnt/data

新規Disk or パーティションのマウント方法

coreosセクションに以下の内容を記述していきます。

coreos:
  units:
    - name: mnt-data.mount
      command: start
      content: |
        [Mount]
        What=/dev/sdb
        Where=/mnt/data
        Type=ext4

前記事通り以下のcloud-config再読み込みをします

# cloud-configの再読み込み おまじないでuser_dataにコピー
sudo coreos-cloudinit -from-file=./cloud-config.yml
sudo cp cloud-config.yml /var/lib/coreos-install/user_data
sudo reboot

注意点

マウントをするときのnameには命名規則があり、[mnt-data.mount]は/mnt/dataのディレクトリをマウントしますよという内容になります。

上記の設定を誤ると、起動時のマウントに失敗します。

It's important to note that systemd requires mount units to be named after the "mount point directories they control". In our example above, we want our device mounted at /media/ephemeral so it must be named media-ephemeral.mount.

参考:

Mounting Storage

前回記事ご紹介:

【CoreOS】cloud-config解説〜インストール

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)

【CoreOS】cloud-config解説〜インストール

CoreOSのcloud-config解説〜インストール

今回はcloud-configの各セクションの解説〜インストール・再設定までをしていきたいと思います。

cloud-config.ymlとは・・・

CoreOSインストール及び設定ファイルを変更する際に必要な基本設定を記述した設定ファイルとなります。

主に取り扱うのがサーバーの環境変数NIC/IPの設定、etcdクラスタ設定、Unit(systemd)起動設定などが可能となっています。

CoreOSの本体設定ファイルは/var/lib/coreos-install/user_dataにymlデータとして格納されており、CoreOS起動時に「/usr/bin/coreos-cloudinit」が呼び出され

OEM版提供は https://coreos.com/os/docs/latest/notes-for-distributors.html に記載されているOSインストールイメージを各種クラウドVM向けにカスタマイズされた設定となります。 そのため、user_dataの保持位置が/usr/bin/coreos-cloudinitに記載されている oem版かどうかの振り分けで読み込みファイルが指定されています

では早速各セクションへ


cloud-config

冒頭1行目はかならず#cloud-config と明示的に記載してください。 インストール時にパースエラーが表示されます

#cloud-config

write_files及びhostname

環境変数の設定やインストール時にsystemdのconfig設定、systemdのファイルを生成することが可能なセクションとなっております。 write filesとある通り、実体のあるファイルを書き込みます。

hostname: coreos-dev #/etc/hostnameに書き込まれる値です

write_files:
- path: /etc/environment #環境変数への書き込み
  permissions: 0644 #パーミッションの設定
  content: | #パイプを入れることで改行を保持
    COREOS_PUBLIC_IPV4=192.168.0.xx #環境変数で呼び出したいサービスIPの指定
    COREOS_PRIVATE_IPV4=192.168.0.xx #バックヤードIPの指定

- path: /etc/skel/.bash_profile #user作成時、スケルトンの設定
  permissions: 0644
  content: |
    [[ -f ~/.bashrc ]] && . ~/.bashrc
    alias ll='ls -la --color=auto'

上記の通り、自分の設定したい項目が可能になります。 .vimrcや~/.git/configなどユーザーごとに書き込み可能です。


coreos:

coreos:セクションはOSの自動アップデート、Units(systemd)の設定を行う重要な要素となります。

coreos:
  update:
    reboot-strategy: 'off' #OSのアップデート時に自動起動するか
  units: #各種unitのサービス起動方法 systemctl由来の設定となります
  - name: etcd2.service
    command: start
  - name: fleet.service
    command: start
  - name: docker.service
    command: start
  - name: timezone.service
    command: start
  - name: 10-static.network
    runtime: false
    content: |
      [Match]
      Name=enp0s3 #NICの名称を指定

      [Network]
      Address=192.168.0.xx/24 #IPアドレスの指定及びサブネットマスク
      Gateway=192.168.0.1 #Gatewayの指定
      DNS=8.8.8.8 #DNS primaryの指定
      DNS=8.8.4.4 #DNS secondaryの指定

ssh_authorized_keys:
- ssh-rsa # coreユーザーに持たせる公開鍵の指定

*NICの指定はMacadressでもMatch対象にすることが可能です


users:

- name: coreuser
  passwd: $1$VIyj3wZe$HVVOEAc/H6a6YZGKCBWSD/ # パスワード認証。openssl passwdコマンドを叩いて実行した結果を貼り付け
  groups: #所属するgroupの指定
  - sudo
  - docker
  ssh-authorized-keys:
  - ssh-rsa #coreuserに持たせる公開鍵

簡単ですがcloud-config.ymlの作成は以上となります。 各セクションで作ったものは以下の形になります。

#cloud-config

hostname: coreos-dev

write_files:
- path: /etc/environment
  permissions: 0644
  content: |
    COREOS_PUBLIC_IPV4=192.168.0.xx
    COREOS_PRIVATE_IPV4=192.168.0.xx

- path: /etc/skel/.bash_profile
  permissions: 0644
  content: |
    [[ -f ~/.bashrc ]] && . ~/.bashrc
    alias ll='ls -la --color=auto'

coreos:
  update:
    reboot-strategy: 'off'
  units:
  - name: etcd2.service
    command: start
  - name: fleet.service
    command: start
  - name: docker.service
    command: start
  - name: timezone.service
    command: start
  - name: 10-static.network
    runtime: false
    content: |
      [Match]
      Name=enp0s3 #NICの名称を指定

      [Network]
      Address=192.168.0.xx/24 #IPアドレスの指定
      Gateway=192.168.0.1 #Gatewayの指定
      DNS=8.8.8.8 #DNS primaryの指定
      DNS=8.8.4.4 #DNS secondaryの指定

ssh_authorized_keys:
- ssh-rsa # coreユーザーに持たせる公開鍵の指定

- name: coreuser
  passwd: $1$VIyj3wZe$HVVOEAc/H6a6YZGKCBWSD/ # パスワード認証。openssl passwdコマンドを叩いて実行した結果を貼り付け
  groups: #所属するgroupの指定
  - sudo
  - docker
  ssh-authorized-keys:
  - ssh-rsa #coreuserに持たせる公開鍵

実際のインストール・編集コマンド

# cloud-configのシンタックスチェック
sudo coreos-cloudinit -validate=true -from-file=./cloud-config.yml

# 初回インストールの場合 デバイスはご自身の環境に合わせてください
sudo coreos-install -d /dev/sda -C stable -c ./cloud-config.yml
sudo reboot

# cloud-configの再読み込み おまじないでuser_dataにコピー
sudo coreos-cloudinit -from-file=./cloud-config.yml
sudo cp cloud-config.yml /var/lib/coreos-install/user_data
sudo reboot

設定ファイルの解説〜インストールは以上です。

次回は今回端折った、etcd2の細かい設定記述について踏み込んでいきたいと思います。

参考: Using Cloud-Config Notes for Distributors

前回記事ご紹介:

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)

CoreOSクラスタ構築 3台 + Worker 3台構成

前提

coreosクラスタ構築 3台構成 が出来ていること

目指す構成

f:id:s-shota:20180128194543p:plain

アドレッッシング

環境 hostname IPアドレス meta
MacbookAir 4GB hostserver xxx.xxx.xxx.xxx role=services,cabinet=one
virtualbox1 coreos-01 192.168.0.10 role=services,cabinet=one
virtualbox2 coreos-02 192.168.0.20 role=services,cabinet=one
virtualbox3 coreos-03 192.168.0.30 role=services,cabinet=one
virtualbox4 coreos-04 192.168.0.11 role=workers,cabinet=two
virtualbox5 coreos-05 192.168.0.21 role=workers,cabinet=two
virtualbox6 coreos-06 192.168.0.31 role=workers,cabinet=two

workの3台を新規に構築する

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)で作成したcoreosのイメージを3台分クローンを実施していきます。 ※クローンの方法については、前回記事を参照ください

workerにcloud-config.ymlの設定を行っていきます。

vim cloud-config.yml

#cloud-config

hostname: coreos-04

write_files:
- path: /etc/environment
  content: |
    COREOS_PUBLIC_IPV4=192.168.0.11
    COREOS_PRIVATE_IPV4=192.168.0.11

coreos:
  update:
    reboot-strategy: 'off'
  etcd2:
    proxy: on 
    name: coreos-04
    heartbeat-interval: 1000
    election-timeout: 5000
    listen-client-urls: http://0.0.0.0:2379
    initial-cluster: coreos-01=http://192.168.0.10:2380,coreos-02=http://192.168.0.20:2380,coreos-03=http://192.168.0.30:2380

  fleet:
    etcd_servers: http://127.0.0.1:2379
    public-ip: 192.168.0.11
    metadata: "role=workers,cabinet=two"
  flannel:
    interface: 192.168.0.11
  units:
  - name: etcd2.service
    command: start
  - name: fleet.service
    command: start
  - name: docker.service
    command: start
  - name: timezone.service
    command: start
    content: |
      [Unit]
      Description=timezone
      [Service]
      Type=oneshot
      RemainAfterExit=yes
      ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
  - name: 10-static.network
    runtime: false
    content: |
      [Match]
      Name=enp0s3

      [Network]
      Address=192.168.0.11/24
      DNS=8.8.8.8
      DNS=8.8.4.4

ssh_authorized_keys:
- ssh-rsa ※ご自身の公開鍵

users:
- name: coreuser
  passwd: $1$VIyj3wZe$HVVOEAc/H6a6YZGKCBWSD/
  groups:
  - sudo
  - docker
  ssh-authorized-keys:
  - ssh-rsa ※ご自身の公開鍵

上記を「アドレッシング」にあるhostnameとIPアドレスを合わせます。

cloud-config.ymlの読み込み実施

sudo coreos-cloudinit -from-file=./cloud-config.yml
sudo cp -a cloud-config.yml /var/lib/coreos-install/user_data
sudo reboot

※cloud-initコマンドで反映されない部分があるので、直接user_dataも書き換えておきます。

etcdctl cluster-healthの確認

etcdctl cluster-health
member 59d0611e956db7d1 is healthy: got healthy result from http://192.168.0.20:2379
member 6fb0d145a155e8ee is healthy: got healthy result from http://192.168.0.30:2379
member 7a0fb1a3031d4c79 is healthy: got healthy result from http://192.168.0.10:2379

上記の通り、クラスタ化されているIPが表示されていれば問題ありません。

fleetctlの確認

ssh core@192.168.0.10

fleetctl list-machines --full
5b1639bd3cc347cf8fac0b9f597369e3    192.168.0.10    cabinet=one,role=services
6d28316711484f039eca4408627fdb0c    192.168.0.11    cabinet=two,role=workers

・・・本来であればクラスタ及びworkerも全部出てくるはずなのですが。。。

調べてみると以下の記事が出てきました。

CoreOS 入門

また etcd の name 属性はユニークである必要があるので注意すること。 略するとマシンIDが使われる。マシンIDは /etc/machine_id で確認できる。マシンIDは環境を作成すると固定化されてしまうのでqemuのimgやvmを使いまわすとマシンIDが変わらず正しくクラスタが構築できないので注意すること。 rootをマウントして /etc/machine_id を削除し、再生成させるという方法もある。

なるほど。。。

というところで全てのサーバーにアクセスし、以下のコマンドを実行しました。

ssh 192.168.0.10
sudo mv /etc/machine-id /etc/machine-id.bk
sudo reboot
#この動作を全てのサーバーに

再度fleetctl の表示確認

fleetctl list-machines --full
MACHINE                 IP      METADATA
4fb30e282c004f1794df9e91e56b14fb    192.168.0.31    cabinet=two,role=workers
5b1639bd3cc347cf8fac0b9f597369e3    192.168.0.10    cabinet=one,role=services
6d28316711484f039eca4408627fdb0c    192.168.0.11    cabinet=two,role=workers
703c849bcb924af5891ca5aae95e4e89    192.168.0.21    cabinet=two,role=workers
a6776a02935e4f01857364587836e338    192.168.0.20    cabinet=one,role=services
fffe34c5dcfa4aabbb1ba684101e521e    192.168.0.30    cabinet=one,role=services

6台分のサーバーが表示されるようになりました!

これでCoreOS+etcd2+fleetを使用したクラスタ化の構成が完了しました。

今回vagarantを利用しなかったことについて

https://github.com/coreos/coreos-vagrant

にて既にvagrantのbox及びプロビジョニングファイルが配布されているのですが、当方にて以下の事象を確認しました。

1.$num_instanceを3で実行し、coreosをvagrant upで起動した場合問題なくクラスタの構成でUPされる 2.クラスタが正常になっているかの検証をするために、vagrant halt **で特定の端末を落とし、vagrant up | vagrant resumeで起動しても、IPアドレスが変わってしまう。※user_dataが保持されない 3.user_dataを作成するためにcloud-init/coreos-installしてもやはり揮発性があり検証が出来なかった。

私のvagrantの使い方がまずかったと思いますが、上記の事象がおきてしまったため断念しております。 ※ただし、vagrantで利用できればcloud-config.ymlに記載されているIPアドレスなどを$public_ipv4など変数に置き換えることもできますので大変便利です。

This was intended but we should probably revise it if folks are depending on the old contents of /etc/environment. For EC2/OpenStack instances we moved the detection of $public_ipv4 and $private_ipv4 directly into coreos-cloudinit so that it would work gracefully with both EC2-style metadata services and config drive. The old /usr/share/oem/bin/coreos-setup-environment shipped with those images hung if no metadata service was available, breaking config drive based OpenStack systems.

次回

本構成を基礎構成として、fleetctlを使ったUnit、dockerの配置方法やfailoverの内容に触れていきたいと思います。

参考

CoreOS入門