ログ日記

作業ログと日記とメモ

debian9 の systemd-nspawnでdockerを動かす準備

デフォルトの設定では動かなかったので調べる。
https://wiki.archlinux.org/index.php/systemd-nspawn#Run_docker_in_systemd-nspawn


権限の設定が必要な模様。
それでもエラーが出たので、systemd-nspawnコマンドで起動してみる。
SystemCallFilterは --system-call-filter のオプションなんだろうなと思って検索しつつ。


https://man.kusakata.com/man/systemd-nspawn.1.html
オプションはある模様。
だけどdebian stretchでは認識されてない。



https://github.com/systemd/systemd/issues/5163
比較的最近の機能のようで、stretch-backports を探してみる。


https://packages.debian.org/stretch-backports/systemd-container
あった。このバージョンに上げたら使えるんだろうか。
apt-get -t stretch-backports で入れたり、戻したりした。
ダウングレードは

apt-get install systemd-container=232-25+deb9u4 \
  libnss-mymachines=232-25+deb9u4 \
  systemd=232-25+deb9u4 libsystemd0=232-25+deb9u4

のようにstretch-backportsでバージョンアップされた依存関係のあるものを個別にバージョン指定する必要がある?


docker run hello-world が動いたので
https://docs.ansible.com/ansible/latest/modules/apt_module.html
ansible の aptでdefault_releaseを指定してインストール。


これで docker in systemd-nspawn 完了。
あとはdocker-machineなりsshなりして systemd-nspawnのコンテナの中からdockerコンテナを立ち上げられるようになる。

VagrantとAnsibleを使って仮想マシンでsystemd-nspawnを使えるようにする

https://github.com/nishimura/vagrant-systemd-nspawn.git
ここに置いた。


Macでの環境。

Vagrant 2.0.1
ansible 2.6.4
VirtualBox 5.1.28
VMware Fusion 10.1.3


以前使ったときに

vagrant plugin install vagrant-hostsupdater
vagrant plugin install vagrant-vbguest

vagrant plugin install vagrant-persistent-storage

は実行済みとして。
固定環境で立ち上げるゲストが決まっているならhostsupdaterは入れずに手動でhost編集した方が楽かもしれない。


git clone https://github.com/nishimura/vagrant-systemd-nspawn.git host-debian9
cd host-debian9

source ./myenv-example-hostonly

cp ~/.ssh/id_rsa.pub data/authorized_keys

vagrant up


ansible-playbook -i playbook/env/hostonly/ -u root -v playbook/container-host.yml

ホストのネットワーク設定とゲストを(exampleの設定なら)三台作る。
run debootstrap のところでしばらく待つ。普通にコマンド実行したら逐次表示は出来ない…?


他のネットワークにブリッジする場合は myenv-example-vmware と playbook/env/vmware-bridge のような感じで。
VirtualBoxVMwareを繋ぐ場合、初期値でいいなら

cp ~/.ssh/id_rsa.pub data/authorized_keys
source myenv-example-vmware
vagrant up
ansible-playbook -i playbook/env/vmware-bridge/ -u root -v playbook/container-host.yml

これですぐ動くはず。


