本記事は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コマンドは本記事でご紹介した以外にも便利な使い方がありそうですので、良いものを見つけたら追記していきます。
ご利用ありがとうございました。
コメント