先日参加したCloudNative Daysで触りたいものがこれでもかと溢れたので、まずは今更のKubernetesを触ってみる。
本当は2日目からKubernetesの話なんて書きたくなかったんだ。でもさ、仕方がないんだよ、触ってしまったのだ、誘惑に負けて。
まず体系的にインプットしようと教科書を用意。最初はどれでも良いかとこちらをポチッと。頭から3章までを前提としてインプットした上で、4章からは各APIについての記載なので触りながら試してみようとのことで栞を挟む。
コンテナオーケストレーションはコントロールプレーンではECS、データプレーンではFargateしか利用したことがないので、Kubernetesは初めて。ローカル環境を構築するためにMinikube、Docker Desktop for Mac、kind、k3sあたりが候補に挙がったが、今回はkindでやろうと思う。コンテナ技術としてDockerは普段から利用しているので、特段困ることはないだろう。
ECSでいうとタスク定義がKubernetesマニフェスト、タスクがPodに相当するのかな?と思いながらローカルの構築を進める。まずは触ってみること。
触っていくよ〜!
総じてこの時間が一番楽しいものだ。bgmは伊藤計劃の『<harmony/>』(アニメver)。ふと意識を寄せれば「女の子は魔法が使えるんです。首席は女の子であることを忘れてしまったようですけど。」と霧慧トァンがオスカー・シュタウフェンベルクに皮肉を放り投げている。なんと素晴らしい時間だろうか。まさに、これが幸せというものである。
鼓膜の生んだ振動を蝸牛が擬似的なアルコールへと変換し、脳がボルテージを上げていく。よし、まずはKindのインストールからやっていこうか。その前にDockerのバージョンを確認しておこう。
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
実は諸事情で新規作成したユーザーで操作をしており、バージョン確認すらできない状態であった。高まったボルテージが急速に下がっていく。幸せって何だっけ?
仕方ない。rootユーザーに切り替え諸々の設定を変更した上で気を取り直してKindのインストール。(brewのインストールからか。。。)
kind v0.20.0 go1.21.1 darwin/arm64
よし、そもそものユーザー設定からだったので面倒だったけど準備は整った。2024年はとても良い正月を過ごしている。どうか安心して欲しい。余談だが、なぜKubernetesを今更仕事で使うわけでもないのに触っているかというと、いま僕はargoCDを使ってガチャガチャ遊びたいと思っている。たこさんと戯れたいのだ。細かい理由は後述するかもしれないが、書いてなかった場合は古き記憶を辿ってほしい。僕は君に期待している。
ではクラスタを構築していこう。
シングルノードクラスタ
構成設定はyamlで定義するとのことだが、別に作りたいものがある訳でもなし、つまり非機能要件もある訳ではないのでMasterとWorkerそれぞれ何台必要というものもない。どうしようか。こういう時は理由など要らない。思うがままに触れれば良いのだ!シングルノードクラスタで立ち上げてみよう!
% kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.27.3) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Have a nice day! 👋
あら、こんなに早いのね。それではnodeを取得してみる。
全く関係はないのだが、nodeって名前分かりづらいと思わないだろうか?分かるよ、命名というものは非常に難しい。Kubernetes特有の固有名詞を生み出すよりも、一定共通認識のある抽象的な表現であった方がまだ認知しやすいだろうなというのはわかる。そして抽象度は高いものの、扱う人がエンジニアであればnodeという言葉で、ある程度の共通認識が獲得できるのも分かる。
でもさ、ラテン語のnodusを起源とするnodeという言葉の本来の意味は「接点」らしい。接点としての役割を持つという意味では頷くことはできるけども、それ以上に大切な役割をKubernetesのnodeは持っていないだろうか?
これがKubernetesにおけるnodeのドキュメントなのだが、記述されているnodeの役割としてその命名に値するものが「接点」となる理由が分からない。
Kubernetesに限らずだけど、わざわざ既存の言葉で表現するよりは新しい固有名詞を作ってくれた方が良いと思ったりするのだ。それはこういうものだとインプットすれば良いだけだから。
でもこういうのって大体、正しく理解しきれていないだけで、ちゃんと理解できれば「これはnodeだね」と言えてしまうオチが多い。先人というのは、素晴らしいものだ。だから、「理解したい」とその憧憬のようなものがエネルギーとなってこうやって後からでも追いかける。
% kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kind-control-plane Ready control-plane 5m17s v1.27.3 172.18.0.2 <none> Debian GNU/Linux 11 (bullseye) 6.4.16-linuxkit containerd://1.7.1
kindなのでコンテナはDockerだよね。みてみよう。
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34c710cf442e kindest/node:v1.27.3 "/usr/local/bin/entr…" 8 minutes ago Up 8 minutes 127.0.0.1:63516->6443/tcp kind-control-plane
おお、起動してくれてる。シングルノードなので、このMasterにPodをデプロイして自分自身で監視・制御をしていくってことかな。あるあるということでnginxをデプロイしてみよう。
嫌だな、作業ログになってしまっているように感じる。そんな記録で30年後の自分が楽しめるだろうか?30年後、Kubernetesを触ってみようと思うはずもないだろう。
では、小噺を。
記録といえば、君はスティーブン・プレスフィールドの『砂漠の狐を狩れ』が大好きだった。これはルポルタージュであり、ノンフィクション エッセーだ。今、手元にないのであれば、あらためて購読してみて欲しい。
そして僕は気が利くから、その所感を日記で記し、リンクを貼っておくことを約束しよう。今はないよ、後で置き換えるからね。ぜひ読んでみた後に、当時獲得した感情や考察と、どのような違いが生まれたのかを楽しんで欲しいと思う。
さて、続きをしていこう。
雑にlatestタグで指定。
% kubectl create deploy nginx --image=nginx:latest
deployment.apps/nginx created
% kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-7bf8c77b5b-vn69t 1/1 Running 0 45s 10.244.0.5 kind-control-plane <none> <none>
IPアドレス10.244.0.13を持ったnginxのPodが起動してる。同じIPもしくはService名でアクセスできるようにService作成して内部公開しよう。
% kubectl expose deploy nginx --port 80
service/nginx exposed
% kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 46m
nginx ClusterIP 10.96.143.208 <none> 80/TCP 5s
こんな感じだろうか?
% kubectl create deploy nginx-client --image=nginx:latest
deployment.apps/nginx-client created
% kubectl exec -it nginx-client-6894dbdf84-nbpdr -- curl http://10.96.143.208/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
とりあえずcurlで返ってきた
Kubernetesを題材にしてるはずなのに、小噺やらnodeに対する不満(?)を書き連ねているせいで、進んだところまで書ききれない状態(笑)とりあえずKubernetesに関しては続編でargoCDやっていこうと思う。正月休みはゆっくりやっていこう。仕事が始まったらこのボリューム感で書けないと思う。
君はもしかしたらもうずっと休みかもしれないけれど