re:annkara

日々学んだことを書き留めておく。

kubectl plugin 機能を利用してkubectl コマンドを拡張する

最近 kubectl コマンドを拡張したいと思い、調べてみたら kubectl plugin 機構で機能拡張できることを知ったので、公式ドキュメントをベースにまとめておこうと思う。

kubectl plugin 機構とは

kubectl v1.12 以上のバージョンで使用できる、kubectl のサブコマンドを自前で実装できる plugin 機構のこと。

実行可能ファイル(シェルスクリプトやbatファイル、goで実装したバイナリなど)を PATH 上に配置し、kubectl-SUBCOMMANDというようなファイル名にすれば、kubectl SUBCOMMAND を実行した際に、kubectl が PATH上を検索し実行するような仕組みとなっている。

現状、v1.15 がリリースされており、機能としても stable となっているが、windwos で実行すると現状以下のエラーが返ってくる。

$ kubectl.exe version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDate:"2019-06-19T16:40:16Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"windows/amd64"}

$ cat kubectl-echo.bat
echo "HELLO"

$ kubectl.exe echo
not supported by windows

v1.15 のバージョンにおいてはどうやら Windows 向けの実装が入っていなかったが、このプルリクエストがすでにマージされているので、次のバージョンでは利用できそう。

Replace syscall.Execve with exec.Command. by sawlanipradeep · Pull Request #76227 · kubernetes/kubernetes · GitHub

リンク先から入手できる v1.16 のアルファ版リリースを試してみると、実行できているのできっと大丈夫なはず。

kubernetes/CHANGELOG-1.16.md at master · kubernetes/kubernetes · GitHub

$ kubectl-1.16.exe echo

"HELLO"

制約事項

kubectl に既に存在するコマンドをオーバライドすることはできないため、kubectl-version といったコマンドを実装しても、実装したプラグインは実行されず、もともと存在するコマンドが実行される。

$ cat kubectl-version.bat
echo "kubectl version"

$ kubectl-1.16.exe version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.0-alpha.1", GitCommit:"704790e0412842e782904f1c2e7123112a9aab2c", GitTreeState:"clean", BuildDate:"2019-07-17T01:06:25Z", GoVersion:"go1.12.7", Compiler:"gc", Platform:"windows/amd64"}

なので、例えば kubectl-create-foo みたいなコマンドを実装し、kubectl create foo というように実行しても、自前で実装したコマンドは実行されない。

実装方法

上述の通り、スクリプトやbatファイル、実行バイナリなどを実装し、実行権限を付与し、PATH上に配置すればあとは kubectl がよしなにしてくれる。

kubectl の実装上、環境変数は kubectl 実行時の環境変数を引き継いでくれるし、パラメータもスクリプト実行時のように渡すことができる。
この編の仕組みは、上で貼ったプルリクエストのリンクを参照すると理解できるかもしれない。

時間があれば自分でもまとめておきたいと思う。

サブコマンドの検索ルール

サブコマンドの検索は最長一致で検索するようになっている。

つまり、実行コマンドが kubectl foo bar baz arg1 --flag=value arg2 だった場合には、kubectl-foo-bar-baz-arg1 という実行可能ファイルを検索し、--flag=value arg2 というパラメータは、kubectl-foo-bar-baz-arg1 にそのまま渡される。

仮に kubectl-foo-bar-baz-arg1 という実行可能ファイルが PATH 上から見つからなかった場合には、kubectl-foo-bar-baz という実行可能ファイルを検索し、arg1 --flag=value arg2というパラメータがサブコマンドに引き渡される。

最終的にサブコマンドが見つからない場合には、通常の kubectl コマンドのエラーが表示される。

ちなみに、すでにインストールされているプラグインを表示するには kubectl plugin list を実行する。
自前で実装したプラグインも、PATH 上に配置されていれば表示される。

sub-command

サブコマンド名に - を利用したい場合には、実行可能ファイル名に _ を利用する。

kubectl foo-bar を実行する際には、ファイル名は kubectl-foo_bar とすればよい。
また、kubectl foo_bar を実行しても、kubectl-foo_bar が実行される。

