[入門]kubectlの概要


概要

kubectlについて個人的備忘録として下記の公式ドキュメントの内容をまとめていきます。
具体的にはkubectlの概要、インストール方法、構文、コマンド操作、具体例についてみていきます。

参考

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

kubectlとは

KubernetesAPIを利用したKubernetes clusterのcontrole planeと通信するためのCLIツールがkubectlです。

kubectlをインストール

ここではmacOSを対象としたインストール方法についてまとめていきます。

参考

https://kubernetes.io/docs/tasks/tools/install-kubectl-macos/

インストール方法

  1. curlによるkubectl binaryをインストール
  2. Homebrewを使ったインストール
  3. Macportsを使ったインストール

今回はHomebrewを使ってインストールしていきます。

$ brew install kubectl

or

$ brew install kubernetes-cli

インストール完了後、バージョンを確認します。

$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:38:33Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"darwin/amd64"}

kubectlの設定を検証

Kubernetesクラスターを見つけてアクセスするために、kubeconfig fileが必要です。このファイルはkube-up.shを利用してクラスターを作成した際やMinikubeのデプロイ成功時に自動で作成されます。
デフォルトではkubectlの設定は~/.kube/configに格納されます。

正しく設定されていることを確かめるには次のコマンドを実行します。

$ kubectl cluster-info

コマンド実行後、URLが返却されれば、クラスタに接続するための設定が正しく行われていることを確認できます。

次のようなメッセージが表示された場合は、正しく設定されていないかKubernetesクラスターにアクセスすることができません。

$ kubectl cluster-info

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
The connection to the server localhost:8080 was refused - did you specify the right host or port?

kubeconfigファイル

kubeconfigファイルはクラスターやユーザー、namespace,そして認証に関する設定を行います。
kubectlはkubeconfigファイルを利用してクラスターを選択しクラスターのAPIサーバーと通信します。

kubectlはデフォルトで$HOME/.kubeディレクトリ下のファイルconfigを探します。
環境変数KUBECONFIGまたは設定フラグ--kubeconfigを利用してそのほかのkubeconfigファイルを指定することもできます。

次のコマンドで現在のconfigの設定内容を確認できます

$ kubectl config view

複数のクラスター、ユーザー、認証メカニズム

kubeconfigファイルを利用することで、複数のクラスター、ユーザー、namespaceを管理することができます。そして Context(後述)を利用することでクラスターとnamespaceを素早く切り替えることができます。

Context

kubeconfigファイルのcontext要素はアクセスパラメータをグループ化するために使われます。
それぞれのcontextは3つのパラメータ:cluster, namespace, userを持ちます。
デフォルトで、kubectlコマンドはcurrent contextで指定されたパラメータを使ってクラスターと通信します。

current contextを選択するには次のコマンドを実行します

# Contextの一覧を表示
$ kubectl config get-contexts

# 指定したcontextに切り替え
$ kubectl config use-context {Context名}

# 現在のcontextを表示
$ kubectl config current-context

又、--contextオプションを利用することで各コマンドの実行ごとにContextを指定することもできます。

$ kubectl --context {context名} get pod

kubectlの構文

kubectl [command] [TYPE] [NAME] [flags]
  • command: 1つ以上のリソースに対して実行したオペレーションを指定します。
    ex)create, get, describe, delete
  • TYPE: resorce typeを指定します。リソースタイプは大文字小文字を区別せず、単数形や複数形、省略形を指定できます。例えば次のコマンドは同じ結果になります。
kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1
  • NAME: リソース名を指定します。大文字小文字は区別します。nameを省略した場合、全てのリソースの詳細が表示されます。ex) kubectl get pods
    複数のリソースに対して操作を行う場合は、各リソースをタイプと名前で指定するか、1つまたは複数のファイルを指定できます。
    • リソースと名前で指定する場合
      • タイプがすべて同じとき、リソースをグループ化するには→TYPE1 name1 name2 name<#>とします。
        ex)kubectl get pod example-pod1 example-pod2
        - 複数のリソースタイプを個別に指定する場合→TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>とします。
        ex)kubectl get pod/example-pod1 replicationcontroller/example-rc1
    • リソースを1つ以上のファイルで指定する場合→ -f file1 -f file2 -f file<#>とします。
      ex)kubectl get -f ./pod.yaml
  • flags:オプショナルなフラグを指定します。例えば、-sまたは--serverフラグでKubernetes API serverのアドレスとポートを指定できます。

