昨日の朝早くからの水戸への遠出および夕方から夜にかけての散歩で相当疲れていたのか、起きたら 11:30 過ぎぐらいだった。
急いで(とはいえ 11:45 頃までは布団に居たが)準備をした。Softlab ゼミが 12:15 からある、と Google Calendar に書いてあり、その時間に現地に行ったが誰もいなかった。注意深く Matrix でメールを見てみると、10:00 開始となっていた。Google Calendar の予定は cyanolupus が管理していて、ゼミにはオンラインで参加していたから自分も予定変更リクエストを投げなかった気がする。次回のゼミからは念の為に自分のカレンダーに自分で予定を入れておこう……今は桜カスミで手に入れたカラフルペッパーで味付け済みの鶏むね肉と野菜パックと卵を入れただけの味噌汁を朝食と昼飯の両方として食べて 13:20 頃になった。
MetalLB を入れたので EXTENAL-IP が assign されていないだろうかと思ったが、未だに付いていなかった。https://metallb.universe.tf/troubleshooting/ 読んでたら ConfigMap ではなく IPAddressPool というリソースが出てきたので調べてみたら 0.13.2 からは ConfigMap が使えなくなったらしい:https://blog.inductor.me/entry/2023/02/13/123328 MetalLB remains idle until configured. This is accomplished by creating and deploying various resources into the same namespace (metallb-system) MetalLB is deployed into.
https://metallb.universe.tf/configuration/
普通に公式ドキュメントが一番わかりやすそう。IPAddressPool 作れって開口一番に書いてある。apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 10.0.100.200-10.0.100.250
普通に動いた。ubuntu@k8s-master1:~$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 22h
nginx-service LoadBalancer 10.110.172.134 10.0.100.200 80:31454/TCP 21h
Liveness Check が動くのは素晴らしいが、これは各 node で Readiness probe が確認を行っているためか、node が死んだときにはその上にある Pod が IP アドレスを持ったままで応答しなくなるように外から見ると振る舞っているように見える。
ではそのために LoadBalancer がその Pod に対してトラフィックを割り振ってしまうかというと、そういう訳でもない。自動的に Endpoints からその Pod の IP アドレスが消されている。
これはどういうことなのか GitHub Copilot Chat に尋ねてみると、Kubernetes API を介して LoadBalancer に Node が unavailable であることが伝達され、それを見て LB がその Node 上にある Pod に対応する IP アドレスを Endpoints から除外しているのだという。kubectl drain --ignore-daemonsets <node> で、その Node 上で動作しているアプリケーションを別所に移し、その Node に kubectl uncordon <node> するまでは新たな Pod を作らないようにすることができる。
PodDisruptionBudget を利用すると、drain 時に unavailable になってもよい Pod の数を制限することでサービスを維持させながら操作ができる。https://metallb.universe.tf/configuration/ 読んでると MetalLB が BGP router を動作させて external IP を利用するときに広報させることができるように読める。すごそう……Kubernetes でたまに見る Taint って何?と思っていた https://kubernetes.io/ja/docs/concepts/scheduling-eviction/taint-and-toleration/
これは Node に付与できる属性のようなもので、この Taint に対応する Torelation が Pod の spec 内で指定されていなければ、その Pod は Taint された Node にスケジュールされないらしい。
これって cordon されている Node があったとしても Pod に “NoScheule” 付けたらその Node にスケジューリングされてしまうということ?
-> 試してみたけどいけた。
ただし、node.kubernetes.io/unschedulable を手動で解除しても toleration
のない Deployment はいけなかった。謎
↑これはそもそも解除できていなかった。
uncordon されている node で kubectl taint nodes k8s-worker4 node.kubernetes.io/unschedulable:NoSchedule をしても Taint は実際には付与されていないし、その逆も然り。
この Taint は特殊で、何らかの View として働いているように見える。kubectl taint nodes <node> foo[=bar]:NoSchedule で好きな Taint が付けられる。Argo CD なんかもあるけれど、結局 Git ops が活きてくるのは複数人で同一のプロジェクトに関わっているときにある程度の形式のもと人を動かすように仕組みをもって仕向けられればアノマリーを防ぎつつ作業が進められるというメリットがあるのみであって、他者との関わりが必要になってくる気がする。明日の飲み会の後そのままつくばに帰れたりしないか?と思って調べてみたらいけそうだった。
https://maps.app.goo.gl/Ar7EGiTWj3qMBWzJ7azarashi と coord_e が就職するので、技術が好きでたくさん働く人々がいなくなったかも。生きていくモチベ、よくわからんなーとは思う、やりたいことが特段ある訳でもないし……Ceph を使いたくなるケースが無いなあ。手元で複数台の不要なマシンがある訳でもなく、さらに数 TB ものストレージを組み合わせて使いたくなるケースがない。
サブウェイの気分だったからイーアスつくばに行った。ACADEMIA に寄って Kubernetes 入門を買った。実家には 2 日ほど滞在しようと考えている。電車で行き来する。Sidecar 使ってログ収集してメトリクス表示するやつやってみたいかも。Kubernetes 入門に目をすべて通した。PV を複数の Pod から参照したいと思うが、そのときどのようにして同一のストレージを複数箇所から参照するのだろうと思ったら NFS, iSCSI, その他クラウドベンダーによって提供されるストレージ(これらは各種ベンダーによる Kubernetes 用のドライバーを実装に用いてアクセスしてくれるようだ)