1時に寝て7時に起きた。夜にウォーキングし始めてからよく眠れるようになった気がする。

udemy: Kubernetes入門

昨日 の続き。今日はセクション6から最後まで。CI/CD のセクションだけスキップして、他は一通り目を通した。

セクション6 Kubernetes実践

1つずつ書くのは大変だけど、数をこなして徐々に覚えていけばよい。手で書くのもよいが、別のやり方としてクライアント側で dry run すると、設定のひな型を作ってくれるのでそれに必要な設定を足すのもよい。

$ kubectl create deploy mysql --image=mysql:5.7 --dry-run=client -o yaml
$ kubectl exec -n database -it mysql-787f86d65c-nflxx -- mysql -uroot -ppassword

データベースとアプリケーションを異なる namespace にデプロイして、それらが通信できるような設定を行う。基本的には --dry-run=client でひな型を作りつつ、必要な設定を追加していくやり方が簡単そうにみえた。とはいえ、実際に設定していくときはどういう設定を追加するとどういう振る舞いになるかを調べながら作業すると思うのでこんな簡単にはできないとは思う。次のようなアプリケーションをデプロイする一覧の流れを理解できた。

  1. namespace 作成
  2. Deployment 作成
  3. ConfigMap 作成
  4. Secret 作成
  5. Deployment, ConfigMap, Secret 適用
  6. Service 適用
  7. port-forward でローカルからアクセス
  8. (作成したリソースをすべて削除)

セクション7 KubernetesのDebug

基本は pod のステータスを確認しながら問題があれば、その箇所を追いかけていって原因を調査する。

$ kubectl get pod -A
$ kubectl get pod -A --selector run=nginx

k8s 上で実行しているアプリケーションの依存先へ接続できない場合は Service の確認が必要となる。kubectl の get, describe, logs などのサブコマンドをあれこれみながらエラーの原因を把握して、yaml の設定を変更していく。k8s のアーキテクチャとコマンドを覚えていないとなかなか難しそう。

とりあえず動かした後にまとめて全部削除できるのがテストやデバッグに便利そう。

$ kubectl delete -f .

もしくは開発用に独自の namespace を作成して、あとで丸ごと namespace を削除するのでもよさそう。

$ kubectl delete ns mynamespace

k8s の調査

業務のアプリケーションを minikube で作ったローカル k8s クラスターで動かしてみた。ローカルの開発環境の構築方法をメンテナンスして、自分でも一通り k8s の yaml を書いて、デプロイして、振る舞いを確認したりしていた。最初なのでおもしろい。自分で一通りやってみて、k8s が難しいとみんなが言っているのは k8s クラスターを自前で構築するのが難しいのだとようやく理解できた。k8s クラスターがすでにある状態なら kubectl の使い方を覚えるだけで全く難しくない。GKE や EKS を使って運用するなら k8s の運用コストは大したことがないと理解できた。k8s クラスター向けの yaml はたくさん書かないといけないけど、どうせ ECS や EC2 でやっていても CDK や Terraform などのインフラ設定を書くのは同じなのでそこはあまり差がない。k8s はコンテナオーケストレーションをやってくれるメリットが大きいので minikube と EKS の環境の差異があまり問題にならないようなアプリケーション開発であれば、普通に使っていって問題ないように思えた。ローカルで環境作るのが大変なんじゃないかという先入観があったけど、全然そんなことはなかった。コンテナのイメージをビルドしないといけないのが追加のコストかな。