2021/01/08
今回できたこと
K3sエージェントをコピーしたイメージから作成する。
Dockerイメージを作成し、dockerhubで共有し、作業マシンで利用する手順を行う。
未解決
単純な例で、K3sクラスタの動作を確認する。
Dockerfileから/etc/以下の設定を更新する。
今後の作業
K3sクラスタでの簡単な例が動作しない原因を調べる。
Dockerfileでのイメージ作成時に/etc/に設定を行う方法を調べる。
イメージ内部で作業して、commitで新たなイメージを作る方法も試してみる。
お約束
定例作業
参考文献
K3sエージェント複製用環境の設定
エージェント環境の複製用のSDを作成するにあたって、もう一度複製元環境の設定を見直す。
書き込みがそれなりにあり、再起動時に消えても構わない/tmp/,/var/tmp/,/var/logをメモリディスク上に確保する。
以下の設定をそれぞれのファイルに記述する。
code:/etc/fstab
tmpfs /tmp tmpfs defaults,size=1G,noatime,mode=1777 0 0
tmpfs /var/tmp tmpfs defaults,size=16m,noatime,mode=1777 0 0
tmpfs /var/log tmpfs defaults,size=32m,noatime,mode=0755 0 0
code:/etc/rc.local
### Protect SD with tmpfs
# for my log
touch /var/log/sys_stat.log
chown pi /var/log/sys_stat.log
# for rsyslog
mkdir -p /var/log/apt
mkdir -p /var/log/fsck
mkdir -p /var/log/ntpstats
mkdir -p /var/log/samba
chmod 750 /var/log/samba
# chown ntp:ntp /var/log/ntpstats
chown root:adm /var/log/samba
touch /var/log/btmp
touch /var/log/lastlog
touch /var/log/wtmp
chmod 600 /var/log/btmp
chmod 664 /var/log/lastlog
chmod 664 /var/log/wtmp
chown root:utmp /var/log/btmp
chown root:utmp /var/log/lastlog
chown root:utmp /var/log/wtmp
ログの出力も抑制する。
code:/etc/rsyslog.conf.diff
--- /etc/rsyslog.conf.20210108 2021-01-08 08:54:42.199494284 +0900
+++ /etc/rsyslog.conf 2021-01-08 08:55:51.289659725 +0900
@@ -58,33 +58,33 @@
#
# First some standard log files. Log by facility.
#
-auth,authpriv.* /var/log/auth.log
-*.*;auth,authpriv.none -/var/log/syslog
+#auth,authpriv.* /var/log/auth.log
+#*.*;auth,authpriv.none -/var/log/syslog
-daemon.* -/var/log/daemon.log
-kern.* -/var/log/kern.log
-lpr.* -/var/log/lpr.log
-mail.* -/var/log/mail.log
-user.* -/var/log/user.log
+#daemon.* -/var/log/daemon.log
+#kern.* -/var/log/kern.log
+#lpr.* -/var/log/lpr.log
+#mail.* -/var/log/mail.log
+#user.* -/var/log/user.log
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
-mail.info -/var/log/mail.info
-mail.warn -/var/log/mail.warn
-mail.err /var/log/mail.err
+#mail.info -/var/log/mail.info
+#mail.warn -/var/log/mail.warn
+#mail.err /var/log/mail.err
#
# Some "catch-all" log files.
#
-*.=debug;\
- auth,authpriv.none;\
- news.none;mail.none -/var/log/debug
-*.=info;*.=notice;*.=warn;\
- auth,authpriv.none;\
- cron,daemon.none;\
- mail,news.none -/var/log/messages
+#*.=debug;\
+# auth,authpriv.none;\
+# news.none;mail.none -/var/log/debug
+#*.=info;*.=notice;*.=warn;\
+# auth,authpriv.none;\
+# cron,daemon.none;\
+# mail,news.none -/var/log/messages
#
# Emergencies are sent to everybody logged in.
K3sエージェント環境のディスクコピーによる環境作成
Raspberry Pi OSでcmdline.txtの単純コピーで起動できないSDができた件で、facebookのコメントによると、元々システムに含まれているSD Card Copierでのコピーで自動的にファイルシステムの切り詰めもしてくれるということで、これを用いてSDのコピーを行う。 コピー後は、完全に元の環境と同じなので、IPアドレスやホスト名が衝突しているため、同時に動かすことはできない。
コピー側のエージェントだけ動作させたところ、以下のようにクラスタが構築できていることが確認できた。
code:shell
pi@master-rpi4$ sudo kubectl get node
NAME STATUS ROLES AGE VERSION
worker-rpi4-1 Ready <none> 45h v1.20.0+k3s2
master-rpi4 Ready control-plane,master 47h v1.20.0+k3s2
エージェント環境コピー後の設定
コピー後に、正しいホスト名やネットワークの設定を行う。
今回コピーで作成したエージェントはworker-rpi4-2(IPアドレス:192.168.3.104)なので、以下の設定はこれに従った。
code:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.3.104/24
static routers=192.168.3.1
static domain_name_servers=8.8.8.8
interface eth0
static ip_address=192.168.2.104/24
static routers=192.168.2.1
static domain_name_servers=8.8.8.8
code:/etc/hosts
127.0.1.1 worker-rpi4-2
code:/etc/hostname
worker-rpi4-2
更に、GUIでの操作しかできないSD Card Copierでのイメージコピー用にGUI Desktopを有効にしていたため、これを無効化する。
具体的には、raspi-configで、1 System Options -> S5 Boot / Auto Login -> B1 Consoleの順に選択する。
K3sクラスタに関する設定をやり直す必要があるかと考えていたが、この設定変更だけでマスターからは別ノードとして認識されている。
code:shell
pi@master-rpi4$ sudo kubectl get node
NAME STATUS ROLES AGE VERSION
worker-rpi4-1 NotReady <none> 45h v1.20.0+k3s2
worker-rpi4-2 Ready <none> 32s v1.20.0+k3s2
master-rpi4 Ready control-plane,master 47h v1.20.0+k3s2
未解決:K3sクラスタの簡単な例による動作確認
デプロイ設定は、以下の通り。
code:testdeploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysite
labels:
app: mysite
spec:
replicas: 1
selector:
matchLabels:
app: mysite
template:
metadata:
labels:
app: mysite
spec:
containers:
- name: mysite
image: kellygriffin/hello:v1
ports:
- containerPort: 80
以下のようにデプロイする。
code:shell
pi@master-rpi4$ sudo kubectl apply -f testdeploy.yaml
deployment.apps/mysite created
動作状況を確認するが、以下のようなエラーとなり、動作していない。
code:shell
pi@master-rpi4$ sudo kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
mysite 0/1 1 0 152m
pi@master-rpi4$ sudo kubectl get pods
NAME READY STATUS RESTARTS AGE
mysite-8488b995f-gfb9v 0/1 CrashLoopBackOff 30 153m
現状、これ以上の追求はできていない。
Dockerトラブルシューティング環境の構築と共有
Dockerでトラブルシューティングを行う時に、ネットワーク系の調査コマンドなどが入っていないイメージが多いため、自分用のイメージを作成し共有する方法を確認する。
Dockerfileは以下の通り。
実際には、後述のように/etc/以下の設定ファイルも更新したかったが、現状では成功していない。
code:Dockerfile
FROM ubuntu:latest
MAINTAINER Takeshi MUTOH <takeshi.mutoh@gmail.com>
ENV container docker
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update -y
RUN apt install -y net-tools
RUN apt install -y inetutils-ping
RUN apt install -y host
RUN apt install -y nmap
RUN apt install -y lsof
RUN apt install -y tmux
RUN apt install -y traceroute
RUN apt install -y vim
RUN echo "export PS1=\"\u# \"" >> /root/.bashrc
以下のようにビルドする。
code:shell
% docker build -t 610g/work-env:1.0 .
(snip)
% docker images|grep work-env
610g/work-env 1.0 64f7735da6dd 4 minutes ago 201MB
このイメージを実行すると、pingなどが利用可能になっていることがわかる。
code:shell
% docker run -it 610g/work-env:1.0
root# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=37 time=55.448 ms
^C--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 55.448/55.448/55.448/0.000 ms
後での別のマシンでの作業用に、このイメージをdockerhubに共有する。
タグは既にbuild時に指定しているため以下の操作は不要であるが、build時のタグをubuntu:610tなどとしている場合には、tagを用いてタグをdockerhubにpushできる形式(<自分の Docker ID>/<リポジトリ名>:<タグ>)に変更する必要がある。
code:shell
% docker tag ubuntu:610t 610g/work-env:1.0
% docker images|grep work-env
610g/work-env 1.0 11cfe89d21de 23 minutes ago 136MB
以下のように、イメージをpushする。
作業中に、何度かイメージ作成とpushの作業を繰り返したが、同じバージョンタグでpushしても置き換わるだけで大丈夫なようである。
code:shell
% docker push 610g/work-env:1.0
e81b02e2b419: Pushed
aa4ede03c9a9: Pushed
c245c25da6a5: Pushed
c43a7d90a0ae: Layer already exists
bb9a874589c8: Layer already exists
5d50a77a5bd2: Layer already exists
b3735ebad2b1: Layer already exists
07456a7d5d12: Layer already exists
d36cb2463714: Layer already exists
f6253634dc78: Layer already exists
9069f84dbbe9: Layer already exists
bacd3af13903: Layer already exists
1.0: digest: sha256:5e3e4019810e642f2d43d2e0f9edad440889b39f85f019388517797a26c9123c size: 2836
作業先マシンでのトラブルシューティング
dockerhubで共有したイメージを使って、作業マシンでのトラブルシューティングを試してみる。
code:shell
mutoh@freebsd12$ docker build .
Error response from daemon: Untar re-exec error: exit status 1: output: unexpected EOF
このため、ネットワーク関連の問題が疑われるため、今回の調査用イメージを作成した。
作業先のマシンで、以下のようにイメージを取得する。
code:shell
mutoh@freebsd12$ docker pull 610g/work-env:1.0
1.0: Pulling from 610g/work-env
defd1d4cfb63: Pull complete
63f8a60913c2: Pull complete
82862d83af02: Pull complete
e0dc0687297c: Pull complete
1a8350c8f1ab: Already exists
833936205d34: Already exists
cefc2c955982: Already exists
d6a22aa06b3a: Already exists
a20b1708549d: Already exists
762703db9fe9: Already exists
6bf74f32f32a: Already exists
7275247ad7c6: Already exists
ec8d4fb53694: Already exists
b3297071ad4a: Already exists
bdf7cd634ac8: Already exists
010cd034ba8f: Already exists
090279a0d48d: Already exists
Digest: sha256:6d45de3d0efe403bf2647112491790f5ec50fa2cbec361f46c3f2a6d5eaeae4e
Status: Downloaded newer image for 610g/work-env:1.0
以下のように、イメージを実行する。
code:shell
$ docker run -it 610g/work-env:1.0
root#
ネットワーク情報を確認すると、基本的な動作に問題はなかった。
code:shell
root# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 08:00:27:7f:73:a1 (Ethernet)
RX packets 39993 bytes 53090336 (53.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 20310 bytes 1321520 (1.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo0: flags=4169<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
loop (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo1: flags=4169<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
loop (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
pflog0: flags=321<UP,RUNNING,PROMISC> mtu 33160
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root# netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
root# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=117 time=44.746 ms
^C--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 44.746/44.746/44.746/0.000 ms
root# traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
setsockopt IP_MTU_DISCOVER: Protocol not available
コマンドラインでaptコマンドを実行してみると、以下のような問題が確認できる。
archive.ubuntu.comなどの名前解決に失敗している。
mmap関係のリソースについてのエラーが出ている。
code:shell
root# apt update
Temporary failure resolving 'archive.ubuntu.com'
Temporary failure resolving 'archive.ubuntu.com'
Temporary failure resolving 'archive.ubuntu.com'
Temporary failure resolving 'security.ubuntu.com'
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
Reading package lists... Error!
W: Some index files failed to download. They have been ignored, or old ones used instead.
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
E: Error occurred while processing phpcpd (NewVersion2)
E: Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_focal_universe_binary-amd64_Packages.lz4
E: The package lists or status file could not be parsed or opened.
名前解決は、以下のようにhostコマンドで調べても解決できていないが、ネームサーバを指定すると解決できていることから、/etc/resolv.confの設定に関する問題であることがわかった。
ただ、このイメージを作成した環境(macOS+Docker Desktop)で実行すると、適切な/etc/resolve.conf が生成されているため、/BSD/Docker on FreeBSDのネットワーク周りに関する問題のような気もする。 また、socket.c:2423: setsockopt(20, IP_RECVTOS) failed: Protocol not availableのエラーが出ているが、DNSの名前解決はできている状態である。
code:shell
root# host archive.ubuntu.com
socket.c:2423: setsockopt(20, IP_RECVTOS) failed: Protocol not available
;; connection timed out; no servers could be reached
root# host archive.ubuntu.com 8.8.8.8
socket.c:2423: setsockopt(20, IP_RECVTOS) failed: Protocol not available
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:
archive.ubuntu.com has address 91.189.88.142
archive.ubuntu.com has address 91.189.88.152
socket.c:2423: setsockopt(21, IP_RECVTOS) failed: Protocol not available
archive.ubuntu.com has IPv6 address 2001:67c:1360:8001::24
archive.ubuntu.com has IPv6 address 2001:67c:1360:8001::23
socket.c:2423: setsockopt(20, IP_RECVTOS) failed: Protocol not available
以下の、/etc/resolv.confを利用する。
code:/etc/resolv.conf
nameserver 8.8.8.8
これで名前解決に関する問題は解決できた。
code:shell
root# host archive.ubuntu.com
socket.c:2423: setsockopt(20, IP_RECVTOS) failed: Protocol not available
archive.ubuntu.com has address 91.189.88.152
archive.ubuntu.com has address 91.189.88.142
socket.c:2423: setsockopt(21, IP_RECVTOS) failed: Protocol not available
archive.ubuntu.com has IPv6 address 2001:67c:1360:8001::23
archive.ubuntu.com has IPv6 address 2001:67c:1360:8001::24
socket.c:2423: setsockopt(20, IP_RECVTOS) failed: Protocol not available
これで、apt updateを行うが、まだ以下のようなエラーが出ている。
code:shell
root# apt update
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
Reading package lists... Error!
E: Dynamic MMap ran out of room. Please increase the size of APT::Cache-Start. Current value: 25165824. (man 5 apt.conf)
E: Error occurred while processing phpcpd (NewVersion2)
E: Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_focal_universe_binary-amd64_Packages.lz4
E: The package lists or status file could not be parsed or opened.
同様に、/etc/apt/apt.conf.d/70debconfにAPT::Cache-Startの値を10倍に大きくする設定を行ったところ、改善できた。
code:/etc/apt/apt.conf.d/70debconf
// Pre-configure all packages with debconf before they are installed.
// If you don't like it, comment it out.
DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt || true";};
APT::Cache-Start "251658240";
以下のように、apt updateが成功している。
code:shell
root# apt update
Reading package lists... Done
Building dependency tree
Reading state information... Done
4 packages can be upgraded. Run 'apt list --upgradable' to see them.
未解決:/etc/ディレクトリなどのリードオンリー状態の設定を変更する
上記の/etc/resolv.conf,/etc/apt/apt.conf.d/70debconfの設定を行うために、以下のようなDockerfile.minimalを作成した。このファイルは、問題が起こる最小限の状態としている。
code:Dockerfile.minimal
FROM ubuntu:latest
MAINTAINER Takeshi MUTOH <takeshi.mutoh@gmail.com>
ENV container docker
RUN echo "nameserver 8.8.8.8" >> /etc/resolv.conf
以下のように/etc/以下の設定ファイルを更新しようとしても、#5 0.366 /bin/sh: 1: cannot create /etc/resolv.conf: Read-only file systemのようなエラーが出ている。
code:shell
% docker build -t test:610t -f Dockerfile.minimal .
+ Building 7.3s (5/5) FINISHED => internal load build definition from Dockerfile.minimal 0.3s => => transferring dockerfile: 247B 0.0s
=> => transferring context: 2B 0.0s
=> internal load metadata for docker.io/library/ubuntu:latest 6.1s => CACHED 1/2 FROM docker.io/library/ubuntu:latest@sha256:c95a8e48bf88 0.0s => ERROR 2/2 RUN echo "nameserver 8.8.8.8" >> /etc/resolv.conf 0.9s ------
2/2 RUN echo "nameserver 8.8.8.8" >> /etc/resolv.conf: #5 0.682 /bin/sh: 1: cannot create /etc/resolv.conf: Read-only file system ------
ディスクのマウントオプションの問題かとも考え、DockerfileにRUN mount -o rw,remount /を追加してみるが、以下のように許可されていないというエラーとなる。
code:shell
% docker build -t test:610t -f Dockerfile.minimal .
=> => transferring context: 2B 0.0s
=> internal load build definition from Dockerfile.minimal 0.2s => => transferring dockerfile: 319B 0.0s
=> internal load metadata for docker.io/library/ubuntu:latest 4.5s => CACHED 1/4 FROM docker.io/library/ubuntu:latest@sha256:c95a8e48bf88 0.0s => ERROR 2/4 RUN mount -o rw,remount / 2.1s ------
2/4 RUN mount -o rw,remount /: #5 1.843 mount: /: permission denied. ------
で質問したところ、内部でイメージを修正してcommitする方法などが紹介された。 後日、これを試してみる予定である。
ただし、イメージの構築情報をDockerfileだけで完結できないので、あまり望ましい方法とは思っていない。