[k8s] kubectl get コマンドの使い方(実例付)

kubectl getコマンド解説

 本記事はkubectlコマンド v1.22.2の環境で確認しています。

 kubectl get コマンドは、Kubernetes内の各種リソースの情報を出力するためのものです。

 PodやNode、Deploymentなどはもちろんのこと、EventsやRole、Endpointsなど様々なリソースに関する情報を出力することが可能です。

 出力形式は、単にリソース名のみの出力から、必要最低限の情報、JSON形式、YAML形式など、多くの種類が用意されています。

kubectl get コマンドのフォーマットとオプション

フォーマット

kubectl get [リソースタイプ] [リソース名] [オプション]

主なリソースタイプ

 kubectl getコマンドがサポートしているリソースタイプは、以下のコマンドで確認できます。

$ kubectl api-resources

 その中で主なものを挙げます。

リソースタイプ概説省略形
nodesノードno
podsポッドpo
servicesサービスsvc
deploymentsデプロイメントdeploy
replicasetsレプリカセットrs
namespacesネームスペースns

主なオプション

 kubectlコマンドのオプションには、kubectl get コマンド固有のオプションとkubectlコマンド共通のオプションがあります。

kubectl get コマンド固有のオプション

 kubectl get コマンド固有のオプションの中で主なものを挙げます。

 「kubectl get -h」コマンドで確認可能なオプションです。

オプション概説
--all-namespaces、-Aすべての名前空間内に存在するオブジェクトを
出力する
--filename、-f指定したファイル内に記載されているオブジェ
クトの情報を出力する
--output、-o出力形式を指定する
(主な出力形式)json、yaml、wide、name

kubectlコマンド共通のオプション

 kubectlコマンド共通のオプションは、以下のコマンドで確認できます。

$ kubectl options

 その中で主なものを挙げます。

オプション概説
-n, --namespace=''指定した名前空間内のリソース情報を取得する
-s, --server=''指定したAPI serverに接続する
--context=''kubeconfig内のコンテキストを指定する。
デフォルトはdefault。

コマンド例

$ kubectl get pods
$ kubectl get deploy -o yaml

kubectl get コマンドの主な使い方

 以下で、実例をまじえたコマンドの使い方を解説していきます。

本記事内のコマンド実行で使用しているユーザは、rootではなく、kubectlコマンドを利用可能にする設定を行った一般ユーザです。

一般ユーザ(例えばadminkube)がkubectlを使えるようにするには、対象ユーザでログインした後、以下のコマンドを実行してください。

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

※出典:Kubernetes公式サイト

基本事項の解説

 kubectl getコマンドは、リソースの現状を把握するために使用します。

 kubectl getコマンドがサポートしているリソースは、上のほうでご紹介しました「kubectl api-resources」コマンドで確認できます。

 何か調べたいリソースがある場合はとりあえず「kubectl api-resources」で対象物がサポートされているか確認し、見つかったら「kubectl get <リソース名>」を実行してみましょう。

 必要な項目が表示されない場合は、「-o wide」オプションを付与して再度実行してみることをおすすめします。

 kubectl getコマンドで出力されるリソースは、namespaceオプションで名前空間を指定しない場合は、デフォルトでは「default」名前空間に所属するリソースの情報のみ対象となります。

Nodeの情報を出力する

 本記事で使用してますKubernetes環境は、マスターノード1台、ワーカーノード2台で構成されています。

 ノードの情報を出力する場合は以下のコマンドを実行します。

$ kubectl get node

 以下の内容が出力されます。

NAME       STATUS   ROLES                  AGE   VERSION
kube001c   Ready    control-plane,master   24d   v1.22.2
kube002c   Ready    <none>                 24d   v1.22.2
kube003c   Ready    <none>                 16d   v1.22.2

 一番上の「kube001c」がマスターノードになります。「kube002c」と「kube003c」はワーカーノードです。

 STATUSはノードの状態で、「Ready」は正常な状態です。ノードがダウンしていたり、必要なサービスが起動されていない場合などは「NotReady」と表示されます。

 下は、「kube003c」をシャットダウンしたときの状態になります。

