Closed20

kernel のバージョンが 5.12.2 以上で minikube を docker driver で動かすと kube-proxy が CrashLoopBackoff する

buzztaikibuzztaiki

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
buzztaikibuzztaiki

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
buzztaikibuzztaiki

ログを見ると 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
buzztaikibuzztaiki

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
buzztaikibuzztaiki

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).

リソースのリファレンスは
https://kubernetes.io/docs/reference/config-api/kube-proxy-config.v1alpha1/

buzztaikibuzztaiki

PR や実装をみると、extra-config にはリソースのキーを書く事になっていて、多段のキーは設定できないぽい。

buzztaikibuzztaiki

これ多分 extra-config でなんとかする話じゃないな。

といったあたりまでを昨日調べてた。

buzztaikibuzztaiki

結局 net.netfilter.nf_conntrack_max が namespaced ではないから特権がないと設定できなくてコケてるって事だと思うんだけど、探しても困ってる人があまり見つからないんだよな。

buzztaikibuzztaiki

ディストリビューションのせい?

 $  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
buzztaikibuzztaiki

minikube が kind に依存してるように見えないんだけど、直るのかな?

buzztaikibuzztaiki

no, but the issue is "universal" so hope is that the kube-proxy will be fixed for everyone

期待してるぞ。

buzztaikibuzztaiki

今更だけれど確認した。
直ってるー。

 $  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
このスクラップは2021/08/02にクローズされました