今のところ、これができることの良さがあまり実感できていない。

実行ファイル名被り

同一名の実行ファイルが別々の PATH 上のディレクトリに配置されている際には、常に最初に見つかったサブコマンドが実行される。
これは kubectl plugin list を実行すれば、そのような警告が表示されるため気づくことができる。

PATHを変更すればよいが、実際にはあまり気にしたくないと思うので名前が被らないようにするのが良いかと思う。

もう少しややこしい問題として、kubectl-foo-barkubectl-foo-bar-baz といった実行ファイルが同一ディレクトリ上に配置されていた場合がある。

kubectl foo bar の場合は kubectl-foo-bar
kubectl foo bar baz の場合は kubectl-foo-bar-baz が実行されることになる。

ややこしいので、あまり自分で実装することはなさそうな気がしている。

k8s.io/cli-runtime パッケージ

今まで見てきたように、kubectl plugin 機構を利用すれば、シェルスクリプトやbatファイルを利用してプラグインを拡張することができる。

ただ、その場合にはパラメータは単純にスクリプトに渡されるだけなので、パラメータの解析などは自前で行う必要があるし、kubectl コマンドをラップするだけになってしまう。

もう少し機能効いた拡張機能を実装したい場合には、kubectl の実装にも利用されている k8s/cli-runtime を利用して Go言語で実装すると良い。ただ、サンプルの実装がGitHubにあるとは言え、ちょっとハードルが高いなと感じてしまったので、簡単なものを作ってみたら再度まとめておきたいと思う。

参考

公式ドキュメント kubernetes.io

今年のKubeCon/CloudNativeConでkubectl plugin についての講演があったので載せておく。 www.youtube.com

krewというプラグインマネージャの話とか記述されたりしています。 qiita.com

低レイヤープログラミング

@dekokunさんや@DQNEOさんに触発されて、低レイヤのプログラミングに興味が湧いてきている。

dekotech.dekokun.info qiita.com

最初は9ccの写経をしていたのだけど、途中からTCP/IPの理解を深めたいなと思って積読していたソースコードで体感するネットワークの仕組み ~手を動かしながら基礎からTCP/IPの実装までがわかるを写経し始めて、やっと第二章まで終えた。

この本の面白いところは、ネットワークのL2レイヤ(イーサネットフレーム)のデータの送受信から自前で実装するという点で、普段ならカーネルがやってくれている部分を実装を通じて理解することができる点だと思う。

第二章が終わった段階では、ホスト上のNICを利用しつつも仮想的なMACアドレスIPアドレスを持つ仮想ホストが実装され、ARP、ICMPなどのL3レイヤまでのプロトコルが実行できる。

イーサネットARP、IP、ICMPとネットワークの低レイヤから高レイヤにかけて段階的に実装していくと、階層化されたネットワークというものを実感できるし、高レイヤのプロトコルはヘッダ情報が複雑化する分、表現力が増すし実装も複雑になるのだなと思った。

例えば、イーサネットレイヤにおけるデータ転送できる最大サイズは1500バイト(もちろん変更できる)に対して、IPレイヤにおけるパケット最大サイズは65535バイトで、その際にはパケットのフラグメンテーションが発生して、1500バイト毎にパケットが分割されて転送されるみたいな。

TCPの実装にはまだ取り組めてないけど、TCPとなるとピア間の接続状態の管理だとか、輻輳制御だとか再送機能だとかもっとできることが増えるのでその分実装も難しくなるんじゃないかなと思っている。これはそのうちちゃんと取り組みたい。

この本自体は実装がメインでネットワークの仕組みだとか、コードの説明だとかあまり載っていないのでネットワークを初めて学ぶような人とか、C言語初心者ですみたいな人には向かない本だと思う。

かといって自分もC言語バリバリ書けるとかではなく、なんとなく読める程度であとはググればなんとなくわかるくらいなので、何冊かC言語の本読んで簡単なサンプルが書ければ大丈夫なんじゃないかと思う。ネットワークに関する知識はどうだろう。基本情報とか応用情報とかの知識があれば大丈夫な気がする。。。