NAME       STATUS     ROLES                  AGE   VERSION
kube001c   Ready      control-plane,master   24d   v1.22.2
kube002c   Ready      <none>                 24d   v1.22.2
kube003c   NotReady   <none>                 16d   v1.22.2

 ROLESはノードに設定されている特定のラベル名の一部が表示されています。

 オブジェクトに付与するラベルに関しましては、別途kubectl labelコマンドの記事で解説する予定です。(2021年10月時点:記事未作成)

 AGEにはノードの稼働時間、VERSIONにはノードのKubernetesのバージョンが表示されます。

 オプションとして「-o wide」を付けて実行しますと、出力される情報が増えます。

$ kubectl get node -o wide

 以下のように出力されました。

NAME       STATUS   ROLES                  AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
kube001c   Ready    control-plane,master   25d   v1.22.2   192.168.1.156   <none>        Ubuntu 20.04.3 LTS   5.4.0-89-generic   containerd://1.4.10
kube002c   Ready    <none>                 24d   v1.22.2   192.168.1.157   <none>        Ubuntu 20.04.3 LTS   5.4.0-89-generic   containerd://1.4.10
kube003c   Ready    <none>                 16d   v1.22.2   192.168.1.158   <none>        Ubuntu 20.04.3 LTS   5.4.0-88-generic   containerd://1.4.11

 ノードの物理IPアドレスやOSのバージョン、コンテナランタイムのバージョンなどが追加で出力されていることがわかります。

Podの情報を出力する

 現在Kubernetes内に存在するdefault名前空間内のPodの一覧を表示してみます。

 以下のコマンドを実行してください。

$ kubectl get pods

 以下のような内容が表示されます。

NAME                           READY   STATUS    RESTARTS       AGE
deploy-test-64988f78fc-bnczx   1/1     Running   2 (5h7m ago)   5d
deploy-test-64988f78fc-n6klq   1/1     Running   2 (5h7m ago)   5d
deploy-test-64988f78fc-x2tk2   1/1     Running   2 (5h7m ago)   5d

 現在実行中(STATUSがRunning)のPodが出力されました。

 クラスタ内に3つのPodが動いていて、稼働時間は5時間、2回再起動されていることがわかります。

 ワーカーノードが複数ある場合は、各Podがどのノードで実行しているか知りたいことが良くあります。

 その場合は「-o wide」オプションを付けて実行します。

$ kubectl get pods -o wide

 以下のように出力されました。

NAME                           READY   STATUS    RESTARTS        AGE    
IP            NODE       NOMINATED NODE   READINESS GATES
deploy-test-64988f78fc-bnczx   1/1     Running   2 (5h24m ago)   5d1h   10.244.1.67   kube002c   <none>           <none>
deploy-test-64988f78fc-n6klq   1/1     Running   2 (5h24m ago)   5d1h   10.244.1.69   kube003c   <none>           <none>
deploy-test-64988f78fc-x2tk2   1/1     Running   2 (5h24m ago)   5d1h   10.244.1.68   kube002c   <none>           <none>

 NODEの列に「kube002c」、「kube003c」と表示されていまして、これは私の環境にある2つのワーカーノードのホスト名になります。

 この情報によって、各Podがどのノードで動いているか確認できます。

 IPの列に出力されているIPアドレスは、各Podに自動的に割り当てられたアドレスになります。クラスタ内部から各Podにアクセス可能なIPアドレスです。

Deploymentの情報を出力する

 現在Kubernetes内に存在するdefault名前空間内のDeploymentの一覧を表示してみます。

 以下のコマンドを実行してください。

$ kubectl get deployment

 以下のような内容が表示されます。

NAME          READY   UP-TO-DATE   AVAILABLE   AGE
deploy-test   3/3     3            3           5d3h

 「-o wide」オプションを付けて実行してみます。

$ kubectl get deployment -o wide

 以下のように出力されました。

NAME          READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   
IMAGES                      SELECTOR
deploy-test   3/3     3            3           5d3h   test-pod     k8s.gcr.io/echoserver:1.4   app=web-pods

 「-o wide」オプションを付けない場合はDeployment内で動いているPod数くらいしか把握できませんが、オプションを付けますとDeployment内のPodのコンテナ名やイメージ、付与されたラベル名なども分かります

 このDeploymentは、以下のマニフェストを使用して作成したものです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-test