host01という名前を変えるなら

  • myenv*
  • playbook/env/*/inventory

を変える。



myenv-example-hostonly の初期値のままなら、 host01.local.test というVagrantのゲストOSをsystemd-nspawnのホストとして作り、その中に guest01.local.test、(guest02, guest03) を作る。
IP は 192.168.1.3 がホストで、末尾 11, 12, 13 がゲスト。
ホストオンリーネットワークの中でブリッジ接続していてMacから直接

ssh root@192.168.1.3
ssh root@192.168.1.11

などで入れる。


systemd-nspawnのゲストOSを入れる領域は別途ディスクを追加して Btrfs でフォーマットしている。


何度も実行しているとよく忘れるんだけど、authorized_keysをコピーし忘れてエラーになった場合は、dataに置いてから

vagrant provision

で該当箇所だけ実行。停止やリスタートの必要は無い。


ゲストを増やす場合はenvの中の変数 guests を増やして

ansible-playbook -i playbook/env/vmware-bridge/ -u root -v playbook/container-host.yml --tags=guests

を実行。差分だけ反映された感じのログが出ていればOK。
rootで入っているので所々で警告は出る。


初期状態のOSなので、何かアプリを入れたりするときは別途でそれ用のAnsible設定を使えばいいかなという感じ。




自分の場合は作業用PCがDebianなので、Vagrantの部分を飛ばして

source myenv-example-localvm
cp ~/.ssh/id_rsa.pub data/authorized_keys
ansible-playbook -i playbook/env/localvm -u root -v playbook/container-host.yml

という感じでssh root@localhost で入って同様の操作をしている。
ホストの /etc/hosts は変更しないけど /etc/systemd/network は変わるので、既にsystemd-networkd で何かしら設定をしている場合は消えないように現状の設定に合わせる必要がある。




Vagrantvmごと何度も消したり立ち上げたりするとめっちゃ時間がかかったので、仮想マシンからコンテナに移る流れは分かるような気がした。
あとネットワーク設定にハマるとなかなか抜け出せない。systemdに変わってるから予備知識ゼロだったしね…。



参考:
systemd-networkd - ArchWiki


qiita.com
qiita.com



9/27 追記:

guests:
  - { name: guest01, ip: 192.168.1.11/24 }
  - { name: guest02, ip: 192.168.1.12/24 }
  - { name: guest03, ip: 192.168.1.13/24 }

こういう変数があったとして、このセットがVagrant用、VMware用、ローカル用、みたいな感じで複数ある。
大抵の場合は変更しないのでデフォルト値として共有したい。

これを

guests:
  - { name: web, ip: 192.168.1.11/24 }
  - { name: app, ip: 192.168.1.12/24 }
  - { name: db, ip: 192.168.1.13/24 }

設定が進んでくるとこのセットを全て変えたりする。
このとき、IPは同じなので

guests:
  - { name: web }
  - { name: app }
  - { name: db }

名前だけ変えたい。


また、Vagrant用とVMware用の設定が異なったとして、このときは名前が同じなので

guests:
  - { ip: 192.168.11.11/24 }
  - { ip: 192.168.11.12/24 }
  - { ip: 192.168.11.13/24 }

ipだけ変えたい。


それから、既存環境と干渉するってときに

guests:
  - - { ip: 192.168.11.111/24 }
  - 

一部だけ変えたい。


変えた後も、個別設定した箇所以外は共通設定の変更が反映されるようにしたい。
プログラムならすぐなんだけどAnsibleではどうやるのか全然思い付かなくて今迷ってる。
group_varsに書くのかinventoryに書くのかincludeで読むのか、また設定ファイルの中の配列や連想配列の一部だけ書き換えるのはどうすればいいのか、わからん…。

CourseraのGoogleのやつを一つやった

www.coursera.org

すぐできるかと思ったらめっちゃ時間かかった…。
7〜8時間のうち休憩100分程度、一週間分と考えたらこんなもんなのか。


最初は律儀にビデオ見てたけど、しんどいから字幕を翻訳して読みつつ、ビデオはスライドのようにして見てた。
実際にGCPにログインして操作出来るのは良い。良いが…めっちゃ遅い。
ちょっとした操作に1分以上とか平気で待つ。その間にちょっと離席してたらタイムアウトでセッション切れるし、コマンドの途中で切れたりしたらなんか中途半端になったから最初からやりなおしたりしたし。
あとなんか指定通りやってもエラーになることがあった。

普段使いのデスクトップPCがDebian Stretchで、GCPも同じだったので他の人よりはやりやすかったと思うのだが。



最初の方のテストはビデオ見なくてもわかったから飛ばして最後の方のテストだけやってみたらほとんど間違えたりした。
なので大人しく順番に。
明日もう一度やったら半分くらい忘れてそう。



元々e-learningとか好きじゃなくて、ビデオなら更にゆっくりペースになるので完全に向いてなかった。
先に手を動かしてから後で解説読んで、もう一度手を動かすのが自分的なベスト。

あとよく考えたら当然だけれどクラウドとか機械学習とかの一般的なことじゃなくてGoogleサービスについてだった。
一つ終わって、ふーんって感じで、身に付いた感はまったくない。普通の講義ってこんなんだったか。
あと Qwiklabs の登録、新規でgmailで登録しようとしたら既に居ますってエラーになってGoogleログインでやった。30クレジットないんだけどどうなってるんだろう。
残りのコースをどうするか…。

ImageMagickで縦横比を維持したまま画像をリサイズして左右に余白を追加する

convertのオプションが多くて複数回実行する必要があるみたいな記事もあるけど
http://imagemagick.org/discourse-server/viewtopic.php?t=11525

convert -size 400x600 xc:white page.jpgs -gravity center -composite output.jpgs

これを少し変えて

convert -resize 400x600 xc:white page.jpgs -gravity center -composite output.jpgs

でいけた。

CSRFのトークンはワンタイム?

今更な話なんだけど、トークンってワンタイムの必要あるんだっけ?と思ったのでメモ。


http://takagi-hiromitsu.jp/diary/20060409.html
https://blog.tokumaru.org/2011/01/anti-csrf-onetime-token-failure-case.html
この辺が話題になってたのって10年〜5年前か…そりゃ忘れる。


2016年更新版
https://qiita.com/mpyw/items/8f8989f8575159ce95fc

Debian stretch に Kubernetes をインストール

Docker Swarm は普通に動くようだったので Kubernetesも試した。


エラーでなかなか進まず色々試してたら汚れてきたのでカッとなってVMwareで新しい環境を作ってテストした。
テストだからって普段使いのLinuxで試さない方が良さそう。


taskselで全部のチェックを外してインストールした状態からスタート。

apt-get install ssh vim

ホスト名は k8smaster.k8s.dev で。


VMware fusionだとネットワークアダプタの詳細でMACアドレスを確認しつつ

sudo vi /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf
host vmnet-k8smaster {
        hardware ethernet 00:0C:29:CC:1D:30;
        fixed-address 172.16.87.11;
}

で固定IPにしておくとやりやすい。VMwareは一度タスクキルする。

/Applications/VMware Fusion.app/Contents/Library/vmrun -T fusion start \
  ~/Documents/Virtual\ Machines.localized/debian9.vmwarevm/debian9.vmx nogui

これでウィンドウ無しで起動できるけど面倒なので閉じるときのダイアログでバックグラウンド実行でもいいかなって。


初期設定など。

update-alternatives --config editor
# usr/bin/vim.basic を選択

apt install sudo
visudo

# 一般ユーザー ALL=NOPASSWD: ALL
sudo -i
ssh-keygen

cp .ssh/id_rsa.pub .ssh/authorized_keys
ssh k8smaster.k8s.dev

ローカルでも sshFQDN でログインできる必要がある?なんか認証エラーになったので。


http://d.hatena.ne.jp/n314/20180820/1534731160
前回の記事の通りやってDockerを入れる。最新版にk8sが対応していないみたいだけど多分大丈夫っぽいnoteがあったので最新版で。


スワップは使えないのでオフ。

cat /proc/swaps
swapoff -a
vi /etc/fstab

自動インストールしたけどswapオフにしてパーティション切れば良かった。


https://kubernetes.io/docs/setup/independent/install-kubeadm/

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

ちょっとしたアップデートでガラッと動作が変わるからholdしろってことだよね多分。

kubeadm init --pod-network-cidr=10.244.0.0/16

完了メッセージは後で実行する。
rootじゃなくて良い作業は一般ユーザーで実行する。と言ってもパスワード無しでrootになれる必要あるよね。どういう思想なんだろう。


export KUBECONFIG=/etc/kubernetes/admin.conf
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

/etc/cni/net.d/ にファイルが作られる。
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/


これ以上はアーキテクチャとか仕組みとかが分かってないとマニュアルコピペじゃ無理そうなので後でやる。クラウド環境をローカルで試そうと思ったらVMwareのゲストめっちゃ立ち上げないとダメだよね。みんな富豪的に全部クラウドでやってるのかな。こういう環境が必要な人は短期間インスタンス立ち上げるぐらいの費用は誤差なのか。
ここまでで docker ps で 16コンテナ立ち上がってるんだけど…。そのうちマイクロカーネルが流行らずモノリシックカーネルに変わってきている的なことにならないんだろうか。


削除メモ。
apt remove --purge kubelet kubeadm kubectl kubernetes-cni で消えないファイルを消す。

rm -rf /var/lib/etcd
rm -rf /etc/kubernetes/

rm -rf /var/lib/kubelet/
rm -rf /etc/cni/

Debian stretch で docker-machine

docker-machineのコマンドではdockerを自動インストールできない。
こういうことを自動的にやってもらうためにdocker-machineを使うと思っていたんだが…。


https://docs.docker.com/install/linux/docker-ce/debian/

apt-get install \
     apt-transport-https \
     ca-certificates \
     curl \
     gnupg2 \
     software-properties-common


souces.list.d/docker.list 追加

deb [arch=amd64] https://download.docker.com/linux/debian stretch stable

またはコマンドで。

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
apt-get update
apt-get install docker-ce

各ホストにdocker-ceをインストールした後なら docker-machine create できる。


ローカルにもdocker-ceを入れる場合はローカルからローカルへのsshの設定もしておく。