はじめに
Kubernetesにおいて、Node
、Pod
、Service
に割り当てられるIPアドレスの範囲を確認する方法をメモしておきます。他にもいろいろ方法はあると思うので、ご注意ください。
やってみる
環境
cniを有効にしたminikubeを使います。他のKubernetesディストリビューションだと方法が違うかもしれません。
1 2 3 4 5 6 7 8 9 10 11 |
$ minikube start --network-plugin=cni --enable-default-cni $ minikube version minikube version: v1.11.0 $ kubectl config view | grep current-context current-context: minikube $ kubectl version Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3", GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-21T14:51:23Z", GoVersion:"go1.14.3", Compiler:"gc", Platform:"darwin/amd64"} Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3", GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-20T12:43:34Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"} |
Nodeへの割り当て
Minikube
のminikube
ノードにログインして、ip addr
コマンドで確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME minikube Ready master 10d v1.18.3 192.168.64.3 <none> Buildroot 2019.02.10 4.19.107 docker://19.3.8 $ minikube ssh _ _ _ _ ( ) ( ) ___ ___ (_) ___ (_)| |/') _ _ | |_ __ /' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\ | ( ) ( ) || || ( ) || || |`\ | (_) || |_) )( ___/ (_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____) (minikube Node)$ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever ★2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 96:b1:4d:84:5f:91 brd ff:ff:ff:ff:ff:ff inet 192.168.64.3/24 brd 192.168.64.255 scope global dynamic eth0 valid_lft 85259sec preferred_lft 85259sec 3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000 link/sit 0.0.0.0 brd 0.0.0.0 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:cf:1e:f6:60 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 6: veth7a0043d@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 42:ae:d2:b3:23:46 brd ff:ff:ff:ff:ff:ff link-netnsid 1 8: veth0f4286d@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 0a:fc:de:5c:3c:65 brd ff:ff:ff:ff:ff:ff link-netnsid 0 |
eth0
のNICを見ると、192.168.64.3/24
が割り当てられています。すなわち、Node
への割り当てられるIPアドレスは、192.168.64.xxx
であると思われます。
Podへの割り当て
CNIの設定は、デフォルトでは/etc/cni/net.d
配下にあります。私のminikubeノードには、1-k8s.conf
という設定ファイルがありました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
(minikube Node)$ cat /etc/cni/net.d/1-k8s.conf { "cniVersion": "0.3.0", "name": "rkt.kubernetes.io", "type": "bridge", "bridge": "mybridge", "mtu": 1460, "addIf": "true", "isGateway": true, "ipMasq": true, "ipam": { "type": "host-local", "subnet": "10.1.0.0/16", "gateway": "10.1.0.1", "routes": [ { "dst": "0.0.0.0/0" } ] } } |
10.1.0.0/16
が割り当てられているようです。試しにPod
を作ってみます。
1 2 3 4 5 6 7 |
$ kubectl run nginx --image=nginx --generator=run-pod/v1 --port=80 --labels app=nginx Flag --generator has been deprecated, has no effect and will be removed in the future. pod/nginx created $ kubectl get pods nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 14s 10.1.0.4 minikube <none> <none> |
ちなみに/etc/cni/net.d
配下には、87-podman-bridge.conflist
というファイルもありました。よくわかっていませんが、コンテナランタイムとしてDockerの代わりにPodmanを使った時に使うファイルなのかな?kubeletの--container-runtime
オプションを見ると自分のクラスタでは、コンテナランタイムはDockerみたいなので、関係ないと思いたい。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ systemctl status kubelet Warning: The unit file, source configuration file or drop-ins of kubelet.service changed on disk. Run 'systemctl daemon-reload' to reload units. ● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; disabled; vendor preset: enabled) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since Thu 2020-06-18 14:42:24 UTC; 9min ago Docs: http://kubernetes.io/docs/ Main PID: 3573 (kubelet) Tasks: 18 (limit: 4413) Memory: 31.0M CGroup: /system.slice/kubelet.service └─3573 /var/lib/minikube/binaries/v1.18.3/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=systemd --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-domain=cluster.local --config=/var/lib/kubelet/config.yaml --container-runtime=docker --fail-swap-on=false --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --network-plugin=cni --node-ip=192.168.64.4 --pod-manifest-path=/etc/kubernetes/manifests |
Serviceへの割り当て
Service
と言っってしまいましたが、簡単のため、今回はClusterIPに絞ります。Kubernetes API Serverの設定を見ればよいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$ kubectl -n kube-system describe pods kube-apiserver-minikube Name: kube-apiserver-minikube Namespace: kube-system [...] Containers: kube-apiserver: Container ID: docker://12a8f537f86bc1453033a97396352cde005575c8a4c16f83c4bf0a2ae534ceec Image: k8s.gcr.io/kube-apiserver:v1.18.3 Image ID: docker-pullable://k8s.gcr.io/kube-apiserver@sha256:e1c8ce568634f79f76b6e8168c929511ad841ea7692271caf6fd3779c3545c2d Port: <none> Host Port: <none> Command: kube-apiserver --advertise-address=192.168.64.4 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/var/lib/minikube/certs/ca.crt --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota --enable-bootstrap-token-auth=true --etcd-cafile=/var/lib/minikube/certs/etcd/ca.crt --etcd-certfile=/var/lib/minikube/certs/apiserver-etcd-client.crt --etcd-keyfile=/var/lib/minikube/certs/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --insecure-port=0 --kubelet-client-certificate=/var/lib/minikube/certs/apiserver-kubelet-client.crt --kubelet-client-key=/var/lib/minikube/certs/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/var/lib/minikube/certs/front-proxy-client.crt --proxy-client-key-file=/var/lib/minikube/certs/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/var/lib/minikube/certs/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=8443 --service-account-key-file=/var/lib/minikube/certs/sa.pub --service-cluster-ip-range=10.96.0.0/12 ★ --tls-cert-file=/var/lib/minikube/certs/apiserver.crt --tls-private-key-file=/var/lib/minikube/certs/apiserver.key State: Running [...] |
10.96.0.0/12
が割り当てられているようです。試してみると、10.105.129.99
が割り当てられました。
1 2 3 4 5 |
$ kubectl create service clusterip nginx --tcp=8080:80 $ kubectl get svc nginx -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx ClusterIP 10.105.129.99 <none> 8080/TCP 3m21s app=nginx |
最後に
今回やったことをまとめると、以下のようになります。環境によって変わると思います。
Node
: ノードにログインして、ip addr
で確認Pod
: CNIの設定を確認Service
: kube-apiserverの設定を確認
Kubernetes、やればやるほど、何もわからなくなりますね。完全ガイド読み返そうかな。
以上.
コメント