
Kubernetes管理者にとって欠かせないツールが、クラスタを効率的に運用するためのコマンドラインインターフェース「kubectl」です。
kubectl(読み方は「キューブコントロール」または「キューブ・シー・ティー・エル」)は、Kubernetes APIサーバーとの直接的な対話手段です。アプリのデプロイ、リソースの確認、ログの参照など、クラスタ内のほぼあらゆる操作をこの1つのツールで実行できます。DevOpsエンジニア、プラットフォーム管理者、コンテナアプリ開発者のいずれにとっても、kubectlを使いこなすことはクラウド環境でのKubernetes運用に不可欠です。
本チートシートでは、よく使うkubectlコマンドを実践例とコツとともに紹介し、日々のKubernetes業務を一段上のレベルへ引き上げるお手伝いをします。
kubectlコマンドの主要カテゴリ
Kubectl logo
kubectlコマンドは、クラスタ管理のさまざまな側面に対応する3つの主要カテゴリに分類できます。
1. クラスタ情報コマンド
クラスタ情報コマンドは、Kubernetesクラスタの状態と構成を把握するためのコマンドです。
- クラスタコンポーネントの情報取得
- ノードのステータスとリソース確認
- apiserverのヘルスチェック
- コントロールプレーンのコンポーネント検査
2. リソース管理コマンド
リソース管理コマンドでは、Kubernetesリソースの作成・変更・削除・確認が行えます。
- リソースの作成・更新
- リソースの一覧表示と詳細確認
- リソースの削除
- リソースのスケールアップ/ダウン
- リソースのリアルタイム編集
3. アプリケーションデプロイコマンド
アプリケーションデプロイコマンドは、デプロイの実行とアプリのライフサイクル管理を支援します。
- YAMLまたはJSONからアプリをデプロイ
- デプロイメントとロールアウトの管理
- オートスケーリングの設定
- アプリ設定の更新
- アプリのネットワーク設定
これら3つのカテゴリを踏まえて、Kubernetesの運用で頻繁に使う具体的なkubectlコマンドを見ていきましょう。
さらに詳しく:kubectlコマンドチートシート
person coding on laptop
以下は、日常的に使う頻度の高いkubectlコマンドを、Kubernetesワークフローを効率化する実例とともにまとめたチートシートです。手元に置いてお使いください。
Pods
PodはKubernetesにおける最小のデプロイ単位で、ストレージとネットワークリソースを共有する1つ以上のコンテナで構成されます。
すべてのPodを一覧表示:
kubectl get pods
詳細情報付きでPodを一覧表示:
kubectl get pods -o wide
特定のPodの詳細情報を取得:
kubectl describe pod
YAMLファイルからPodを作成:
kubectl apply -f pod.yaml
Podを削除:
kubectl delete pod
Pod内のコンテナでコマンドを実行:
kubectl exec -it --
Podのログを取得:
kubectl logs
Podのログをリアルタイムでストリーミング:
kubectl logs -f
マルチコンテナPod内の特定コンテナのログを取得:
kubectl logs -c
Podへのポートフォワード:
kubectl port-forward :
Podとファイルをコピー:
kubectl cp :/path/to/file /local/path
kubectl cp /local/path :/path/in/pod
Services
ServiceはPodに安定したネットワークを提供し、抽象化レイヤーとして各コンポーネント間の通信をスムーズにします。
すべてのServiceを一覧表示:
kubectl get services
Serviceの詳細情報を取得:
kubectl describe service
YAMLファイルからServiceを作成:
kubectl apply -f service.yaml
DeploymentをServiceとして公開:
kubectl expose deployment --port= --target-port=
Serviceを削除:
kubectl delete service
Serviceに紐づくエンドポイントを表示:
kubectl get endpoints
ClusterIP Serviceを作成:
kubectl create service clusterip --tcp=:
NodePort Serviceを作成:
kubectl create service nodeport --tcp=:
**** LoadBalancer Serviceを作成:
kubectl create service loadbalancer --tcp=:
Deployments
DeploymentはPodおよびReplicaSetへの宣言的な更新を実現し、スケーリングやアプリの更新を容易にします。
すべてのDeploymentを一覧表示:
kubectl get deployments
Deploymentの詳細情報を取得:
kubectl describe deployment
YAMLファイルからDeploymentを作成:
kubectl apply -f deployment.yaml
コマンドラインから直接Deploymentを作成:
kubectl create deployment --image=
Deploymentをスケール:
kubectl scale deployment --replicas=
Deploymentのコンテナイメージを更新:
kubectl set image deployment/ =
Deploymentを以前のリビジョンにロールバック:
kubectl rollout undo deployment/
Deploymentのロールアウト状況を確認:
kubectl rollout status deployment/
Deploymentのロールアウト履歴を表示:
kubectl rollout history deployment/
Deploymentのロールアウトを一時停止:
kubectl rollout pause deployment/
Deploymentのロールアウトを再開:
kubectl rollout resume deployment/
ConfigMapとSecret
ConfigMapとSecretは、それぞれ設定データと機密情報の保存に使われます。
セキュリティ上の重要な注意点: ConfigMapとSecretはいずれもデフォルトでetcdに暗号化されずに保存されます。機密データを扱う際は、必ず保存時の暗号化を有効化してください。
ConfigMapを一覧表示:
kubectl get configmaps
リテラル値からConfigMapを作成:
kubectl create configmap --from-literal=key1=value1 --from-literal=key2=value2
ファイルからConfigMapを作成:
kubectl create configmap --from-file=
ConfigMapの詳細情報を取得:
kubectl describe configmap
ConfigMapを削除:
kubectl delete configmap
Secretを一覧表示:
kubectl get Secrets
リテラル値からSecretを作成:
kubectl create secret generic --from-literal=key1=value1 --from-literal=key2=value2
ファイルからSecretを作成:
kubectl create secret generic --from-file=
Secretの詳細情報を取得:
kubectl describe secret
Secretを削除:
kubectl delete secret
kubectl活用のプロのコツ
person looking at phone while coding
kubectlは、Kubernetesクラスタを操作しリソースを管理するうえで欠かせないコマンドラインツールです。使い方を押さえておけば、デプロイ・スケーリング・トラブルシューティングを格段に効率化できます。kubectl editを使えば、Podやデプロイメントといったリソースをコマンドラインから直接、すばやく書き換えることも可能です。
Namespaceを使いこなす
NamespaceはKubernetesの基本機能の1つで、クラスタを仮想的なサブクラスタに分割できます。マルチテナント環境や、複雑なアプリを扱う際にとても役立ちます。
特定のNamespaceのリソースを一覧表示:
kubectl get -n
特定のNamespaceにリソースを作成:
kubectl apply -f <file.yaml> -n
すべてのkubectlコマンドのデフォルトNamespaceを設定:
kubectl config set-context --current --namespace=
すべてのNamespaceを横断してリソースを表示:
kubectl get --all-namespaces
新しいNamespaceを作成:
kubectl create namespace
関連するリソースを同じNamespaceにまとめておくと、アプリやチームごとの境界が明確になります。dev-frontend、prod-backend、monitoringのように、用途が一目でわかる名前を付けるのがおすすめです。
ラベルセレクタによるリソースのフィルタリング
ラベルはKubernetesオブジェクトに付与するキーと値のペアで、リソースグループの整理・選択・管理を効率化できます。
特定のラベルを持つリソースを一覧表示:
kubectl get -l key=value
複数のラベル条件でリソースを一覧表示:
kubectl get -l ‘key1=value1,key2=value2’
特定のラベルキーを持つリソースを一覧表示(値は問わない):
kubectl get -l ‘key’
特定のラベルを持たないリソースを一覧表示:
kubectl get -l ‘!key’
既存のリソースにラベルを追加:
kubectl label key=value
リソースからラベルを削除:
kubectl label key-
リソースを効果的に管理するには、一貫したラベル付けの方針が欠かせません。app、environment、tier、version、ownerといったラベルを活用して、わかりやすく整理されたリソース体系を作りましょう。
ローリングアップデートを活用する
Kubernetesではローリングアップデートを使うことで、ダウンタイムなしにアプリを更新できます。旧バージョンのインスタンスを段階的に新バージョンへと置き換えていく仕組みです。
新しいイメージでDeploymentを更新(ローリングアップデートが発動):
kubectl set image deployment/ =:
ロールアウト状況を確認:
kubectl rollout status deployment/
Deployment YAMLで更新戦略を設定:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
問題が発生した場合は以前のバージョンにロールバック:
kubectl rollout undo deployment/
Deploymentのロールアウトを一時停止:
Copykubectl rollout pause deployment/
これは段階的なデプロイで特に役立ちます。一部のPodにだけリリースして動作を検証し、問題なければロールアウトを再開できます。
Deploymentのロールアウトを再開:
Copykubectl rollout resume deployment/
重要なアプリでは、Deployment変更時に--recordフラグを付けるのがおすすめです。実行したコマンドが注釈として残るので、後から変更履歴を簡単にたどれます。
kubectl apply -f deployment.yaml --record
リソースクォータと制限を慎重に管理する
リソース管理はKubernetes運用の要です。適切なリソースリクエストと制限を設定することで、クラスタの安定性を保ち、リソースの公平な配分を実現できます。
Namespace内のリソースクォータを表示:
kubectl get resourcequota -n
Namespaceにリソースクォータを作成:
kubectl create quota --hard=cpu=1,memory=1G,pods=10 -n
Podのリソース使用状況を確認:
kubectl top pods
ノードのリソース使用状況を確認:
kubectl top nodes
コンテナ仕様を定義する際は、必ずリソースリクエストと制限を設定しましょう。
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
リソースリクエストはスケジューラがPodの配置先を決める際に使われ、制限はコンテナが終了させられる可能性のある最大使用量を表します。基本は、リクエストを定常時の想定使用量に、制限をピーク時に許容できる値に合わせて設定するとよいでしょう。
kubectlでデバッグを使いこなす
Kubernetesアプリを安定稼働させるには、デバッグが欠かせません。kubectlにはトラブルシューティングを手助けするコマンドが豊富に揃っています。
コンテナのログを取得:
kubectl logs -c
一時Podでインタラクティブにデバッグ:
kubectl run debug --rm -it --image=busybox -- sh
既存のPodにアタッチしたデバッグコンテナを作成:
kubectl debug -it --image=busybox --share-processes --copy-to=
Namespace内のイベントを表示:
kubectl get events -n
Podの状態とステータス詳細を確認:
Copykubectl describe pod
このコマンドはPodの状態を構造化された形式で出力し、遷移履歴と現在の状態を読みやすく表示します。
ネットワークデバッグ用コンテナでPod間の接続を確認:
kubectl run test-connectivity --rm -it --image=nicolaka/netshoot -- bash
繰り返し発生する問題には、--previousフラグで過去にクラッシュしたコンテナのログを確認すると有効です。
kubectl logs --previous
kubectlでのセキュリティのベストプラクティス
two people coding on laptop
Kubernetesクラスタを安全に保つことは非常に重要であり、kubectlはその要となるツールです。セキュリティをしっかり押さえるためのベストプラクティスを紹介します。
RBACでアクセス制御を管理する
ロールベースアクセス制御(RBAC)はKubernetesにおける認可の標準的な仕組みで、ユーザーやサービスアカウントに対してきめ細かな権限を定義できます。
Namespace内のロールを表示:
kubectl get roles -n
クラスタロールを表示:
kubectl get clusterroles
ロールバインディングを表示:
kubectl get rolebindings -n
クラスタロールバインディングを表示:
kubectl get clusterrolebindings
特定の権限を持つロールを作成:
kubectl create role developer --verb=get,list,watch --resource=pods,deployments -n
ロールをユーザーにバインド:
kubectl create rolebinding dev-user-binding --role=developer --user=dev-user -n
可能な限りClusterRoleBindingsではなくRoleBindingsを使い、権限を特定のNamespaceに限定しましょう。必要なNamespaceにだけアクセスを絞ることで最小権限の原則に沿うことができ、認証情報が漏洩した際の影響範囲も抑えられます。
最小権限の原則に従い、ユーザーやサービスアカウントには業務に必要な権限だけを付与しましょう。役割や責任の変化に合わせて、ロールバインディングを定期的に見直す習慣をつけることも大切です。
Secretの安全な取り扱い
Kubernetes SecretはAPIキー、パスワード、証明書といった機密情報を扱うため、慎重に取り扱う必要があります。
ファイルから安全にSecretを作成:
kubectl create secret generic db-credentials --from-file=./username.txt --from-file=./password.txt
TLS Secretを作成:
kubectl create secret tls tls-secret --cert=path/to/cert --key=path/to/key
Secretを環境変数としてマウント:
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
Secretをファイルとしてマウント:
volumes:
- name: secret-volume
secret:
secretName: ssl-certificates
セキュリティをさらに高めたい場合は、HashiCorp Vault、AWS Secrets Manager、Sealed Secretsといった外部のシークレット管理ツールの活用も検討してください。シークレットのローテーション、監査ログ、暗号化など、便利な機能が揃っています。
正しいコンテキストでkubectlを使う
誤って意図しないクラスタを操作してしまわないよう、常に正しいコンテキストで作業しているかを確認しましょう。
利用可能なすべてのコンテキストを表示:
kubectl config get-contexts
特定のコンテキストに切り替え:
kubectl config use-context
現在のコンテキストを表示:
kubectl config current-context
現在のコンテキストにNamespaceを設定:
kubectl config set-context --current --namespace=
重要な本番環境では、シェルプロンプトなどに視覚的な目印を入れて、現在のクラスタとNamespaceがひと目でわかるようにしておくと安心です。誤ったリソースへの操作を防ぎやすくなります。
ネットワークポリシーを活用する
ネットワークポリシーはKubernetesクラスタ内のファイアウォールとして機能し、Pod間の通信を制御します。
ネットワークポリシーを一覧表示:
kubectl get networkpolicies
すべてのIngressトラフィックをデフォルトで拒否するネットワークポリシーを作成:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
EOF
特定のトラフィックを許可するネットワークポリシーを作成:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
EOF
まずは「すべて拒否」のネットワークポリシーをベースラインとし、必要なトラフィックだけを許可していく方式がおすすめです。最小権限の原則を実践し、攻撃対象領域を最小限に保てます。
kubectlコマンドとベストプラクティスでKubernetes運用を極めよう
kubectlはKubernetesの世界で欠かせない存在であり、クラスタを管理・操作するための頼れるインターフェースです。本チートシートで紹介したコマンドとベストプラクティスを身につければ、コンテナアプリ運用のさまざまな課題にも自信を持って向き合えるようになります。
Kubernetesは進化を続けており、kubectlも同様です。新機能やアップデートを常にチェックし、クラスタ管理スキルを磨き続けましょう。
Kubernetesのサービス用IPレンジ拡張など、より高度なトピックに踏み込みたい方は、サービス用IPレンジをスムーズに拡張する方法の詳細ガイドをぜひご覧ください。
Kubernetes環境が拡大し複雑になるほど、適切なツールと知識の重要性は増していきます。そこで頼れるのがDoiTです。当社のグローバルなクラウドアーキテクトチームは、コスト効率に優れ、スケーラブルで耐障害性の高いクラウドインフラ構築を支援してきました。難解なKubernetesの構成・連携の課題から、トラブルシューティング、運用効率の改善まで、しっかりとサポートします。
お気軽にご相談ください。コンテナオーケストレーション戦略を最適化し、パフォーマンスとコストの両立を実現するためのご支援についてご案内します。