kernel のバージョンが 5.12.2 以上で minikube を docker driver で動かすと kube-proxy が CrashLoopBackoff する
minikube の起動はできるんだけど
$ minikube start
😄 Arch rolling 上の minikube v1.19.0
🎉 minikube 1.20.0 が利用可能です! 以下のURLでダウンロードできます。 https://github.com/kubernetes/minikube/releases/tag/v1.20.0
💡 To disable this notice, run: 'minikube config set WantUpdateNotification false'
✨ dockerドライバーが自動的に選択されました。他の選択肢: virtualbox, ssh
👍 コントロールプレーンのノード minikube を minikube 上で起動しています
💾 Kubernetes v1.20.2 のダウンロードの準備をしています
> preloaded-images-k8s-v10-v1...: 491.71 MiB / 491.71 MiB 100.00% 41.84 Mi
🔥 docker container (CPUs=2, Memory=3900MB) を作成しています...
🐳 Docker 20.10.5 で Kubernetes v1.20.2 を準備しています...
▪ Generating certificates and keys ...
▪ Booting up control plane ...
▪ Configuring RBAC rules ...
🔎 Kubernetes コンポーネントを検証しています...
▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟 有効なアドオン: storage-provisioner, default-storageclass
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
kube-proxy が上がってこない
$ kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-74ff55c5b-gnvtq 0/1 Running 0 54s
kube-system etcd-minikube 0/1 Running 0 63s
kube-system kube-apiserver-minikube 1/1 Running 0 63s
kube-system kube-controller-manager-minikube 0/1 Running 0 63s
kube-system kube-proxy-pp8dk 0/1 CrashLoopBackOff 3 54s
kube-system kube-scheduler-minikube 0/1 Running 0 63s
kube-system storage-provisioner 1/1 Running 1 68s
ログを見ると nf_conntrack_max
の変更で permission denied。
$ kubectl logs daemonset/kube-proxy -n kube-system
I0514 03:04:25.453204 1 node.go:172] Successfully retrieved node IP: 192.168.49.2
I0514 03:04:25.453253 1 server_others.go:142] kube-proxy node IP is an IPv4 address (192.168.49.2), assume IPv4 operation
W0514 03:04:25.481927 1 server_others.go:578] Unknown proxy mode "", assuming iptables proxy
I0514 03:04:25.482043 1 server_others.go:185] Using iptables Proxier.
I0514 03:04:25.482233 1 server.go:650] Version: v1.20.2
I0514 03:04:25.483226 1 conntrack.go:100] Set sysctl 'net/netfilter/nf_conntrack_max' to 131072
F0514 03:04:25.483432 1 server.go:495] open /proc/sys/net/netfilter/nf_conntrack_max: permission denied
docker exec でも同様に permission denied。特権がないんだろうなって感じ。
$ docker exec -it minikube bash -c 'cat /proc/sys/net/netfilter/nf_conntrack_max'
262144
$ docker exec -it minikube bash -c 'ls -la /proc/sys/net/netfilter/nf_conntrack_max'
-r--r--r-- 1 root root 0 May 14 03:09 /proc/sys/net/netfilter/nf_conntrack_max
$ docker exec -it minikube bash -c 'echo 131072 > /proc/sys/net/netfilter/nf_conntrack_max'
bash: /proc/sys/net/netfilter/nf_conntrack_max: Permission denied
https://github.com/kubernetes/kubernetes/blob/0c2d5b34908b9e04adcc35f2ff816188f6313602/hack/local-up-cluster.sh#L880-L885 に maxPerCore を 0 にすれば無視してくれると書いてあって
# Skip setting sysctl value "net.netfilter.nf_conntrack_max"
maxPerCore: 0
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established"
tcpEstablishedTimeout: 0s
# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close"
tcpCloseWaitTimeout: 0s
https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/ には --conntrack-max-per-core
オプションを 0 にすればよいとある。
--conntrack-max-per-core int32 Default: 32768
Maximum number of NAT connections to track per CPU core (0 to leave the limit as-is and ignore conntrack-min).
リソースのリファレンスは
extra-config で kube-proxy を設定できるようにした PR:
PR や実装をみると、extra-config にはリソースのキーを書く事になっていて、多段のキーは設定できないぽい。
これ多分 extra-config でなんとかする話じゃないな。
といったあたりまでを昨日調べてた。
結局 net.netfilter.nf_conntrack_max
が namespaced ではないから特権がないと設定できなくてコケてるって事だと思うんだけど、探しても困ってる人があまり見つからないんだよな。
ディストリビューションのせい?
$ uname -a
Linux echo 5.12.2-arch1-1 #1 SMP PREEMPT Fri, 07 May 2021 15:36:06 +0000 x86_64 GNU/Linux
$ lsb_release -a
LSB Version: 1.4
Distributor ID: Arch
Description: Arch Linux
Release: rolling
Codename: n/a
仲間がいた。うれしい。
kind に issue があると教えてもらった。そっちか。
netfilter: conntrack: Make global sysctls readonly in non-init netns
そういうこと。
minikube が kind に依存してるように見えないんだけど、直るのかな?
no, but the issue is "universal" so hope is that the kube-proxy will be fixed for everyone
期待してるぞ。
minikube に PR がきたけど、この修正でいいんかいな。
k3d にも issue がきた。
https://github.com/kubernetes/minikube/pull/11419 がマージされた。minikube では元々設定する余地なかったしこれでいいのか。
新しいリリースはまだ。
今更だけれど確認した。
直ってるー。
$ minikube version
minikube version: v1.22.0
commit: a03fbcf166e6f74ef224d4a63be4277d017bb62e-dirty
$ minikube profile list
|----------|-----------|---------|--------------|------|---------|---------|-------|
| Profile | VM Driver | Runtime | IP | Port | Version | Status | Nodes |
|----------|-----------|---------|--------------|------|---------|---------|-------|
| minikube | docker | docker | 192.168.49.2 | 8443 | v1.21.2 | Running | 1 |
|----------|-----------|---------|--------------|------|---------|---------|-------|
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a485da7cf15a gcr.io/k8s-minikube/kicbase:v0.0.25 "/usr/local/bin/entr…" 6 minutes ago Up 6 minutes 127.0.0.1:49157->22/tcp, 127.0.0.1:49156->2376/tcp, 127.0.0.1:49155->5000/tcp, 127.0.0.1:49154->8443/tcp, 127.0.0.1:49153->32443/tcp minikube
$ kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-558bd4d5db-cvw9w 1/1 Running 0 5m56s
kube-system etcd-minikube 1/1 Running 0 6m2s
kube-system kube-apiserver-minikube 1/1 Running 0 6m11s
kube-system kube-controller-manager-minikube 1/1 Running 0 6m2s
kube-system kube-proxy-swz6c 1/1 Running 0 5m56s
kube-system kube-scheduler-minikube 1/1 Running 0 6m2s
kube-system storage-provisioner 1/1 Running 0 6m7s