kubectlによるKubernetesクラスター・コンテナ操作まとめ


概要

個人の備忘録としてkubectlコマンドを利用してKubernetesクラスタの作成や削除、又はクラスター上におけるコンテナリソース(Pod)の作成・更新・削除、さらにコンテナへの接続・コマンドの実行やデバッグ等の方法についてまとめていきます。

参考

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

実行にあたっての前提

今回の

  • 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コマンドを利用します

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#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 applykubectl createコマンドを混在して利用しているとkubectl apply実行時に差分が適切に検出しきれない場合があるためです。

コンテナ上でのコマンドの実行 (exec)

Pod内のコンテナに対してコマンドを実行する場合にkubectl execコマンドを利用します。

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#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

インタラクティブなデバッグ用コンテナを利用してクラスターリソースをデバッグします。

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#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