# 読書会7章 Kubernetesの強力なツール ## 目次 - 7.1 kubectlを極める - 7.2 リソースを使った作業 - 7.3 コンテナを使った作業 - 7.4 ContextとNamespace - 7.5 Kubernetesのシェルとツール - 7.6 独自のKubernetesツールの構築 - 7.7 まとめ ## はじめに > 愛車のメカニックに言われたんだ、「ブレーキは修理できなかったんで、クラクションが大きくなるようにしといたから」 --Steven Wright(コメディアン) 筆者らはこう言われるそうです。 *「Kubernetesには多くのツールがあるようですが、どう思われますか。私には必要でしょうか。必要だとしたら、どれでしょうか。何をしてくれるのでしょうか。」* ~~→知るかあああ!~~ この章ではKubernetesを使用する作業に役立つツールやユーティリティの広大な世界を探索します。 ## 7.1 kubectlを極める kubectlは**2章**で使い方を説明しました。kubectlはkubernetesを操作するための主要なツールなので読者が知らないかもしれないヒントやコツも含めて、kubectlの高度な機能を説明します。 ### 7.1.1 シェルエイリアス .bash_profileに ``` alias k=kubectl ``` って入れると楽だよ。 Googleの人のおすすめ⇛https://ahmet.im/blog/kubectl-aliases/index.html ### 7.1.2 フラグの短縮形の利用 `--namespace` は`-n`でうつと楽だよ。 ### 7.1.3 リソースタイプの省略 Pod、Deployment、Service、Namesppaceってうつのメンドクセ ↓ ``` kubectl get po kubectl get deploy kubectl get svc kubectl get ns ``` そのほか`no(nodes),cm(configmaps),sa(serviceaccounts),ds(deamonsets),pv(persistentvolumes)`とかあるのでおすすめ ### 7.1.4 kubectlコマンドの自動補完機能 ``` kubectl cl<TAB> ``` これで`kubectl cluster-info`になるはず。**便利!!!** kubectlとだけ入力して、Tabキーを2回押すと、**コマンド一覧が出る。便利!!!** ### 7.1.5 ヘルプの表示 `kubectl -h` 次のコマンドで更に困ったら。`kubectl get -h`  良く出来てるな。 ### 7.1.6 Kubernetesリソースに関するヘルプの表示 `kubectl explain pods`でpodに関する情報を教えてくれる。 (`--recursive`でめちゃ出てくる。**めまいを起こさないように!**) ### 7.1.7 より詳細な出力の表示 `kubectl get pods`より`kubectl get pods -o wide`のほうが詳しい。 ### 7.1.8 JSONデータとjqの活用 `kubectl get`はJSONでも出力出来る。 なので、jqコマンドを使いつつ出力をクエリ及びフィルタリングするとよい。 ``` kube ctl get pods -n kube-system -o json | jq '.items[]'.metadata.name' ``` jqの遊び場(https://jqplay.org/ )でためそう! ### 7.1.9 オブジェクトの監視 `kubectl get pods --watch`でpodのステータスが変化するたびに更新してくれる。 ### 7.1.10 オブジェクトに関する記述 ``` kubectl describe pods demo-d94cffc44-gvgzm ``` describeを使おう ## 7.2 リソースを使った作業 kubernetesって`kubectl apply`で宣言的なYAMLマニフェストを適用してたけど、kubectlには**命令的な(imperative)コマンド**も実は用意されている。~~(使うと宣言的だというメリットなくなるけど。。。)~~ ### 7.2.1 命令的なkubectlコマンド ``` kubectl create namespace my-new-namespace ~~ ``` `kubectl edit deployments my-deployment`とかでeditコマンドでリソースのyamlファイルをいじれる。 ### 7.2.2 命令的コマンドを使うべきでない場合 命令的コマンドってテストとかは便利だけど、問題として、唯一の**信頼できる情報元(souce of truth)** がなくなること。 勝手に命令的コマンドで変えられちゃうとgitに上がっているyamlと同期が取れなくなる!!! 例も合ったけど割愛。。。 **ベストプラクティス** * 本番クラスタに対しては、命令的コマンドは使わないようにしよう。 * バージョン管理化のYAMLマニフェストを`kubectl apply`で適用しよう。(またはHelmチャート) ### 7.2.3 リソースマニフェストの作成 いちいちyamlを0から書くのは大変。。。→命令的コマンドを使おう!!! ``` kubectl create deployment demo --image=cloudnatived/demo:hello --dry-run -o yaml ``` これでyaml出力できます。 ### 7.2.4 リソースのエキスポート クラスタ内の既存リソースに関するマニフェストファイルを出力出来ます。(AzureのARM Templateをあとから出力出来るイメージかな) `kubectl get`で`--export`フラグを使う。 **ユースケース** 今まで命令的コマンドで管理していたユーザが本書で推奨する宣言的な方式に移行したい場合とか。 ### 7.2.5 リソースの差分チェック ``` kubectl diff -f deployment.yaml ``` **ベストプラクティス** 本番クラスタにどのような変更を適用する場合も、事前に`kubectl diff`を使って変更点をチェックすること。 ## 7.3 コンテナを使った作業 実行中のコンテナを使った作業で`kubectl`を活用する有用な方法を紹介。 ### 7.3.1 コンテナのログの閲覧 コンテナがうまく動かないという場合、最も役に立つ情報源の一つがコンテナのログ。kubernetesでは、コンテナが**標準出力**および**標準エラー出力**のストリームに書き込む情報はすべて**ログ**とみなされる。 分散側アプリは複数のサービスからログをアグリゲートする(集約)し、永続的なデータベースに保存して、クエリ及びグラフ化が出来るようにする必要がある(これは重要なので、**15章**で解説) とはいえ、特定のコンテナが出力するログを見たいと言うのは極めて有効性の高いトラブルシューティングであり、`kubectl logs`コマンドにPodの名前をしてして直接見れる。 ``` kube ctl logs -n kubesystem --tail=20 kube-dns-autoscaler-69c5cbdcdd-94h7f ``` また、Kubernetes APIサーバのログを閲覧することは、特に重要な情報を提供してくれる。(特にRBACの情報とか) マスターノードの`kube-system`というnamespaceで`kube-apiserver`というpodを発見し、`kubectl logs`を使って見れるよ。 GKEとかのマネージドkubernetesを使った場合は、コントロールプレーンのログを見る方法がドキュメントにあるはず。探してみてね。 ### 7.3.2 コンテナへのアタッチ これよーわからん。 ### 7.3.3 kubespyによるKubernetesリソースの監視 kubespyを使うとkubernetsリソースの状態が変化していくのをリアルタイムで確認できる。 例えば、kubespyの監視対象として、Serviceリソースを指定すると、serviceが作成されたと時、IPアドレスを割り当てられた時、エンドポイントが接続された時等が随時見れる。 ### 7.3.4 コンテナポートの転送 `kubectl port-forward` ローカルマシンから、webブラウザでコンテナに接続したいとか。 ### 7.3.5 コンテナでのコマンド実行 ``` kubectl exec -it alpine-7fd44fc4bf-7gl4n /bin/sh ``` shellを起動出来る!! ### 7.3.6 トラブルシューティングのためのコンテナ実行 `kubectl run`を使用すると、公開されている任意のコンテナイメージを実行して問題解決に役立てることができます。 ### 7.3.7 BusyBoxコマンドの使用 ### 7.3.8 BusyBoxのコンテナへの追加 シェルが含まれていないコンテナにbusyboxコンテナ(1MBくらい)を組み込んでおくと、シェルが使えるようになるので、トラブルシューティングが楽になりますよ。 ### 7.3.9 コンテナへのプログラムのインストール ### 7.3.10 kubesquashによるライブデバッグ デバッガをPodにアタッチ出来る。 ## 7.4 ContextとNamespace ここまでは単一のKubernetesクラスタを使った作業を扱ってきたが、複数のクラスタだったらどうでしょうか。 クラウドに本番のクラスタがあって、ステージングや開発用のクラスタが別にある場合、`kubectl`はユーザが意図したクラスタがどれかを判断するのでしょうか。 この問題を解決するため、`kubectl`には**Context**という概念があります。 Contextとは、クラスタ、ユーザ、Namespaceの組み合わせです。 `kubectl`コマンドを使用するときは必ず**現在のContext**で実行されます。 * 現在のcontextを確認 ``` kubectl config get-contexts ``` * contextを作成 ``` kubectl config set-context myapp --cluster=gke --namespace=myapp ``` * contextを変更 ``` kubectl config use-context hogehoge ``` いちいちこのコマンド打ってコンテキスト変えるのめんどくね…? →kubectx とkubens ### 7.4.1 kubectxとkubens * kubectx 簡単にコンテキストを変えられる ``` kubectx hoge-context ``` `kubectx -`で前のコンテキストに戻れる * kubens Namespaceの変更はコンテキストの変更より頻繁に行うはず。 ``` kubeens hoge-namespace ``` `kubens -`で前使ってたnamespaceに戻れる ### 7.4.2 kube-ps1 Contextを常に表示してくれるツール(bashかzsh用) ## 7.5 Kubernetesのシェルとツール ### 7.5.1 kube-shell 自動補完でも足りないならこれ。ポップアップで出してくれる(lintのイメージ) ### 7.5.2 Click リソースの選択で名前をすべて書くのが面倒な方に。リソースのリストから数字で選んで行く。 (**なお、ベータ実験版の模様**) ### 7.5.3 kubed-sh よみかたは「キューブダッシュ」 ローカルのスクリプトをリモートのkubernetesで分散処理してくれるらしい。 ### 7.5.4 Stern 複数のログストリームを同時に見たい方に。 正規表現等を使って、複数のPodのログストリームを同時に見れるツール。 ## 7.6 独自のKubernetesツールの構築 go言語にはkubernetesを触るAPIライブラリがある。(Ruby,Python,PHPにもライブラリあるけど、KubernetesがGo言語なので、Go言語がいいよね) ## 7.7 まとめ つかれたーーーーー