この連載が書籍になりました!『Kubernetes完全ガイド

Kubernetesの基礎

2018年3月14日(水)
青山 真也
連載の3回目となる今回は、Kubernetesの基本とkubectlコマンドの概要について解説する。

kubectlの使い方

ここまでkubectlを用いたリソースの操作方法を紹介しましたが、kubectlは様々な情報取得にも利用可能です。例えばリソースの一覧を取得するには、kubectl getコマンドを利用します。--output(-o) オプションを利用することでJSON/YAML/custom-columns/Go Templateなど様々な形式で出力することが可能です。JSONやYAMLなどで出力した場合には、詳細な情報まで確認することが可能です。また、podなどのリソース名ではなくkubectl get allのように「all」を指定することで、全てのリソースの一覧を取得することも可能です。

リスト10:kubectl getコマンド

# Pod の一覧を取得
$ kubectl get pods
NAME           READY     STATUS    RESTARTS   AGE
sample-pod     1/1       Running   1          7m

# Pod の一覧を取得(詳細 output)
$ kubectl get pods -o wide
NAME           READY     STATUS    RESTARTS   AGE       IP             NODE
sample-pod     1/1       Running   1          7m        10.112.24.20   k8s01

似たものとして、kubectl describeコマンドがあります。kubectl describeコマンドでは kubectl getコマンドでも確認できる情報以外に、リソースに関連するイベントや、より詳細な情報を確認することができます。例えばkubectl getコマンドにPodを指定すると、「Event」という項目以下に、ボリュームのセットアップやイメージの取得コンテナのライフサイクルに関する情報などが表示されるようになっています。

リスト11:kubectl describeコマンドで詳細な情報を出力

