Hello Custom Controller!

2019年はカスタムコントローラーや!ということで2018年末頃から少しづつ調べている。まずは非常に簡単なものを動かしてみる。

Custom Controller is…

CRDについてのメモにも書いたが、CRD自体はただのデータなので、それだけでは何も起こらない。Kubernetesのdeclarative APIを活用するためにはコントローラーの作成が必要。なお、本記事は以下のページを参考にしています。

作っていく

カスタムコントローラーを作っていくわけだが、いきなり複雑なものを作るのは難しい。そこで、まずはカスタムリソースを読み込み、ログに出力するだけのコントローラーを作る。カスタムコントローラー用のSDKやBuilderがいろいろあるようだがこれも使わず、KubernetesのAPI用コードを出力するだめの code-generator を用いて素朴に作ってみる。code-generatorはいくつかの機能を持っている。

  • deepcopy-gen – 各型についてDeepCopy用のメソッドを生成
  • client-gen – カスタムリソースを扱うためのクライアントセットを生成
  • informer-gen – カスタムリソースの変更に対応するためのイベントベースインターフェースを生成
  • lister-gen – GetとListについて、読み取り用キャッシュレイヤを扱うコードを生成

本格的にカスタムリソースを扱うためにはinformer-genやlister-genが必要になるが、今回はdeepcopy-genとclient-genのみ。deepcopy-genも不要な気がするが、これなしでうまく動かす方法がちと分からなかった。

生成元のコードを用意する

まずは apis/foo/v1alpha/doc.go

次にapis/foo/v1alpha/register.go

最後にapis/foo/v1alpha/types.go

コード生成

これらのファイルを用意したら、code-generatorでコードを生成する。なお、code-generatorのバージョンは kubernetes-1.12.3を使用。

カスタムコントローラーを実装

これで、GoからFooリソースを扱うことが出来る。カスタムコントローラー用のコードを書いていく:

コントローラー用のマニフェスト。defaultアカウントがオブジェクトを取得できるようにRBACの設定も行っている:

デプロイして動作確認する

カスタムコントローラーのビルドからKubernetesへのデプロイまで行うためのMakefile:

デプロイする:

カスタムコントローラーのログを見ると、Fooリソースを取得してログに出力していることが確認できた:

非常にシンプル、というかとくに何もしていないが、カスタムコントローラーができたといっていいだろう。理屈ではログ出力の部分をロジックに置き換えればいいはず。実際にはinformerを用いてイベントベースで処理を行うようなコードになるのだと思う。次はログ出力だけではなく別リソースを扱うようにしていきたい。

ソースコードなどはtakaishi/hello2019にあります。

CRDについてのメモ

Kubernetesのカスタムリソースについてのメモ。基本的には公式ドキュメントの Custom Resources にいろいろと説明が書かれているのでここを読めばよい。カスタムリソース自体は構造化されたデータをKubernetes上に保存・取得できる機能といえる。これにカスタムコントローラを組み合わせることで、Deploymentのようなビルトインリソースと同じような宣言的APIを用いた状態管理を実現できるようになる。データ保存だけなら必ずしもカスタムコントローラーは必要ではないというのが最初分かっていなかった。

軽く試す。使用バージョンは以下の通り:

  • Kubernetes v1.12.3
  • minikube v0.32.0

検証用環境はminikubeで起動:

kubernetes/sample-controller を参考にしつつ、CRD用のマニフェストを作成する。グループやバージョンがリソースへアクセスする際のAPIとなる(/apis/<group>/<version>)。リソースのkindや単数形、複数形なども定義できる。

このマニフェストを適用すると、以下のようにcrdリソースとして見えるようになる:

Fooリソースを作ってみる。以下のようなマニフェストを用意し、 kubectl applyする:

Fooリソースが作成されていることがわかる:

リソースの詳細を見ると、マニフェストで指定したspecが確認できる:

リソース毎にspecが異なることも確認できる:

