🎳

【OpenShift】ocコマンドによる効率的なリソース確認方法

2024/09/29に公開

0.はじめに

OpenShift Container Platform(以下、OCP)入門者向けに、ocコマンドでリソース状態を効率的に確認する方法を解説します。

本記事の内容に沿って、ハンズオンいただくと以下を習得できます。

  • クエリの使い方
  • フォーマットの使い方
  • フィルターの使い方

では、次の章から具体的な解説を進めます!

1.クエリの使い方

クエリとは、OpenShiftリソースの情報を取得するためのコマンド操作です。

oc getoc describeなどのコマンドを使って、特定のリソースに関する情報を取得します。

例1: oc get pods

oc get pods

このコマンドは、現在のプロジェクト(namespace)内のすべてのPodのリストを表示します。

出力例👇

NAME                         READY   STATUS    RESTARTS   AGE
first-app-6858b8457d-8b82m   1/1     Running   2          25h

例2: oc describe pod

oc describe pod first-app-6858b8457d-8b82m

oc describeは、特定のリソース(この場合はPod)の詳細情報を表示します。リソースのイベントログや状態、設定内容が含まれます。

出力例👇

Name:             first-app-6858b8457d-8b82m
Namespace:        lesson
Priority:         0
Service Account:  default
Node:             crc/192.168.126.11
Start Time:       Sun, 22 Sep 2024 13:54:28 +0900
Labels:           deployment=first-app
                  pod-template-hash=6858b8457d