$ kubectl describe pods sample-pod
Name:         sample-pod
Namespace:    default
Node:         k8s01/xxx.xxx.xxx.xxx
Start Time:   Fri, 02 Mar 2018 02:36:58 +0900
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"sample-pod","namespace":"default"},"spec":{"containers":[{"image":"nginx:1.12",...
Status:       Running
IP:           10.112.24.20
Containers:
  nginx-container:
    Container ID:   docker://56f6efac75152073663a736cad5cca10acdf3338e850b20f8ad558f6b98ca405
    Image:          nginx:1.13
    Image ID:       docker-pullable://nginx@sha256:2f68b99bc0d6d25d0c56876b924ec20418544ff28e1fb89a4c27679a40da811b
    Port:           <none>
    State:          Running
      Started:      Mon, 05 Mar 2018 15:43:50 +0900
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 05 Mar 2018 15:37:13 +0900
      Finished:     Mon, 05 Mar 2018 15:43:25 +0900
    Ready:          True
    Restart Count:  1
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-trr5k (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  default-token-trr5k:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-trr5k
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason                 Age               From                               Message
  ----    ------                 ----              ----                               -------
  Normal  Scheduled              16m               default-scheduler                  Successfully assigned sample-pod to k8s01
  Normal  SuccessfulMountVolume  16m               kubelet, k8s01                     MountVolume.SetUp succeeded for volume "default-token-trr5k"
  Normal  Pulling                16m               kubelet, k8s01                     pulling image "nginx:1.12"
  Normal  Pulled                 15m               kubelet, k8s01                     Successfully pulled image "nginx:1.12"
  Normal  Killing                9m                kubelet, k8s01                     Killing container with id docker://nginx-container:Container spec hash changed (329383961 vs 482811346).. Container will be killed and recreated.
  Normal  Pulling                9m                kubelet, k8s01                     pulling image "nginx:1.13"
  Normal  Created                9m (x2 over 15m)  kubelet, k8s01                     Created container
  Normal  Started                9m (x2 over 15m)  kubelet, k8s01                     Started container
  Normal  Pulled                 9m                kubelet, k8s01                     Successfully pulled image "nginx:1.13"

他にもNodeを指定した場合には、リソースの使用状況・空き状況や、起動しているPodのリソース使用率も表示することが可能です。

リスト12:kubectl describeコマンドでNodeを指定

$ kubectl describe node k8s01
Name:               k8s01
Roles:              node
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/instance-type=standard-8
                    beta.kubernetes.io/os=linux
                    kubernetes.io/hostname=k8s01
                    kubernetes.io/role=node
Annotations:        node.alpha.kubernetes.io/ttl=0
                    volumes.kubernetes.io/controller-managed-attach-detach=true
Taints:             <none>
CreationTimestamp:  Tue, 06 Feb 2018 11:03:36 +0900
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  KernelDeadlock   False   Tue, 06 Mar 2018 13:27:50 +0900   Tue, 06 Feb 2018 11:03:29 +0900   KernelHasNoDeadlock          kernel has no deadlock
  OutOfDisk        False   Tue, 06 Mar 2018 13:28:41 +0900   Tue, 06 Feb 2018 11:03:36 +0900   KubeletHasSufficientDisk     kubelet has sufficient disk space available
  MemoryPressure   False   Tue, 06 Mar 2018 13:28:41 +0900   Tue, 06 Feb 2018 11:03:36 +0900   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Tue, 06 Mar 2018 13:28:41 +0900   Tue, 06 Feb 2018 11:03:36 +0900   KubeletHasNoDiskPressure     kubelet has no disk pressure
  Ready            True    Tue, 06 Mar 2018 13:28:41 +0900   Tue, 06 Feb 2018 11:03:37 +0900   KubeletReady                 kubelet is posting ready status
Addresses:
  InternalIP:  xxx.xxx.xxx.xxx
  Hostname:    k8s01
Capacity:
 cpu:     8
 memory:  28815880Ki
 pods:    110
Allocatable:
 cpu:     7600m
 memory:  27484680Ki
 pods:    110
System Info:
 Machine ID:                 5f31b77049cc49aa991ae0234a27bda4
 System UUID:                D240A056-1E0F-4343-A160-65DBC0AC5928
 Boot ID:                    0c4dd395-1ba6-4530-84a3-d39818e74156
 Kernel Version:             4.xx.xx-xx-generic
 OS Image:                   Container Optimized OS
 Operating System:           linux
 Architecture:               amd64
 Container Runtime Version:  docker://1.12.6
 Kubelet Version:            v1.9.2
 Kube-Proxy Version:         v1.9.2
ExternalID:                  d240a056-1e0f-4343-a160-65dbc0ac5928
Non-terminated Pods:         (5 in total)
  Namespace                  Name                                     CPU Requests  CPU Limits  Memory Requests  Memory Limits
  ---------                  ----                                     ------------  ----------  ---------------  -------------
  default                    sample-pod                               0 (0%)        0 (0%)      0 (0%)           0 (0%)
  kube-system                dd-agent-drj87                           100m (1%)     250m (3%)   128Mi (0%)       512Mi (1%)
  kube-system                default-http-backend-5bbfb847b5-rbkgp    250m (3%)     1 (13%)     256Mi (0%)       1Gi (3%)
  kube-system                kube-dns-66ff98b6fc-gxlkg                260m (3%)     0 (0%)      110Mi (0%)       170Mi (0%)
  kube-system                kube-dns-autoscaler-69c5cbdcdd-xgvbc     20m (0%)      0 (0%)      10Mi (0%)        0 (0%)
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  CPU Requests  CPU Limits   Memory Requests  Memory Limits
  ------------  ----------   ---------------  -------------
  630m (8%)     1250m (16%)  504Mi (1%)       1706Mi (6%)

出力される Pod のログを確認したい場合には、kubectl logs コマンドを利用します。

リスト13:kubectl logsコマンド

# Pod内のコンテナのログを出力
$ kubectl logs sample-pod

# 複数コンテナが入ったPodで特定のコンテナのログを出力
$ kubectl logs sample-pod -c nginx-container

# followしながらログを出力
$ kubectl logs -f sample-pod

# 最新1時間以内、10件取得、タイムスタンプを表示してログを出力
$ kubectl logs --since=1h --tail=10 --timestamps=true sample-pod

Pod上で特定のコマンドを実行したいときはkubectl execコマンドを利用します。この仕様を利用して/bin/shなどを実行することで、あたかもコンテナに対してログインしているような状態を実現することが可能です。/bin/shなど標準入出力が必要なプログラムなどでは「-i -t」オプションを付与して下さい。また、複数のPodのログを同時に見たい場合はSternの利用も検討してみて下さい。

リスト14:kubectl execコマンド

# Pod内のコンテナで/bin/shを実行
$ kubectl exec -it sample-pod /bin/sh

# 複数コンテナが入ったPodで特定のコンテナで/bin/shを実行
$ kubectl exec -it sample-pod -c nginx-container /bin/sh

# 引数があるコマンドを実行する場合は「--」以降に記載
$ kubectl exec -it sample-pod -- /bin/ls -l /

一方で、デバッグ用途などでJMXのクライアントからJavaのアプリケーションコンテナに接続したり、データベースのクライアントからMySQLコンテナに接続したいなどの要件もあるかと思います。そういった場合には、kubectl port-forwardコマンドを利用することで、実現可能です。

kubectl portforward の概念図

kubectl portforward の概念図

今回のケースでは、ローカルPCのWebブラウザからnginxコンテナに接続することを想定してポートフォワーディングの設定を入れてみます。下記のようにすると、localhost:8888宛の通信が該当するPodの80番ポートに転送されるようになるため、ブラウザからも確認できるかと思います。

リスト15:kubectl port-forwardコマンド

# localhost:8888をPodの80番ポートに転送
$ kubectl port-forward sample-pod 8888:80

# Podに対してポートフォワーディングを実行してくれるため接続可能
$ curl localhost:8888

kubectlの様々な使い方を説明してきましたが、shell completion機能も用意されています。利用しているbashまたはzshを選択できるため、どちらかを指定して下さい。

リスト16:bashまたはzshを選択

# bash completion
$ source <(kubectl completion bash)

# zsh completion
$ source <(kubectl completion zsh)

まとめ

今回はKubernetesのオペレーションについて説明しました。kubectlには他にも多くの便利な機能が備わっています。細かい仕様についてはkubectl get --helpなどを実行することで、分かりやすいExamplesが出てくるため確認してみて下さい。次回からは、各リソースの使い方と使い分けについて説明していきます。

株式会社サイバーエージェント アドテク本部 Strategic Infrastructure Agency

2016年入社。OpenStackを使ったプライベートクラウドやGKE互換なコンテナプラットフォームをゼロから構築し、国内カンファレンスでのKeynoteに登壇。
その後、世界で2番目にCertified Kubernetes Application Developer、138番目にCertified Kubernetes Administratorの認定資格を取得。
現在はKubernetesやOpenStackなどOSSへのコントリビュート活動をはじめ、CNCF公式のCloud Native Meetup TokyoのOrganizerやJapan Container Daysの運営などコミュニティ活動にも従事している。

連載バックナンバー

仮想化/コンテナ技術解説
第9回

KubernetesのConfig&Storageリソース(その2)

2018/6/6
連載9回目となる今回は、Config&Storageリソースのうち、PersistentVolumeClaimについて解説する。
仮想化/コンテナ技術解説
第8回

KubernetesのConfig&Storageリソース(その1)

2018/5/31
今回と次回の2回に渡って、5種類に大別されるKubernetesのリソースのうち、Config&Storageリソースを解説する。
仮想化/コンテナ技術解説
第7回

KubernetesのDiscovery&LBリソース(その2)

2018/5/16
前回に引き続き、Discovery&LBリソースのServiceとIngressを紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています