おうちKubernetesクラスタを組む(後編)
の続き。
ノートPC↔デスクトップマシンの通信があんまり安定してくれなくて、たまにパケットが通らなくなったりしてよく分からない感じになっちゃったので、VMからまるっと作り直した。 ただ、作り直してもたま~にパケットが通らなくなってしまうのが起きてしまったので、ルータをちゃんとしたヤツに買い換えないといけないのかもしれない。
Serviceの公開ができるようにする
k8sクラスタ上のPodに対してノートPCからどうやってアクセスするのがいいかな~と考えていたが、Serviceをtype: NodePortで作成するのが一番ラクだと思ったのでそうすることにした。
# nginxのPodをたてる $ kubectl run nginx --image=nginx # type: NodePortなServiceを作成する $ kubectl expose po nginx --name=nginx --type=NodePort --port=80 # 作成したPodがどのNodeで動いているか確認する $ kubectl get po -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 13h 172.16.168.135 node1 <none> <none> # 作成したServiceのnodePortを確認する $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx NodePort 10.104.230.33 <none> 80:30953/TCP 11m
これで「今回作成したnginxはnode1の30953ポートで動いている」ということが分かるので、そこにアクセスすれば見えた。
# node1のIPは192.168.10.191 $ curl -is http://192.168.10.191:30953 | head -2 HTTP/1.1 200 OK Server: nginx/1.21.0
しかしtype: NodePort(かつexternalTrafficPolicy: Cluster)の場合は、PodがいないNodeに対してアクセスしてしまっても正しいNodeに転送してくれるはずだったのに、なぜか転送されなかった。
# node2のIPは192.168.10.192 $ curl -is http://192.168.10.192:30953 | head -2 (返事がない)
調べてみると、Calicoを使ってかつ、KubernetesクラスタのCIDRをVMのと別のにしてしまうと、うまく転送してくれないとというようなIssueがあったので、その現象にあたってしまったのかもしれない?
Calicoではなく別のCNIプラグインなら大丈夫らしいので、試しにCiliumに切り替えてみたところ、うまく動いてくれたのでそっちを使うことにした。
Tailscaleで家の外からもk8sクラスタにアクセスできるようにする
次は家の外からでもアクセスしたいな~と思ったので、またまたsuperbrothersさんのを参考にして、Tailscaleを導入してみた。
アカウントを作成したら、クライアントを各マシンにインストールしただけで、本当にあっさり導入できてしまった。
iPhoneにTailscaleのクライアントを入れたら、4G回線からも普通に接続できてしまった。
TailscaleのMagic DNSを有効にする
Magic DNSを有効にすれば、「<マシン名>.<ユーザ名>.beta.tailscale.net」という名前で引けるようになるので、IPアドレスを覚えたり/etc/hostsに書いたりをせずに済むようになったため更に便利になった。
さっきはIPアドレスでアクセスしていたnginxのNodePortの例も、
$ curl http://node0.<アカウント名>.beta.tailscale.net:30953/ $ curl http://node1.<アカウント名>.beta.tailscale.net:30953/ $ curl http://node2.<アカウント名>.beta.tailscale.net:30953/
のようにFQDNでアクセスできるようになった。
また、kubernetes-dashboardについても
apiVersion: v1 kind: Service metadata: name: kubernetes-dashboard-expose namespace: kubernetes-dashboard spec: type: NodePort selector: k8s-app: kubernetes-dashboard ports: - nodePort: 30000 port: 443 targetPort: 8443 protocol: TCP
というようなtype: NodePortなServiceを作ることで、
$ curl http://node0.<アカウント名>.beta.tailscale.net:30000/ $ curl http://node1.<アカウント名>.beta.tailscale.net:30000/ $ curl http://node2.<アカウント名>.beta.tailscale.net:30000/
でアクセスできるようになった。
証明書を設定できていないので警告は出てしまうが。。。
最終的にはこういう感じになった。
これで一通り準備ができてそれっぽく使えるようになったので、Kubernetesクラスタで色々実験するのが捗りそう😺
あとTailscaleはすごい!!