この記事は Kubernetes2 Advent Calendar 2018 の7日目の記事です。
はじめに
Kubernetes の Network Policy を自動設定する operator を kubebuilder を使って実装したのでその時感想についてざっくりと書きました。
モチベーション
この operator を作ろうと思ったモチベーションは
- 個人的にGCP の memorystore の東京リージョンがGAになったので GKE から使ってみたい
- memorystore は private ip による接続でつなぐようになっていて、認証などはまだ無い
- Network Policy (や istio などのサービスメッシュ?)で egress の接続制御を行わないと GKE 上のいろんなアプリケーションから接続し放題になってしまう
- memorystore で IP アドレスの範囲を設定しておき、 Network Policy で予め決めた範囲をデフォルトで deny にしておけば必要な pod にだけアクセスを許可できると思った
- Network Policy は namespace 単位での設定になるので、Network Policy の設定漏れなどが起こらないようにしたい
みたいな感じでした。
またちょうど
に参加したときに Ian さんが
で operator の話をされていたので触ってみたいなという気持ちもありました。
使い方
README に書いた通りなのですが
$ kubectl config current-context <TARGET CLUSTER CONTEXT>
$ git@github.com:bells17/common-network-policy-operator.git
$ cd common-network-policy-operator
$ make deploy
で自分のクラスタに operator 用の CRD の作成と Custom Controller の Deployment (や namespace やら RBAC などの諸々のリソース)の作成を行います。
また Kubebuilder を利用して operator を作成したため上記を実行する上で デプロイするにあたって kustomize のインストールが事前に必要です。
operator の実装にあたって
今回作ってみるにあたって上でリンクを貼った ian さんスライドで紹介されていた
を使ってみたのですが
には基本的な使い方の説明はあるのですが具体的な How to の情報はあんまりなくて、また kubernetes 周りのコードを初めて読みながら作ったのでやりたいことをどうやって書けばいいのかがわからなくて結構調べたり悩みながら書きました。
今回書く上では Kubebuilder のドキュメントの他には主に
- https://github.com/ianlewis/memcached-operator
- https://github.com/mercari/certificate-expiry-monitor-controlle
- https://qiita.com/__Attsun__/items/785008ef970ad82c679c の記事
- https://github.com/kubernetes/sample-controller
- https://www.ianlewis.org/jp/extending-kubernetes-ja
- https://qiita.com/ktateish/items/207f696f537ece39e9fb
あたりを中心として参考にさせてもらい operator を書きました。
感想
- CRD の apiVersion が結局 “apiVersion: commonnetworkpolicies.bells17.io/v1alpha1” みたいになってるけど “bells17.io” の部分個人で作ってる場合とかどうやって決めたらいいのか気になった
- GKE での Network Policy の実現方法は Calico を使っているようなのだけど、 Calico がv3系になれば(現在はまだv2.6っぽい) GlobalNetworkPolicy というのが使えるようになりそうなので、そうすればこの operator は不要になるかも
- また istio などのサービスメッシュを利用して対応する方法があるかについても検証できていなかったので、別途検証してみたい
- controller-runtime とか kubernetes のパッケージについてまだ分かっていることが少ないのでもっとちゃんと分かるようになりたい
- Slack の kubernetes workspace で質問したらいろいろと優しく教えてもらえるのでみんな join すべきだと思った