環境面としてはLinuxでやった方がよい。自分はWSLを利用していたけど、コンパイルは通るけど実行はできなかった。多分、socket周りでWindowsがサポートしていないシステムコールを利用しているからだと思う。WSL2は試してないからわからない。そのうちやってみようと思う。

3か月間いろいろアウトプットさぼってきたので、これを機に定期的にブログ書いていきたいなー

【読書メモ】3月に読んだ本

3月に読んだ記憶があるのは以下の3冊。

PythonによるTCP/IPソケットプログラミング

タイトル通りでPythonを利用したソケットプログラミングの基本的な部分を説明している。本当に基本的なことだけを説明しているので、詳細を知りたい場合には別の書籍なりを参照する必要がある。

書籍じゃないけど、id:y_uukiさんの以下のブログだったり、 blog.yuuk.io

id:momijiameさんの以下のブログがよいと思う。 blog.amedama.jp

独学プログラマー Python言語の基本から仕事のやり方まで

独学でプログラマを目指す人向けの本。

前半はPythonの構文の説明で、後半はコードを書く際に必要となる周辺知識(Bash、バージョン管理、チーム開発など)やプログラマとしてキャリアを始める際のアドバイスなどが記載されている。

この本もプログラマに必要なスキルを網羅的記述しているもので、各領域の知識やスキルを深掘りしていくには別個で学んでいく必要があると思う。

Goならわかるシステムプログラミング

従来であればC言語で説明されるシステムプログラミングを、Go言語を利用して説明している。

OSが提供する機能(プロセス管理、メモリ管理、ファイルシステム、ネットワークなど)や、OSが提供するAPIをGo言語ではどのようにして利用しているかなど記述しているので、Go言語に入門した後でもう少し踏み込んで学びたい人には良いのではないかと思った。

私自身はGoで実装した経験があまりないので、もう少し実装経験を積んだら読み返したいと思った。

2月、3月と結構だらだら過ごしてしまったので、4月からもう少しアウトプット増やしていきたい。

【読書メモ】入門 監視

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

だいぶ前に一読していたので、簡単にまとめておく。

ウェブオペレーション ―サイト運用管理の実践テクニック (THEORY/IN/PRACTICE)を読んだ時に、監視とはアラート発砲をすることでモニタリングはメトリクスを収集することで異なる概念だ、みたいな記述を読んでからずっと別物だと考えていたのだけど、そうでは無いことに気づかされた。

本書から言葉を借りるとすると監視とは以下の定義となる。

監視とは、あるシステムやそのコンポーネントの振る舞いや出力を監視し、チェックし続ける行為のことである。

メトリクスやログを収集し、閾値や特定のメッセージ、メトリクスの変化などを監視し、何かエラーが発生したりこれから障害が発生しそうである場合にアラートを発砲する、こういった複合的なシステムの健全性を確認し続ける行為のことを監視というのだと本書を読んで気づくことができた。

システムの監視というと、アプリケーション開発者というよりはシステム運用者の役割であるという認識が一般的であると思われているが、監視というのは特定の誰かがやるべきことではなく、そのサービスに関わる全ての人が監視に対して責務を持つべきである。

サーバ側のシステムメトリクスに問題が無い状態であろうと、あるページが絶えずHTTPのステータスコード500を返している状態は健全な状態であるとは言えず、そういった場合にはアプリケーション開発者も監視に対して責務を負うべきなのだ。

しかし、開発側も運用側もサービスの監視に対して責務を持つとなると、縦割り組織(開発は開発チーム、運用は運用チームみたいな)だとそういった意識を持ちづらいような気がする。この解決策としてDevOpsといった考え方を取り入れることもできる気がするけど、自分の周りを見てみるとなんだか難しそうな気がする。

エンジニアのスキルというか学習意欲だとかそういったものに依存する部分が大きいと思うからだ。また、SRE(Site Reliability Engineerの方)といった役割にしても、システムの健全性・監視をSREという新しい役割に負ってもらっているという感じがするので、本書が目指すような監視像とはちょっと違う気もしている。

個人的な理想は、開発も運用も同一のサービスを提供する同一のチームで協調していくことなのかなと思っているのだけど、実際にそういった働き方をしている人から話を聞いたわけでは無いのでちょっと聞いてみたい。

本書の感想からだいぶ逸れてしまったけど、開発者だろうと運用者だろうとシステムの健全性を保つという行為自体はエンジニアであれば誰しもが意識すべきことだと思うので、是非とも一読して欲しい本です。

【雑記】「質量への憧憬」にいってきた。

bijutsutecho.com

落合陽一氏の写真展へ行ってきた。

写真展というものへ行ったのは生まれて初めてであり、また芸術的な催し物にも縁のない人生であるけども、落合氏がどんなふうに世界を見ているのか、興味があったので行ってきた。

正直、落合氏の伝えたいことの百分の一も理解することはできなかったけども、以下の説明には共感を覚えた。

f:id:reannkara:20190127202801j:plain

時間というものは実際には目には見えないものである。しかし、水という実体を得ることにより、時の経過を波という形で認識することができる。

時間というものは当たり前の存在であるが、それ自体を認識することは出来ない。時間を、また別の質量を伴ったものを通してのみ認識することができる。

静かな波を見て心が落ち着くといった心の動作というのは、漠然と過ぎゆく時間というものを実感を伴って感じることができるからなのではないか。

写真や絵画、また他の表現物というのは表現者の意図というものを少なからず保持しているものだと思っている。

書物は文字という共通のプロトコルを利用して意図を読者に伝えるものであるが、写真や絵画といったものは写されたもの、描かれたものを通じて意図を伝えるものであるから読み取り手側の理解力といったものが試される気がする。

そういった意味では、表現されたものを理解するだけの知識を身につけることはこの世界をもっと認識することができることに繋がって、もっと面白く見えるんじゃなかろうか。

目の前の理解しやすいこと、面白いこと、それだけに囚われるのではなくて、この世界を認知できるための素養というのを鍛えていく。

きっとそういう行為も面白いと思うし、また、自分も表現する側になったとしたら、それはそれで面白いのかもしれない。

【読書メモ】FACTFULNESS

FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣

FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣

共訳者の上杉周作さんに見覚えがあったので買ってみた本。自分が如何に世界のことを何も知らないということを痛感させられた。

FACTFULNESSとは著者が考えた言葉であり、本書の副題にあるとおり「10の思い込みを乗り越え、データを基に世界を正しく見る習慣」のことを意味している。

10の本能とは以下のことを指している。

  1. 分断本能
  2. ネガティブ本能
  3. 直線本能
  4. 恐怖本能
  5. 過大視本能
  6. パターン化本能
  7. 宿命本能
  8. 純化本能
  9. 犯人捜し本能
  10. 焦り本能

一つ一つの詳細やそれにまつわる著者のエピソードについては是非本書を手に取って読んでみて欲しい。

本書では人間の認識や思考の癖について、統計情報をもとに如何にその認識と思考が偏ったものであるのかを示してくれる。しかし、信頼できる情報の取得方法や、取得した情報をもとにどのようにデータを解釈するか、といった具体的な方法については示されていないように思える。

具体的な実践方法については何か他の書籍をあたった方が良いと感じたが、それでもかなりのインパクトを持って自身の認識の偏り、無知を知らせてくれる非常に良い本だった。

日々の生活にて、これらの本能に支配されていないか自身に問いかけていきたいと思う。

【読書メモ】愛とか正義とか

愛とか正義とか―手とり足とり!哲学・倫理学教室

愛とか正義とか―手とり足とり!哲学・倫理学教室

読書猿さんと対談した: わたしが知らないスゴ本は、きっとあなたが読んでいるにて、読書猿さんが勧める一冊として紹介されていたので読んでみた。

今まで読んできた本のなかで一番の衝撃を受けたかもしれない。

難しい言葉や概念はほとんど使われず、非常にわかりやすい文章なのだけど、さくさくと読み進めることは難しい。
読み進める度に考えることであったり、新しい発見に出会えたりで様々なことを思い起こしてしまう。

この本から得られる知識というものは非常に多岐にわたる。
しかし、そういった知識を得ることはこの本の本当の目的ではないのかもしれない。

