目次
- 前回のあらすじ
- kubectlの実行
- 用語について
- あとがき
前回のあらすじ
前回のkubernetesを学ぶ~その2~は、宅内LANの環境設定に費やした回でした。vagrantの設定でブリッジ用のアダプタを追加したり、vagrantのことを理解しないとイケないんだよ!!という反省点もありました。毎回躓きながらやっていけばいいと思っています。失敗こそ力になる!と思っているんで。
※人命に関わること以外。
kubectlの実行
kubectlは、Kubernetesクラスターを制御できます。と、公式ドキュメントに記載があります。ぐ、具体的には!?だったので、リファレンスに沿って運用でよく使いそうだなーって思ったコマンドを試してみることにしました。
まずは、構文を把握しましょう。英語も構文がわからないと何言ってんのかわかんねってなるので、構文は必須ですね。※英語がわかるとは言っていない。
kubectl [command] [TYPE] [NAME] [flags]
パラメータ | 意味 |
---|---|
command | 必須。リソースに対して実行したい操作を指定する。 |
TYPE | 必須。リソースのタイプを指定する。大文字小文字を区別しない。 |
NAME | リソースの名前を指定する。大文字小文字を区別する。 |
flags | オプションのフラグを指定する。 |
うん。はっきり言って、これだけじゃわからんし、見返したい時にも使えん!!
ということで。
commandの詳細
get
1行に1オブジェクトといったリスト形式で表示する。ちょっとした情報確認に使うかな。
使用例
kubectl get [TYPE]
kubectl get [TYPE] [NAME]
kubectl get [TYPE] [NAME] [flags]
kubectl get -f [マニフェスト or ディレクトリ]
nodeの一覧取得
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 20h v1.14.10
node1 Ready <none> 20h v1.14.10
node2 Ready <none> 20h v1.14.10
describe
getより詳細な情報を表示する。なので、nodeとか情報収集!ってときは、こっちですね。
使用例
kubectl describe [TYPE]
kubectl describe [TYPE] [NAME]
kubectl describe [TYPE] [NAME] [flags]
kubectl describe -f [マニフェスト or ディレクトリ]
D:\Repository\kubernetes\vagrant-kubernetes>kubectl describe node
Name: master
Roles: master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=master
kubernetes.io/os=linux
node-role.kubernetes.io/master=
Annotations: flannel.alpha.coreos.com/backend-data: {"VtepMAC":"be:02:42:8d:f8:a1"}
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: true
flannel.alpha.coreos.com/public-ip: 172.16.20.11
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Mon, 01 Feb 2021 19:19:39 +0900
Taints: node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
Lease:
HolderIdentity: master
AcquireTime: <unset>
RenewTime: Tue, 02 Feb 2021 16:14:14 +0900
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
MemoryPressure False Tue, 02 Feb 2021 16:13:25 +0900 Tue, 02 Feb 2021 07:57:37 +0900 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Tue, 02 Feb 2021 16:13:25 +0900 Tue, 02 Feb 2021 07:57:37 +0900 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Tue, 02 Feb 2021 16:13:25 +0900 Tue, 02 Feb 2021 07:57:37 +0900 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Tue, 02 Feb 2021 16:13:25 +0900 Tue, 02 Feb 2021 13:16:55 +0900 KubeletReady kubelet is posting ready status. AppArmor enabled
Addresses:
InternalIP: 172.16.20.11
Hostname: master
Capacity:
cpu: 2
ephemeral-storage: 40593612Ki
hugepages-2Mi: 0
memory: 2040788Ki
pods: 110
Allocatable:
cpu: 2
ephemeral-storage: 37411072758
hugepages-2Mi: 0
memory: 1938388Ki
pods: 110
System Info:
Machine ID: fe17ffbebd914d0caddb55c160e155bd
System UUID: 2C843C62-0958-874D-A5CD-E808C1F91549
Boot ID: ef62e7c4-0e2d-4ea4-89bf-e5494fae1752
Kernel Version: 4.15.0-135-generic
OS Image: Ubuntu 18.04.5 LTS
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://18.6.1
Kubelet Version: v1.14.10
Kube-Proxy Version: v1.14.10
PodCIDR: 10.244.0.0/24
Non-terminated Pods: (10 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
kube-system coredns-6dcc67dcbc-fc5tf 100m (5%) 0 (0%) 70Mi (3%) 170Mi (8%) 20h
kube-system coredns-6dcc67dcbc-s7bxw 100m (5%) 0 (0%) 70Mi (3%) 170Mi (8%) 20h
kube-system etcd-master 0 (0%) 0 (0%) 0 (0%) 0 (0%) 20h
kube-system kube-apiserver-master 250m (12%) 0 (0%) 0 (0%) 0 (0%) 20h
kube-system kube-controller-manager-master 200m (10%) 0 (0%) 0 (0%) 0 (0%) 20h
kube-system kube-flannel-ds-amd64-s7kgq 100m (5%) 100m (5%) 50Mi (2%) 50Mi (2%) 20h
kube-system kube-proxy-75l8x 0 (0%) 0 (0%) 0 (0%) 0 (0%) 20h
kube-system kube-scheduler-master 100m (5%) 0 (0%) 0 (0%) 0 (0%) 20h
kubernetes-dashboard cluster-admin-74867ffb65-k6txp 0 (0%) 0 (0%) 0 (0%) 0 (0%) 20h
kubernetes-dashboard dashboard-metrics-scraper-69fcc6d9df-jrcn2 0 (0%) 0 (0%) 0 (0%) 0 (0%) 20h
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 850m (42%) 100m (5%)
memory 190Mi (10%) 390Mi (20%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)
Events: <none>
※node1、node2は省略
create
マニフェストや標準出力に書かれたオブジェクトを生成する。オブジェクト作ったりするので、これもよく使いそう。
使用例
kubectl create -f [ファイル名]
URLからオブジェクトを作成
D:\Repository\kubernetes\vagrant-kubernetes>kubectl create -f ここにURLとYAMLファイル指定
deployment.extensions/memory-eater created
作成を確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-eater-7889865958-r7p5z 1/1 Running 2 89s
apply
ここで、さきほどcreateしたYAMLファイルを再度実行すると同じオブジェクトが既に作成されているので、エラーになります。なので、存在しなければ作成、存在すれば更新するというコマンドのapplyは役に立ちそう。
使用例
kubectl apply -f [ファイル名]
状態確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-eater-7889865958-r7p5z 1/1 Running 2 89s
消します。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl delete -f ここにURLとYAMLファイル指定
deployment.extensions "memory-eater" deleted
消えたか確認
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
No resources found in default namespace.
applyは?
D:\Repository\kubernetes\vagrant-kubernetes>kubectl apply -f ここにURLとYAMLファイル指定
deployment.extensions/memory-eater created
確認します。
D:\Repository\kubernetes\vagrant-kubernetes>kubectl get pod
NAME READY STATUS RESTARTS AGE
memory-eater-7889865958-lvc55 1/1 Running 1 46s
いた。
DELETE
さっきDELETEもやっちゃた。
使用例
kubectl DELETE -f [ファイル名]
TYPEの詳細
リソースタイプを指定するのですが、調べると結構な量がありました。なので、必要そうだなーっていうのに絞ってます。詳しくは公式ドキュメントを見るとよいですね。
リソースタイプ一覧へ
kubectlでも一覧が見れます。
kubectl api-resources
pod(短縮名:po)
コンテナの最小単位。K8sクラスタ内のネットワーク上にIPアドレスを持つ。単一または複数のコンテナを起動する。
podでもpodsでもOKみたいですが、場合によって複数形がダメなものもありますね。
service(短縮名:svc)
Podの集合で実行されているアプリケーションをネットワークサービスとして公開する方法。
nodeのIPアドレスは一定にならないのと、PodがNodeに散らばっているため、通信する時にIPアドレス指定だと急に繋がんねーってことになる。そこでIPアドレスを接続元が意識せずに単一の接続先を提供するのが役目。
ingress(短縮名:ing)
Serviceに対して、外部疎通できるURL、負荷分散トラフィック、SSL/TLS終端の機能や、名前ベースの仮想ホスティングを提供することができる。バランサな役割をするのかな。
deployment(短縮名:deploy)
アップデートやロールバックといったデプロイ管理の仕組みを提供することができる。
flagsの詳細
公式は出力オプションが中心だったので、探すのに時間がかかったが、名前空間を指定することもできるようですね。
-n 名前空間
指定の名前空間にする。
--all-namespace
すべてに名前空間を対象にする。
-o=yaml
YAMLフォーマットでAPIオブジェクトを表示する。
-o=json
JSON形式でAPIオブジェクトを表示する。
用語について
書いといたら、あーそうそうと思い出すのに必要な用語をまとめ。
・オブジェクト
K8sのオブジェクトは、K8sクラスタ内の実体でポッドやサービスを指すものです。
・マニフェスト
K8sオブジェクトを生成するのに利用する宣言書です。
あとがき
今回は、コマンドを調べたり実際に打ち込んだりと結構時間がかかったなーと思う。しかし、身体を使って打ち込んだり動作を確認したり内容をまとめたりと身についたかなと思う。次回は、マニフェストの書き方について学ぼうと思う。
※B'zのCD聴きながらやってるのでたまにハイになっている自分がいた。冷静じゃないとエラー引き起こしそう。