🐄

[入門]kubectlの概要

2022/04/03に公開

概要

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 -

ヘルプを表示

# ヘルプ表示
$ kubectl -h
kubectl controls the Kubernetes cluster manager.

 Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/

Basic Commands (Beginner):
  create        Create a resource from a file or from stdin
  expose        Take a replication controller, service, deployment or pod and expose it as a new Kubernetes service
  run           Run a particular image on the cluster
  set           Set specific features on objects

Basic Commands (Intermediate):
  explain       Get documentation for a resource
  get           1つまたは複数のリソースを表示する
  edit          Edit a resource on the server
  delete        Delete resources by file names, stdin, resources and names, or by resources and label selector

Deploy Commands:
  rollout       Manage the rollout of a resource
  scale         Set a new size for a deployment, replica set, or replication controller
  autoscale     Auto-scale a deployment, replica set, stateful set, or replication controller

Cluster Management Commands:
  certificate   Modify certificate resources.
  cluster-info  Display cluster information
  top           Display resource (CPU/memory) usage
  cordon        Mark node as unschedulable
  uncordon      Mark node as schedulable
  drain         Drain node in preparation for maintenance
  taint         Update the taints on one or more nodes

Troubleshooting and Debugging Commands:
  describe      Show details of a specific resource or group of resources
  logs          Print the logs for a container in a pod
  attach        Attach to a running container
  exec          Execute a command in a container
  port-forward  Forward one or more local ports to a pod
  proxy         Run a proxy to the Kubernetes API server
  cp            Copy files and directories to and from containers
  auth          Inspect authorization
  debug         Create debugging sessions for troubleshooting workloads and nodes

Advanced Commands:
  diff          Diff the live version against a would-be applied version
  apply         Apply a configuration to a resource by file name or stdin
  patch         Update fields of a resource
  replace       Replace a resource by file name or stdin
  wait          Experimental: Wait for a specific condition on one or many resources
  kustomize     Build a kustomization target from a directory or URL.

Settings Commands:
  label         リソースのラベルを更新する
  annotate      リソースのアノテーションを更新する
  completion    Output shell completion code for the specified shell (bash or zsh)

Other Commands:
  api-resources Print the supported API resources on the server
  api-versions  Print the supported API versions on the server, in the form of "group/version"
  config        kubeconfigを変更する
  plugin        Provides utilities for interacting with plugins
  version       Print the client and server version information

Usage:
  kubectl [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

kubectl explain: リソースのドキュメントを表示します

# リソース「deployment」のドキュメントを表示
$ kubectl explain deployment
KIND:     Deployment
VERSION:  apps/v1

DESCRIPTION:
     Deployment enables declarative updates for Pods and ReplicaSets.

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   spec	<Object>
     Specification of the desired behavior of the Deployment.

   status	<Object>
     Most recently observed status of the Deployment.
# 利用可能なAPIリソースの一覧を表示
$ kubectl api-resources

https://kubernetes.io/docs/reference/kubectl/#resource-types

Discussion