哲学や倫理学といった学問の入門となる本書であるが、個人的に大事だと感じた点に絞ってまとめてみようと思う。

どんな本か

この本は哲学・倫理学の入門書である。
とは言っても、カントやヘーゲルニーチェアリストテレスなど過去の偉人たちの哲学を学ぶための本ではない。
「哲学」とは何かという根本的なところからこの本は始まる。

「当たり前と思われているもの」を捉える

「哲学」とは、「自分で考えて自分の答えをだすこと」だと本書では言っている。それが重要であると。

「自分で考えて自分の答えをだすこと」と言われると、私達が日常的に行っていることだと思われるかもしれない。しかし、それは本当であろうか。

本書では正義や愛、自由といったテーマを思考の対象としているが、それらの概念を自分たちの頭で考えたことはあるだろうか。
私達は無意識にそれらの概念を勝手にイメージとして捉え、理解した気になっているのではないか。

本書の目的はそこにあるのではないかと思う。
つまり、「当たり前と思われているもの」を自分の言葉で再定義し、その定義が正しいか反証を考える。どうやらその定義が正しそうだという確証が得られたとき、その概念をもとに与えられた命題、または自分が見つけた命題に対して自ら答えをだすために思考する。

本書ではこれらの思考の過程を追体験させてくれることで、「自分で考えて自分の答えをだすこと」ということがどういうことなのかを経験的に理解させてくれる。

これは水です。

「これは水です」とは、デヴィッド・フォスター・ウォレスという作家が2005年にケニオン大学で行った卒業スピーチのタイトルだ。

翻訳してくださった方のブログをここに置いておく。 j.ktamura.com

このスピーチの内容においても「自分の頭で考えること」の大切さを説いているが、重要な洞察が付け加えられている。

「自分の頭で考えられるということは、何について考えるか、ある程度自分でコントロールできる術を学ぶこと」を端折ったものだ
引用元: https://j.ktamura.com/this-is-water

自分の人生において大事なこと

「愛とか正義とか」と「これは水です」はともに「自分の頭で考えること」の重要性を説いていて、私はこの2つの文章に出会うことができて非常に良かったと思う。

私は今まで、幸福な人生とは「何も考えない人生のこと」だと思っていた。「何も考えない」とは本当に何も考えずに生きるということではなくて、「人生について思い悩む」ことだったり、今私が書いているようなことを考えないような人生のことだ。上手く表現できているかわからないが、つまりは世間が言う理想的な人生(結婚して、子供を産んで、日々働いて、、、みたいな)を歩むことが「唯一の」幸福な人生だと考えていた。

正直、幸福な人生とは何かを語れる言葉を今は持っていない。しかし、今まで見てきたように自分の抱える問題や悩みに対して真正面から「自分の頭で考え、自分で答えをだす」こと、また、「何を考えるか、自分をコントロールする」こと。この2つが自分の人生において大事であるとハッキリと自覚した。

まとめ

最初は「愛とか正義とか」の感想(思考過程を追体験させてくれる凄い本)だけを書こうと思っていたのだけど、何故かしっくりこなかった。非常に良い本だという実感を持っていたものの、何故そこまで自分はこの本を凄いと思ったのか、上手く言語化できていると思わなかったからだ。

「これは水です」はだいぶ前に目にした文章で、今回本を読んだあとに再度読み返してみたものだ。意図してなのか、無意識なのか覚えていないのだけど改めて読み返してみることでこの本のどういう部分に心を動かされたか理解できた。
自分の人生の根幹にはきっと「考えること」というのがあって、その「考える」という行為をわかりやすく、丁寧に、そして面白く書いている本だからだと思う。
「これは水です」では、人生において「自分の頭で考えること」の重要性について述べている。その点で「人生」と「考えること」が結びつきをハッキリと自覚できたのだと思う。

書評風自分語りになってしまったのだけど、「愛とか正義とか」は本当に面白い哲学・倫理学の入門書となっている。考えるべき対象がこの世界にごまんと存在し、解決されるべき課題も山ほど積み重なっている。そんな世界を真正面から捉えるために、この本で「自分の頭で考える」ことの練習をしてもいいのではないかと思う。