アプリ開発者のための kubectl 講座
これは何
Kubernetes クラスタ管理者とアプリケーション開発者が分業しているプロジェクトで,開発者が必ずしも Kubernetes に詳しくない場合を想定し,開発時に使いそうな kubectl のコマンドをまとめたものです。
クラスタ管理者から開発者にこのドキュメントを適宜改変して渡し,開発者がある程度自立して操作できるようになることで,管理者への問い合わせ負荷を減らすのが狙いです。
場合によってはハンズオンで講座を開いてもよいでしょう。
ドキュメント案
ここでは Amazon EKS でクラスタを構築する場合の例を示します。
別のインフラに構築している場合は適宜書き換えてください。
事前準備
インストール
AWS 環境設定
AWS CLI からアカウントを操作できるような設定方法を書きましょう。
コンテキスト作成
操作する対象の Kubernetes クラスタを context として追加します。kubectl を実行する際には,所望のコンテキストになっているかどうかを都度確認する必要があります。
AWS_PROFILE=???
aws eks update-kubeconfig --name {CLUSTER_NAME} # Kubernetes クラスタ名に置き換える。
覚えたほうがいいコマンド
(共通)オプション
kubectl では namespace を指定しないと default
になるので,-n
オプションで指定する必要があります。
context 切り替え
# context 切り替え
kubectl config use-context {CONTEXT}
# 現在の context
kubectl config current-context
# context 一覧
kubectl config get-contexts
namespace や context の切り替えは kubie をインストールすればもっと簡単になります。
Pod 再起動
Deployment で Pod をデプロイしている場合です。
kubectl rollout restart deploy/{DEPLOYMENT}
ログ閲覧
kubectl logs {POD}
# アプリのコンテナに絞りたい場合は -c オプションを使う。
kubectl logs {POD} -c {CONTAINER}
Amazon CloudWatch Logs などログを収集している箇所があれば,そこからログを閲覧する手段も書いておくとよいでしょう。
その他
公式に kubectl Cheat Sheet もあるので参考にしてください。
ケーススタディ
ポートフォワード
kubectl port-forward {POD} 8080:80 # ローカルのポート:コンテナのポート
curl で内部向けエンドポイントを叩きたい
curl の Pod を立ち上げます。
kubectl run curl-01 --image=curlimages/curl --rm -- www.example.com
データベースに大量にデータを挿入したい
# ポートフォワード用コンテナを立ち上げてポートフォワード
kubectl run --env REMOTE_HOST={DB_ENDPOINT} --env REMOTE_PORT=3306 --env LOCAL_PORT=3306 --port 3306 --image marcnuri/port-forward db-port-forward
kubectl port-forward db-port-forward 3306:3306
# ローカルから接続
mysql -h 127.0.0.1 -P 3306 -u {USERNAME} -p
# 終了後にコンテナ削除
kubectl delete pod db-port-forward
CronJob からジョブを手動で実行したい
CronJob の schedule を直近の時刻に書き換えてジョブが実行されるのを待つのは,
- 実行までにラグがある
- 終わったら戻さないといけない
- ジョブ監視している場合,設定スケジュールとずれて誤検知が増える
というデメリットがあるので,以下のように CronJob から Job を作成するほうが好ましいです。
kubectl create job {JOB_NAME} --from=cronjob/{CRON_JOB_NAME}
もっと知りたい場合
Kubernetes 公式ドキュメントが充実しているので,時間があるときに読んでみましょう。
体系的に学習したい場合は,CKAD に挑戦するのもよいと思います。
導入効果
実際のプロジェクトで作成し,アプリ開発者に共有してみたところ,kubectl を使ったクラスタの基本操作に関する疑問はほぼ開発者自身で解決できるようになりました。
アプリ開発者からの問い合わせがトラブル報告や要望になったことで,クラスタ管理者は本来的な仕事に集中できるようになりました。
Discussion