spec:
  selector:
    matchLabels:
      app: web-pods
  replicas: 3
  template:
    metadata:
      labels:
        app: web-pods
    spec:
      containers:
      - name: test-pod
        image: k8s.gcr.io/echoserver:1.4

Serviceの情報を出力する

 現在Kubernetes内に存在するdefault名前空間内のServiceの一覧を、表示してみます。

 以下のコマンドを実行してください。

$ kubectl get service

 以下のような内容が表示されます。

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP          20d
service-test-np   NodePort    10.104.58.175   <none>        8080:30808/TCP   5d4h

 Podのときと同じように、「-o wide」オプションを付けて実行してみます。

$ kubectl get service -o wide

 以下のように出力されました。

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE    SELECTOR
kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP          20d    <none>
service-test-np   NodePort    10.104.58.175   <none>        8080:30808/TCP   5d4h   app=web-pods

 「-o wide」オプションを付けて実行しますと、「SELECTOR」の列が追加されました。

 上の例では、service-test-npという名前のサービスのSELECTORに、「app=web-pods」という値が表示されています。

 service-test-npというサービスは、以下のマニフェストで作成しました。

apiVersion: v1
kind: Service
metadata:
  name: service-test-np
spec:
  type: NodePort
  selector:
    app: web-pods
  ports:
    - port: 8080
      nodePort: 30808

 7,8行目を見ますと、selectorとして「app: web-pods」と設定されていることがわかります。

 「app: web-pods」は、「Deploymentの情報を出力する」の節で例として使用しましたDeployment用のマニフェストで、Podに付けたラベルです。

 つまり、「-o wide」オプションを付けてサービスの状態を確認しますと、サービス内で動いているPodの情報がわかることになります。

名前を指定して特定オブジェクトの情報を出力する

 特定のPodやDeploymentなどの情報を出力する場合は、オブジェクト名を指定してコマンドを実行します。

 現在3つのPodが起動中です。

$ kubectl get pods
NAME                           READY   STATUS    RESTARTS       AGE
deploy-test-64988f78fc-bnczx   1/1     Running   2 (5h7m ago)   5d
deploy-test-64988f78fc-n6klq   1/1     Running   2 (5h7m ago)   5d
deploy-test-64988f78fc-x2tk2   1/1     Running   2 (5h7m ago)   5d

 一番上のPodの「deploy-test-64988f78fc-bnczx」だけの情報を出力したい場合は、以下のようにコマンドを実行します。

$ kubectl get pods deploy-test-64988f78fc-bnczx

 出力内容は以下の通りです。

$ kubectl get pods
NAME                           READY   STATUS    RESTARTS       AGE
deploy-test-64988f78fc-bnczx   1/1     Running   2 (5h7m ago)   5d

 オブジェクト名を複数個指定することも可能です。

 最初に出力しました3つのPodの内、1つ目と3つ目のPodのみ指定する場合は、以下のように記述します。

$ kubectl get pods deploy-test-64988f78fc-bnczx deploy-test-64988f78fc-x2tk2

 半角スペース区切りで名前を並べるだけです。

 出力内容は以下の通りです。

$ kubectl get pods
NAME                           READY   STATUS    RESTARTS       AGE
deploy-test-64988f78fc-bnczx   1/1     Running   2 (5h7m ago)   5d
deploy-test-64988f78fc-x2tk2   1/1     Running   2 (5h7m ago)   5d

特定のオブジェクトの情報をYAML形式で出力する

 マニフェストを手動で作成する場合は、YAML形式で記述することが多いのではないでしょうか。

 「-o yaml」オプションを付けて実行することで、指定したオブジェクトの定義内容をYAML形式で出力することができます。

 例えば、Podの定義内容を出力してみます。

$ kubectl get pods deploy-test-64988f78fc-bnczx

 以下のような内容が出力されました。

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-10-18T07:34:49Z"
  generateName: deploy-test-64988f78fc-
  labels:
    app: web-pods
    pod-template-hash: 64988xxxxc
  name: deploy-test-64988f78fc-bnczx
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: deploy-test-64988f78fc
    uid: 6xxxxdef-xxxx-xxxx-xxxx-3bxxxx9d6579
  resourceVersion: "45xxxx"
  uid: eb33xxxx-xxxx-xxxx-xxxx-91e58xxxx441
