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
Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)
【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(完)
CoreOSでKeepalivedを使った冗長化+負荷分散
前回記事の続きになります
【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にアクセスしてみましょう!
上記のようにサーバーの名称が出てくると思います。
ただし今回の設定は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が移行されるか確認してみます。
イメージ図
#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/へアクセス!
リロードしても「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
Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)
【CoreOS】冗長化構成 Keepalived+NginxLB+NginxWEB(1)
CoreOSでKeepalivedを使った冗長化+負荷分散
前回記事構成の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
Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)
【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB
Docker + keepalivedで簡単ロードバランサ
今回はfleet + docker + keepalivedで簡単ロードバランサを構築したいと思います。
まず、docker hubに上記構成を目指すimageがあるか探してきます。
ロードバランサの組み合わせは以前構築したCoreOSの環境下で以下の構成で動かしたいと思います。
※わかりやすい図が書けない・・・・
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
前回記事ご紹介:
Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)
【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.
参考:
前回記事ご紹介:
Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)
【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 の基本設定(完)
CoreOSクラスタ構築 3台 + Worker 3台構成
前提
coreosクラスタ構築 3台構成 が出来ていること
目指す構成
アドレッッシング
環境 | 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も全部出てくるはずなのですが。。。
調べてみると以下の記事が出てきました。
また 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の内容に触れていきたいと思います。