Kubernetesの基礎
kubectlの使い方
ここまでkubectlを用いたリソースの操作方法を紹介しましたが、kubectlは様々な情報取得にも利用可能です。例えばリソースの一覧を取得するには、kubectl getコマンドを利用します。--output(-o) オプションを利用することでJSON/YAML/custom-columns/Go Templateなど様々な形式で出力することが可能です。JSONやYAMLなどで出力した場合には、詳細な情報まで確認することが可能です。また、podなどのリソース名ではなくkubectl get allのように「all」を指定することで、全てのリソースの一覧を取得することも可能です。
# 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」という項目以下に、ボリュームのセットアップやイメージの取得コンテナのライフサイクルに関する情報などが表示されるようになっています。
$ 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のリソース使用率も表示することが可能です。
$ 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 コマンドを利用します。
# 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の利用も検討してみて下さい。
# 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コマンドを利用することで、実現可能です。
今回のケースでは、ローカルPCのWebブラウザからnginxコンテナに接続することを想定してポートフォワーディングの設定を入れてみます。下記のようにすると、localhost:8888宛の通信が該当するPodの80番ポートに転送されるようになるため、ブラウザからも確認できるかと思います。
# localhost:8888をPodの80番ポートに転送 $ kubectl port-forward sample-pod 8888:80 # Podに対してポートフォワーディングを実行してくれるため接続可能 $ curl localhost:8888
kubectlの様々な使い方を説明してきましたが、shell completion機能も用意されています。利用しているbashまたはzshを選択できるため、どちらかを指定して下さい。
# bash completion $ source <(kubectl completion bash) # zsh completion $ source <(kubectl completion zsh)
まとめ
今回はKubernetesのオペレーションについて説明しました。kubectlには他にも多くの便利な機能が備わっています。細かい仕様についてはkubectl get --helpなどを実行することで、分かりやすいExamplesが出てくるため確認してみて下さい。次回からは、各リソースの使い方と使い分けについて説明していきます。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- KubernetesのDiscovery&LBリソース(その1)
- Oracle Cloud Hangout Cafe Season5 #3「Kubernetes のセキュリティ」(2022年3月9日開催)
- KubernetesのDiscovery&LBリソース(その2)
- KubernetesのConfig&Storageリソース(その1)
- Kubernetes環境を構築して、実際にコンテナを動かしてみよう
- Project CalicoをKubernetesで使ってみる:構築編
- 「kwok」でKubernetesクラスターをシュミレーションする
- KubernetesのWorkloadsリソース(その1)
- 「Inspektor Gadget」でKubernetesクラスタをデバッグする
- KubernetesのWorkloadsリソース(その2)