spec:
  containers:
  - image: k8s.gcr.io/echoserver:1.4
    imagePullPolicy: IfNotPresent
    name: test-pod
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-xxxxx
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: kube002c
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-xxxxx
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2021-10-18T07:34:49Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2021-10-29T00:15:07Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2021-10-29T00:15:07Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2021-10-18T07:34:49Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: containerd://6a53d293xxxxx2ff69a4xxxxxa4bf26897cxxxxx4a069cf1xxxxx4d968432fa
    image: k8s.gcr.io/echoserver:1.4
    imageID: sha256:523cad1a4xxxxxd41406c9de49xxxxxd60d56xxxxx619158xxxxxfd1066028f9
    lastState:
      terminated:
        containerID: containerd://e2963c7xxxxx7911a9668a2fxxxxx32e391e02cb5cxxxxx2f12cd5d50b1132f
        exitCode: 255
        finishedAt: "2021-10-29T00:13:22Z"
        reason: Unknown
        startedAt: "2021-10-28T09:41:57Z"
    name: test-pod
    ready: true
    restartCount: 5
    started: true
    state:
      running:
        startedAt: "2021-10-29T00:15:06Z"
  hostIP: 192.168.1.157
  phase: Running
  podIP: 10.244.1.78
  podIPs:
  - ip: 10.244.1.78
  qosClass: BestEffort
  startTime: "2021-10-18T07:34:49Z"

 ちなみに、このPodを起動したときのマニフェストは以下の内容でした。

<省略>
    metadata:
      labels:
        app: web-pods
    spec:
      containers:
      - name: test-pod
        image: k8s.gcr.io/echoserver:1.4

 コマンドで出力された内容の中の「status:」以下の部分は指定したPodの現状ステータスが出力されていますので、「status:」よりも上の部分が定義部分になります。

 その内容を見ますと、デフォルトで設定される部分がかなりの量あることがお分かりになると思います。

1回で複数種類のオブジェクトの情報を出力する

 これまでは1種類のリソースタイプ(Pod、Deploymentなどどれか1つ)のみを指定してコマンドを実行しました。

 以下のコマンドを実行してみてください。

$ kubectl get all

 以下のように出力されました。

NAME                               READY   STATUS    RESTARTS      AGE
pod/deploy-test-64988f78fc-bnczx   1/1     Running   5 (10h ago)   11d
pod/deploy-test-64988f78fc-n6klq   1/1     Running   5 (10h ago)   11d
pod/deploy-test-64988f78fc-x2tk2   1/1     Running   5 (10h ago)   11d

NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/kubernetes        ClusterIP   10.96.0.1       <none>        443/TCP          25d
service/service-test-np   NodePort    10.104.58.175   <none>        8080:30808/TCP   5d3h

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-test   3/3     3            3           11d

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-test-64988f78fc   3         3         3       11d

 「NAME」の値が「リソースタイプ/名前」になっていますが、1つのコマンド内で複数のリソースタイプを指定する場合は、「リソースタイプ/名前」という形式も使えます。

 上の出力結果には、PodとService、Deployment、Replicasetの4種類のリソースタイプが確認できますね。

 ネット情報によりますと、「kubectl get all」コマンドで出力されるリソースは固定で決められているようです。決められたリソースの中で、存在するもののみを出力してくれます。

 出力したいリソースを複数指定する場合は、リソースタイプをカンマ区切りで記述します。

 例えば、PodとDeploymentのみを出力したい場合は以下のように記述します。

$ kubectl get pod,deployment

 以下のように、個別のリソースを「リソースタイプ/名前」の形式で指定することも可能です。

$ kubectl get pod/deploy-test-64988f78fc-bnczx deployment.apps/deploy-test

 複数のリソースは半角スペース区切りで記述します。

おわりに

  以上でkubectl getコマンドのご紹介を終わります。

 現状ステータスや定義内容の確認などのオペレーションは、特にトラブルシュートの際に重要になると思います。

 kubectl getコマンドは本記事でご紹介した以外にも便利な使い方がありそうですので、良いものを見つけたら追記していきます。

 ご利用ありがとうございました。

k8s
その他のおすすめ記事
その他のおすすめ記事

コメント