Annotations:      k8s.ovn.org/pod-networks:
                    {"default":{"ip_addresses":["10.217.0.42/23"],"mac_address":"0a:58:0a:d9:00:2a","gateway_ips":["10.217.0.1"],"routes":[{"dest":"10.217.0.0...
                  k8s.v1.cni.cncf.io/network-status:
                    [{
                        "name": "ovn-kubernetes",
                        "interface": "eth0",
                        "ips": [
                            "10.217.0.42"
                        ],
                        "mac": "0a:58:0a:d9:00:2a",
                        "default": true,
                        "dns": {}
                    }]
                  openshift.io/generated-by: OpenShiftNewApp
                  openshift.io/scc: restricted-v2
                  seccomp.security.alpha.kubernetes.io/pod: runtime/default
Status:           Running
SeccompProfile:   RuntimeDefault
IP:               10.217.0.42
IPs:
  IP:           10.217.0.42
Controlled By:  ReplicaSet/first-app-6858b8457d
Containers:
  first-app:
    Container ID:   cri-o://012257994ad33043af3041bddbabbda9fdaf5852e8fcb9e6996d97675e483d20
    Image:          openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e
    Image ID:       docker.io/openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e
    Ports:          8080/TCP, 8888/TCP
    Host Ports:     0/TCP, 0/TCP
    State:          Running
      Started:      Mon, 23 Sep 2024 14:53:44 +0900
    Ready:          True
    Restart Count:  2
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qjfsw (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True 
  Initialized                 True 
  Ready                       True 
  ContainersReady             True 
  PodScheduled                True 
Volumes:
  kube-api-access-qjfsw:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
    ConfigMapName:           openshift-service-ca.crt
    ConfigMapOptional:       <nil>
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason          Age   From               Message
  ----    ------          ----  ----               -------
  Normal  Scheduled       25h   default-scheduler  Successfully assigned lesson/first-app-6858b8457d-8b82m to crc
  Normal  AddedInterface  25h   multus             Add eth0 [10.217.0.42/23] from ovn-kubernetes
  Normal  Pulled          25h   kubelet            Container image "openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e" already present on machine
  Normal  Created         25h   kubelet            Created container first-app
  Normal  Started         25h   kubelet            Started container first-app
  Normal  AddedInterface  70m   multus             Add eth0 [10.217.0.42/23] from ovn-kubernetes
  Normal  Pulled          70m   kubelet            Container image "openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e" already present on machine
  Normal  Created         69m   kubelet            Created container first-app
  Normal  Started         69m   kubelet            Started container first-app
  Normal  AddedInterface  55m   multus             Add eth0 [10.217.0.42/23] from ovn-kubernetes
  Normal  Pulled          55m   kubelet            Container image "openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e" already present on machine
  Normal  Created         55m   kubelet            Created container first-app
  Normal  Started         55m   kubelet            Started container first-app

2.フォーマットの使い方

フォーマットとは、取得したリソース情報を特定の形式で表示する手法です。

-oオプションを使用して、YAMLやJSONなどのフォーマットで情報を出力できます。主に、スクリプトや自動化のために使用することが多いです。

例1: YAML形式で出力

oc get pods -o yaml

このコマンドは、PodリソースをYAML形式で表示します。

出力例👇

apiVersion: v1
items:
- apiVersion: v1
  kind: Pod
  metadata:
    annotations:
      k8s.ovn.org/pod-networks: '{"default":{"ip_addresses":["10.217.0.42/23"],"mac_address":"0a:58:0a:d9:00:2a","gateway_ips":["10.217.0.1"],"routes":[{"dest":"10.217.0.0/22","nextHop":"10.217.0.1"},{"dest":"10.217.4.0/23","nextHop":"10.217.0.1"},{"dest":"100.64.0.0/16","nextHop":"10.217.0.1"}],"ip_address":"10.217.0.42/23","gateway_ip":"10.217.0.1"}}'
      k8s.v1.cni.cncf.io/network-status: |-
        [{
            "name": "ovn-kubernetes",
            "interface": "eth0",
            "ips": [
                "10.217.0.42"
            ],
            "mac": "0a:58:0a:d9:00:2a",
            "default": true,
            "dns": {}
        }]
      openshift.io/generated-by: OpenShiftNewApp
      openshift.io/scc: restricted-v2
      seccomp.security.alpha.kubernetes.io/pod: runtime/default
    creationTimestamp: "2024-09-22T04:54:27Z"
    generateName: first-app-6858b8457d-
    labels:
      deployment: first-app
      pod-template-hash: 6858b8457d
    name: first-app-6858b8457d-8b82m
    namespace: lesson
    ownerReferences:
    - apiVersion: apps/v1
      blockOwnerDeletion: true
      controller: true
      kind: ReplicaSet
      name: first-app-6858b8457d
      uid: 59e284f2-4dc0-4340-badc-5590c3cdf17a
    resourceVersion: "178203"
    uid: 7c2abf88-3642-4e1c-8e2b-8b465ad4931c
  spec:
    containers:
    - image: openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e
      imagePullPolicy: IfNotPresent
      name: first-app
      ports:
      - containerPort: 8080
        protocol: TCP
      - containerPort: 8888
        protocol: TCP
      resources: {}
      securityContext:
        allowPrivilegeEscalation: false
        capabilities:
          drop:
          - ALL
        runAsNonRoot: true
        runAsUser: 1000660000
      terminationMessagePath: /dev/termination-log
      terminationMessagePolicy: File
      volumeMounts:
      - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
        name: kube-api-access-qjfsw
        readOnly: true
    dnsPolicy: ClusterFirst
    enableServiceLinks: true
    imagePullSecrets:
    - name: default-dockercfg-5msff
    nodeName: crc
    preemptionPolicy: PreemptLowerPriority
    priority: 0
    restartPolicy: Always
    schedulerName: default-scheduler
    securityContext:
      fsGroup: 1000660000
      seLinuxOptions:
        level: s0:c26,c5
      seccompProfile:
        type: RuntimeDefault
    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-qjfsw
      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
        - configMap:
            items:
            - key: service-ca.crt
              path: service-ca.crt
            name: openshift-service-ca.crt
  status:
    conditions:
    - lastProbeTime: null
      lastTransitionTime: "2024-09-23T05:53:46Z"
      status: "True"
      type: PodReadyToStartContainers
    - lastProbeTime: null
      lastTransitionTime: "2024-09-22T04:54:28Z"
      status: "True"
      type: Initialized
    - lastProbeTime: null
      lastTransitionTime: "2024-09-23T05:53:46Z"
      status: "True"
      type: Ready
    - lastProbeTime: null
      lastTransitionTime: "2024-09-23T05:53:46Z"
      status: "True"
      type: ContainersReady
    - lastProbeTime: null
      lastTransitionTime: "2024-09-22T04:54:28Z"
      status: "True"
      type: PodScheduled
    containerStatuses:
    - containerID: cri-o://012257994ad33043af3041bddbabbda9fdaf5852e8fcb9e6996d97675e483d20
      image: docker.io/openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e
      imageID: docker.io/openshift/hello-openshift@sha256:aaea76ff622d2f8bcb32e538e7b3cd0ef6d291953f3e7c9f556c1ba5baf47e2e
      lastState: {}
      name: first-app
      ready: true
      restartCount: 2
      started: true
      state:
        running:
          startedAt: "2024-09-23T05:53:44Z"
    hostIP: 192.168.126.11
    hostIPs:
    - ip: 192.168.126.11
    phase: Running
    podIP: 10.217.0.42
    podIPs:
    - ip: 10.217.0.42
    qosClass: BestEffort
    startTime: "2024-09-22T04:54:28Z"
kind: List
metadata:
  resourceVersion: ""

例2: JSON形式で出力

oc get pod first-app-6858b8457d-8b82m -o json

このコマンドは、特定のPodリソースをJSON形式で表示します。

3.フィルターの使い方

フィルターは、特定の条件に合致するリソースだけを表示するために使用します。

-l--field-selectorオプションを使って、ラベルやフィールドに基づいてリソースを絞り込むことができます。

例1: ラベルでフィルタリング

oc get pods -l deployment=first-app

このコマンドは、ラベルdeployment=first-appを持つPodのみを取得します。

出力例👇

NAME                         READY   STATUS    RESTARTS   AGE
first-app-6858b8457d-8b82m   1/1     Running   2          26h

例2: 特定のフィールドでフィルタリング

oc get pods --field-selector status.phase=Running

このコマンドは、現在Running状態のPodのみを表示します。

出力例👇

NAME                         READY   STATUS    RESTARTS   AGE
first-app-6858b8457d-8b82m   1/1     Running   2          26h

例3: クエリ、フォーマット、フィルターを組み合わせる

oc get pods -o json --field-selector status.phase=Running --selector deployment=first-app

このコマンドは、ラベルapp=first-appを持つ、現在Running状態のPodをJSON形式で表示します。

4.おわりに

今回はocコマンドでリソース状態を効率的に確認する方法を理解するために、以下を学びました。

  • クエリの使い方(oc getoc describeなどのコマンドを使ってリソースの情報を取得)
  • フォーマットの使い方(-oオプションを使用して、リソースの情報をYAMLやJSON形式で出力)
  • フィルターの使い方(-l--field-selectorで、特定の条件に基づいてリソースを絞り込む)

一回で覚えるのは難しいと思うので、何度かトライして覚えるで全然大丈夫です。

今後もOpenShiftについて解説していきます。

おわりっ!

参考サイト

Red Hat Documentation 第1章 OpenShift CLI (oc)
Red Hat Documentation OpenShift Container Platform 4.16

Discussion