Kubernetesの基礎

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コマンドを利用することで、実現可能です。
今回のケースでは、ローカル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が出てくるため確認してみて下さい。次回からは、各リソースの使い方と使い分けについて説明していきます。
連載バックナンバー
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クラスタをデバッグする
- 「vCluster」で仮想Kubernetesクラスターを構築する






