はじめに
何周遅れなのかわかりませんが、自宅の環境をDocker swarmに置き換えることにしました。
今さら手を出すのであれば、Kubernetes (k8s) の方が良いのでしょうが、とりあえず管理方法などを学ぶ点でこちらにしました。
※イラストが雑くてすみません。
公式ドキュメントは以下にあり、基本的にこのドキュメントを読むだけで大丈夫だと思います。
うちでは以下のようになりました。
確認環境:
$ docker version
Client:
Version: 18.09.1
API version: 1.39
Go version: go1.10.6
Git commit: 4c52b90
Built: Wed Jan 9 19:42:36 2019
OS/Arch: linux/arm64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.1
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 4c52b90
Built: Wed Jan 9 19:03:16 2019
OS/Arch: linux/arm64
Experimental: false
$ docker node list
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
vjh474a30s6upsit2fz5s5zts * dns02 Ready Active Leader 18.09.1
s3m37xdq15bt2rnoudzdkousg k8s-work1 Ready Active 18.09.1
q33fsja53dni46wnf77lyr6so k8s-work2 Ready Active 18.09.1
eruk3dzsej4q2kw0628yudqah k8s-work3 Ready Active 18.09.1
k1zchrvf4ie6l6s86uhxduwho k8s-work4 Ready Active 18.09.1
host名にk8sが含まれているのは、以前にk8sを構築しようとしたときの名残です。
以前から自宅で検証しているDNS関連をこちらに移しています。
workerについては、自宅で遊んでいる以下のArm SBCをpoolしている形になります。これにManagerはRock64を足して5台のリソースプールで稼働しています。
実際の構成
- Libre Computer Board ROC-RK3328-CC (Renegade)
- Banana Pi M64
- Odroid C2
- Libre Computer Board ALL-H3-CC (Tritium)
サービス自体も以前から検証で作成しているcontainerをそのまま乗せ換える形です。
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
8vaswda0y1mr portainer-agent_agent global 5/5 portainer/agent:latest
kas37rlk74pd stack_bind_bind replicated 5/5 kometchtech/bind:latest *:9853->53/tcp, *:9853->53/udp
ktu1d70jzjzq stack_coredns_coredns replicated 5/5 kometchtech/coredns:latest *:9653->53/tcp, *:9653->53/udp
ku2llhfutyig stack_dnscrypt-proxy_dnscrypt-proxy replicated 5/5 kometchtech/dnscrypt-proxy:latest *:9953->53/tcp, *:9953->53/udp
7fkspkdrvw5n stack_dnsdist_dnsdist global 5/5 kometchtech/dnsdist:latest *:53->53/tcp, *:53->53/udp
yjr8d3coc4fq stack_knot_knot global 5/5 kometchtech/knot:latest *:10153->53/tcp, *:10153->53/udp
uggls3ilw9z1 stack_kresd_kresd replicated 0/1 kometchtech/kresd:latest *:9553->53/tcp, *:9553->53/udp
t0fdwzv6ykur stack_nsd_nsd global 5/5 kometchtech/nsd:latest *:10053->53/tcp, *:10053->53/udp
102i7mr9rraa stack_pdnsrec_pdns_rec replicated 5/5 kometchtech/pdnsrec:latest *:9453->53/tcp, *:9453->53/udp
mzs0tw5dj0an stack_stubby_stubby replicated 5/5 kometchtech/stubby:latest *:8053->53/tcp, *:8053->53/udp
gd4irpvfz6l0 stack_unbound_unbound replicated 5/5 kometchtech/unbound:latest *:9753->53/tcp, *:9753->53/udp
これらを別のストレージサーバから、設定ディレクトリだけをNFSマウントする形で共有するようにしています。
最初、docker volume create
すれば、スケールしたcontainerすべてからマウントできるのか勘違いしていました・・・(よくよく考えたら、docker volume create
されるのは、そのコマンドを発行したホストだけで有効になりますもんね・・・)。
この辺りは、docker networkのoverlayと混同していました。
また、以前と同じようにDocker networkでIPv6を有効にする方法も、少し悩んでいました。
こちらもDocker stack deploy
するとき、対象になるDocker compose fileのバージョンが3以降なんですね・・・ Docker composeでIPv6の設定が有効になるのは、Docker composeの2系までなので、そのままではデプロイ出来ないという・・・
こちらも予めIPv6を有効にしたoverlayネットワークを作成したうえで、docker stack deploy
するcontainerを、そのネットワークに所属させる、という手段で解決しました。
今はManagerノードが1台だけなので、現在、secondaryで独立しているサーバをManagerノードに追加して、負荷分散をさせるかどうかを検討中です。
あとは、業務で関係するHPC向けのスケジューラなどをdockerを使って構築できないか、を検討中です。