kubectlによるKubernetesクラスター・コンテナ操作まとめ
概要
個人の備忘録としてkubectlコマンドを利用してKubernetesクラスタの作成や削除、又はクラスター上におけるコンテナリソース(Pod)の作成・更新・削除、さらにコンテナへの接続・コマンドの実行やデバッグ等の方法についてまとめていきます。
参考
実行にあたっての前提
今回の
- Google Cloudのアカウントとプロジェクトの作成が完了していること
- ローカル環境に
kubectl
がインストールされていること(今回はversionv1.22.5
で検証)
参考
Kubernetesクラスタ(GKE)の作成
実行環境として今回はGKEを利用します。次の手順でGKEのクラスタを作成します
# GKEで利用可能なKubernetesのバージョンを確認
$ gcloud container get-server-config --zone asia-northeast1-a
# GKEクラスタ「k8s」を作成
$ gcloud container clusters create k8s \
--cluster-version 1.22.7-gke.1500 \
--zone asia-northeast1-a \
--num-nodes 1 \
--machine-type n1-standard-4 \
--enable-network-policy \
--enable-vertical-pod-autoscaling
-
--cluster-version
: validMasterVersionsにあるKubernetsのバージョンを指定 -
--machine-type
: インスタンスタイプの指定 -
--enable-network-policy
: NetworkPolicy機能の有効化 -
--enable-vertical-pod-autoscaling
:VerticalPodAutoScalerの有効化
GKEクラスターの作成には数分かかります。
作成完了後、GKEクラスタへの権限を再取得します。
$ gcloud container clusters get-credentials k8s --zone asia-northeast1-a
Googleアカウントが管理者権限でKubernetesクラスタを操作できるように次のコマンドを実行します。
$ kubectl create clusterrolebinding user-cluster-admin-binding \
--clusterrole=cluster-admin \
--user={Googleアカウントのemalアドレス}
clusterrolebinding.rbac.authorization.k8s.io/user-cluster-admin-binding created
マニフェストを利用したリソースの作成・削除・更新
kubectlを利用してマニフェストファイルを元にコンテナを起動してみます。
# リソースを作成(既に存在する場合はエラーが発生)
$ kubectl create -f sample-pod.yaml
作成したPodの確認
$ kubectl get pods
作成したリソースの削除には kubectl delete
コマンドを利用します。
$ kubectl delete -f sample-pod.yaml
又、マニフェストファイルを利用せずにリソースタイプとリソース名を指定して削除することもできます。
# 特定リソースの削除
$ kubectl delete pod sample-pod
# 特定リソースタイプを全て削除
$ kubectl delete pod --all
リソースの更新には kubectl apply
コマンドを利用します
$ kubectl apply -f sample-pod.yaml
# イメージを確認
$ kubectl get pod sample-pod -o jsonpath="{.spec.containers[?(@.name == 'nginx-container')].image}"
なおリソース作成には前述で紹介したkubectl create
コマンドより
今回の更新と同様にkubectl apply
の利用が推奨されています。
理由としてはkubectl apply
とkubectl create
コマンドを混在して利用しているとkubectl apply
実行時に差分が適切に検出しきれない場合があるためです。
コンテナ上でのコマンドの実行 (exec)
Pod内のコンテナに対してコマンドを実行する場合にkubectl exec
コマンドを利用します。
これを利用して擬似端末を生成して(-t
)、標準入力をパススルー(-i
)指定しながら /bin/sh
を起動することであたかもコンテナにSSHログインしているような状況を作れます。
これによりクラスター上のコンテナ内における操作が可能になります。
# Pod内のコンテナで /bin/shを実行
$ kubectl exec -it sample-pod -- /bin/sh
# 複数コンテナが入ったPodで指定のコンテナに対して/bin/shを実行
$ kubectl exec -it sample-pod -c mysql-container -- /bin/sh
debug
インタラクティブなデバッグ用コンテナを利用してクラスターリソースをデバッグします。
debug
コマンドはクラスターオブジェクトに対してよくあるでバッキングタスクの自動化を提供します。対象オブジェクトはリソースと名前で指定されます。未指定の場合はデフォルトでPodが対象になります。
debugアクションは指定されたリソースによって異なる振る舞いをします
- Workload: 既存のPodを元に一部属性を変えて作成します。ex)イメージタグを変更してコピー
- Workload: 既存のPodに対して一時的なコンテナを追加。ex)podの再起動なしでのでバッキングユーリティティの追加
- Node: ノードのホストのnamespace上に新規にPodを作成してNodeのファイルシステムにアクセスする
ex)
# デバッグ用コンテナを起動して接続
$ kubectl debug mypod --image=busybox -it -- bash
クリーンアップ
不要なリソースを次のコマンドで削除します。
# GKEクラスタ「k8s」を削除
$ gcloud container clusters delete k8s --zone asia-northeast1-a
Discussion