操作

以下の表にkubectlコマンドで利用可能な操作から抜粋したものを紹介します。

操作 構文 説明
alpha kubectl alpha SUBCOMMAND [flags] α版の機能に該当するコマンドを一覧表示します。
apply kubectl api-resources [flags] ファイルまたは標準入力からリソースの設定変更を適用します
auth kubectl auth [flags] [options] 認可を検査します。
config kubectl config SUBCOMMAND [flags] kubeconfigファイルを変更します
create kubectl create -f FILENAME [flags] ファイルまたは標準入力から1つ以上のリソースを作成します。
delete kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags] ファイル、標準出力、またはラベルセレクター、リソースセレクター、リソースを指定して、リソースを削除します
describe kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags] 一つ以上のリソースの詳細なステータスを表示します。
diff kubectl diff -f FILENAME [flags] ファイルまたは標準出力と、現在の設定との差分を表示します。
exec kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]] pod内のコンテナに対してコマンドを実行します
expose kubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [flags] ReplicationController、Service又はPodを、新しいKubernetesサービスとして公開します。
get kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags] 1つ以上のリソースを表示します。
logs kubectl logs POD [-c CONTAINER] [--follow] [flags] pod内のコンテナのログを表示します
top kubectl top [flags] [options] リソース (CPU/Memory/Storage) の使用量を表示します

その他完全の一覧とその詳細は次のそれぞれの資料を参考ください。

一般的な操作例

kubectl apply

# Create a service using the definition in example-service.yaml.
kubectl apply -f example-service.yaml

# Create a replication controller using the definition in example-controller.yaml.
kubectl apply -f example-controller.yaml

# Create the objects that are defined in any .yaml, .yml, or .json file within the <directory> directory.
kubectl apply -f <directory>

kubectl get

# List all pods in plain-text output format.
kubectl get pods

# List all pods in plain-text output format and include additional information (such as node name).
kubectl get pods -o wide

# List the replication controller with the specified name in plain-text output format. Tip: You can shorten and replace the 'replicationcontroller' resource type with the alias 'rc'.
kubectl get replicationcontroller <rc-name>

# List all replication controllers and services together in plain-text output format.
kubectl get rc,services

# List all daemon sets in plain-text output format.
kubectl get ds

# List all pods running on node server01
kubectl get pods --field-selector=spec.nodeName=server01

kubectl describe

# Display the details of the node with name <node-name>.
kubectl describe nodes <node-name>

# Display the details of the pod with name <pod-name>.
kubectl describe pods/<pod-name>

# Display the details of all the pods that are managed by the replication controller named <rc-name>.
# Remember: Any pods that are created by the replication controller get prefixed with the name of the replication controller.
kubectl describe pods <rc-name>

# Describe all pods
kubectl describe pods

kubectl exec

# Get output from running 'date' from pod <pod-name>. By default, output is from the first container.
kubectl exec <pod-name> -- date

# Get output from running 'date' in container <container-name> of pod <pod-name>.
kubectl exec <pod-name> -c <container-name> -- date

# Get an interactive TTY and run /bin/bash from pod <pod-name>. By default, output is from the first container.
kubectl exec -ti <pod-name> -- /bin/bash

kubectl logs

# Return a snapshot of the logs from pod <pod-name>.
kubectl logs <pod-name>

# Start streaming the logs from pod <pod-name>. This is similar to the 'tail -f' Linux command.
kubectl logs -f <pod-name>

kubectl diffs

# Diff resources included in "pod.json".
kubectl diff -f pod.json

# Diff file read from stdin.
cat service.yaml | kubectl diff -f -