CRDでバリデーションを行うこともできる(OpenAPIv3.0を使うようだ)。kubernetes/sample-controller を見つつ、replicasのバリデーションを設定してみる:

これで、replicasの最小値と最大値が設定される。replicasが10より大きいマニフェストを用意して適用してみる:

バリデーションに引っかかり、作成に失敗することが確認できた。

API Aggregationというものもあるようだが、そちらはまた今度。

参考:

2018年ふりかえり

2017年の頭に一度ポジションが変わったのだが、2018年の頭にもまたしてもポジションが変わり、試行錯誤の年となった。やりたいこととやらなければならないこと、職務上の視座と実際にやらないといけない業務の視座、などのバランスがうまくとれなかったなあと思う。仕事は仕事でふりかえって、来年以降のあれこれをトライしていく。とはいえやりたいことは僅かではあるが進んでおり、初めてプロポーザルが採択されての登壇もできた。小粒だがいくつかツールも書けた。来年も引き続きやっていく。

今年読んだ本・漫画だが、ブクログの記録は以下の通り。今年はほとんど読めなかったなあ。逆に、漫画はよく読んだ。はねバド!、宇宙兄弟、不滅のあなたへ、Artiste、ヘテロゲニア・リンギスティコ等よい出会いが多かったと思う。

宇宙よりも遠い場所、プラネット・ウィズ、SSSS.GRIDMAN、青春ブタ野郎はバニーガール先輩の夢を見ない がよかった。映画はあまり見なかったような気がする、と思ったけどマーベル・シネマティック・ユニバースシリーズを一気に見たのだった。アベンジャーズの新作楽しみですね。

健康という観点だと、健康診断は問題なかったのだけど春と秋に風邪をひき、咳が1ヶ月以上残ったのが大きな出来事だった。夏の暑さもあり、あまり外で活動できなかったように思う。来年以降は風邪を引いたら1ヶ月パフォーマンスが低下すると思って気をつけないとな、という気持ち。ベンチプレスは風邪で動けなかった影響で全然上げられなくなってしまった。

けっこうあちこちに行った1年でもあった。3月末に台湾、4月末に福岡、6月に仙台、9月に大阪・金沢。すごい!来年も、最低1回はどこか旅行に行きたいものだ。

来年は部屋の更新もあるので、いよいよ引っ越したい。うまく時間を作ってエンジニアリングを継続しつつ、生活できるようがんばるぞ。

49インチの4Kテレビを買った

しばらく前からテレビを買おうと考えていて、PayPayのキャンペーンでエイヤっと買った。ブラビアのX8500F。東京に来てからテレビを持っていなかったので、すごく久しぶり。テレビボードなどの周辺機材?もこの際なのでいろいろ購入。

テレビは設置を依頼したのだけど、想像以上に軽くて自分でできたな、とも思う。テレビボードは組み立て式のものにしたが、これは大失敗。めちゃくちゃ大変だったので次は組み立て済みのものにする。

満足度は非常に高い。55インチでもよかったかなあとも思わなくもないが。これまでは27インチモニタかiPadで視聴していたけど、基本テレビを使うのがいいなあ。音質もいい。BSも視聴可能ということがわかったので、分波器を買ってきて地デジとBS両方見えるようにした。となると見ないともったいないので、使っていないHDDを繋げて録画可能に。nasneにするかな?とも考えていたけど、しばらくはこれでいいかな。

おおむね満足なのだが、動作が遅いのが気になる。Androidを搭載していることと関係があるかはわからないが、ワンテンポ遅れて動作するのでストレス。PC/iPadでの操作に比べるとリモコンでの操作は行いにくいとも感じる。スマホアプリで結構いろいろできるのだけど、dアニメやNetflixなどアプリの操作はやりにくいかなあ。iPadで検索してお気に入り登録して、テレビではそれを選択するだけ、というのがいいかもしれない。

上を見ると有機ELがあってめちゃくちゃ綺麗だけど、ミドルクラス?の4K液晶テレビでもかなり満足できた。うまく使ってリフレッシュするぞ〜。