背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。
その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。
引用や参考と今回の自分の勉強用の書籍の紹介
技術評論社『Kubernetes実践入門』のサンプルコード
Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方
実際の学びについて
書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
この章の勉強は本当に書籍の写経が主になるかもしれません・・・
勉強開始
流れを理解する
kubentetes の動きを知るのに便利な Event オブジェクト
失敗したコマンド
$ kubectl get event -w -o custom-columns=KIND:.involvedObject.kind, NAME:.metadata.name, SOURCE:.source.component, REASON:.reason, MESSAGE:.message
Error from server (NotFound): events "NAME:.metadata.name," not found
成功したコマンド
$ kubectl get event -w -o custom-columns=KIND:.involvedObject.kind,NAME:.metadata.name,SOURCE:.source.component,REASON:.reason,MESSAGE:.message
KIND / NAME / SOURCE / REASON / MESSAGE
の前の ,
にスペースを入れてコマンドが失敗していたんのでした。
オプション | 意味 |
---|---|
--watch(-w) | リアルタイムにオブジェクトの変更内容を取得したいとき |
--output(-o) | 出力形式を指定するとき |
今回はcustom-columns になります |
ログレベルを上げて kubectl と Kubernetes API の関係を把握する
$ kubectl create deployment dive-mattermost-preview --image k8spracticalguide/mattermost-preview:4.10.2 --v=8
I0415 20:55:18.394770 9011 request.go:947] Request Body: {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"creationTimestamp":null,"labels":{"app":"dive-mattermost-preview"},"name":"dive-mattermost-preview"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"dive-mattermost-preview"}},"strategy":{},"template":{"metadata":{"creationTimestamp":null,"labels":{"app":"dive-mattermost-preview"}},"spec":{"containers":[{"image":"k8spracticalguide/mattermost-preview:4.10.2","name":"mattermost-preview","resources":{}}]}}},"status":{}}
I0415 20:55:18.394831 9011 round_trippers.go:416] POST https://kubernetes.docker.internal:6443/apis/apps/v1/namespaces/default/deployments
I0415 20:55:18.394840 9011 round_trippers.go:423] Request Headers:
I0415 20:55:18.394845 9011 round_trippers.go:426] Accept: application/json
I0415 20:55:18.394849 9011 round_trippers.go:426] User-Agent: kubectl/v1.15.5 (darwin/amd64) kubernetes/20c265f
I0415 20:55:18.493824 9011 round_trippers.go:441] Response Status: 201 Created in 98 milliseconds
I0415 20:55:18.493877 9011 round_trippers.go:444] Response Headers:
I0415 20:55:18.493888 9011 round_trippers.go:447] Content-Type: application/json
I0415 20:55:18.493895 9011 round_trippers.go:447] Content-Length: 1088
I0415 20:55:18.493900 9011 round_trippers.go:447] Date: Wed, 15 Apr 2020 11:55:18 GMT
I0415 20:55:18.497646 9011 request.go:947] Response Body: {"kind":"Deployment","apiVersion":"apps/v1","metadata":{"name":"dive-mattermost-preview","namespace":"default","selfLink":"/apis/apps/v1/namespaces/default/deployments/dive-mattermost-preview","uid":"8fee822b-7de3-4f37-8e3d-75a96745c475","resourceVersion":"79757","generation":1,"creationTimestamp":"2020-04-15T11:55:18Z","labels":{"app":"dive-mattermost-preview"}},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"dive-mattermost-preview"}},"template":{"metadata":{"creationTimestamp":null,"labels":{"app":"dive-mattermost-preview"}},"spec":{"containers":[{"name":"mattermost-preview","image":"k8spracticalguide/mattermost-preview:4.10.2","resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"IfNotPresent"}],"restartPolicy":"Always","terminationGracePeriodSeconds":30,"dnsPolicy":"ClusterFirst","securityContext":{},"schedulerName":"default-scheduler"}},"strategy":{"type":"RollingUpdate","rollingUpdate":{"maxUnavailable":"25%","maxSurge":"25%"}},"revis [truncated 64 chars]
deployment.apps/dive-mattermost-preview created
書籍の通り、コマンドを叩くと API を叩くことを確認できました
コマンドから API 起動
/ API からコマンド起動
って kubernetes
では前者ですが・・・
このような発想が自分に初めての感覚で少し興奮しています。
なにか、意図がありそうですが・・・
Deployment が作成されてから ReplicaSet が作成されるまでの動きの確認
$ kubectl get deploy,rs,pod -v=6 2>&1 |grep -e dive-mattermost -e https
I0415 21:08:01.685789 9061 round_trippers.go:438] GET https://kubernetes.docker.internal:6443/apis/extensions/v1beta1/namespaces/default/deployments?limit=500 200 OK in 31 milliseconds
I0415 21:08:01.702544 9061 round_trippers.go:438] GET https://kubernetes.docker.internal:6443/apis/extensions/v1beta1/namespaces/default/replicasets?limit=500 200 OK in 15 milliseconds
I0415 21:08:01.723399 9061 round_trippers.go:438] GET https://kubernetes.docker.internal:6443/api/v1/namespaces/default/pods?limit=500 200 OK in 16 milliseconds
deployment.extensions/dive-mattermost-preview 1/1 1 1 12m
replicaset.extensions/dive-mattermost-preview-6b76f7944 1 1 1 12m
pod/dive-mattermost-preview-6b76f7944-zbv99 1/1 Running 0 12m
書籍通り、ここでも、get コマンドを実行すると API が叩かれることを確認できました
Pod オブジェクトの作成からコンテナの起動までの動き
$ kubectl get event -w -o custom-columns=KIND:.involvedObject.kind,NAME:.metadata.name,SOURCE:.source.component,REASON:.reason,MESSAGE:.message
KIND NAME SOURCE REASON MESSAGE
Deployment dive-mattermost-preview.1605fc2e13813018 deployment-controller ScalingReplicaSet Scaled up replica set dive-mattermost-preview-6b76f7944 to 1
ReplicaSet dive-mattermost-preview-6b76f7944.1605fc2e1a59be64 replicaset-controller SuccessfulCreate Created pod: dive-mattermost-preview-6b76f7944-zbv99
Pod dive-mattermost-preview-6b76f7944-zbv99.1605fc2e1eaaf8ac default-scheduler Scheduled Successfully assigned default/dive-mattermost-preview-6b76f7944-zbv99 to docker-desktop
Pod dive-mattermost-preview-6b76f7944-zbv99.1605fc2e98dd569c kubelet Pulled Container image "k8spracticalguide/mattermost-preview:4.10.2" already present on machine
Pod dive-mattermost-preview-6b76f7944-zbv99.1605fc2ea433445c kubelet Created Created container mattermost-preview
Pod dive-mattermost-preview-6b76f7944-zbv99.1605fc2eb11d2a84 kubelet Started Started container mattermost-preview
ここでも、Deployment / ReplicaSet / Pod という順番にイベントが行われていることが確認できました。
次は 3.2.2 章をやっていきます。
「Update / Delete ControllrManager による調整ループとセルフヒーリング」です
最後に
今回は、コマンドが API を叩いているところを実感できる内容になりました。
なお、「Kubernetes 実践入門」をやっていますが、本屋さんで色々見てこの本に出会い、なんだか出会ってよかったが感じられています。
最後にパート2
短縮名だけは表でのこしとこう。
NAME | SHORTNAMES | APIGROUP | NAMESPACED | KIND |
---|---|---|---|---|
componentstatuses | cs | false | ComponentStatus | |
configmaps | cm | true | ConfigMap | |
endpoints | ep | true | Endpoints | |
events | ev | true | Event | |
limitranges | limits | true | LimitRange | |
namespaces | ns | false | Namespace | |
nodes | no | false | Node | |
persistentvolumeclaims | pvc | true | PersistentVolumeClaim | |
persistentvolumes | pv | false | PersistentVolume | |
pods | po | true | Pod | |
replicationcontrollers | rc | true | ReplicationController | |
resourcequotas | quota | true | ResourceQuota | |
serviceaccounts | sa | true | ServiceAccount | |
services | svc | true | Service | |
customresourcedefinitions | crd,crds | apiextensions.k8s.io | false | CustomResourceDefinition |
daemonsets | ds | apps | true | DaemonSet |
deployments | deploy | apps | true | Deployment |
replicasets | rs | apps | true | ReplicaSet |
statefulsets | sts | apps | true | StatefulSet |
horizontalpodautoscalers | hpa | autoscaling | true | HorizontalPodAutoscaler |
cronjobs | cj | batch | true | CronJob |
certificatesigningrequests | csr | certificates.k8s.io | false | CertificateSigningRequest |
events | ev | events.k8s.io | true | Event |
daemonsets | ds | extensions | true | DaemonSet |
deployments | deploy | extensions | true | Deployment |
ingresses | ing | extensions | true | Ingress |
networkpolicies | netpol | extensions | true | NetworkPolicy |
podsecuritypolicies | psp | extensions | false | PodSecurityPolicy |
replicasets | rs | extensions | true | ReplicaSet |
ingresses | ing | networking.k8s.io | true | Ingress |
networkpolicies | netpol | networking.k8s.io | true | NetworkPolicy |
poddisruptionbudgets | pdb | policy | true | PodDisruptionBudget |
podsecuritypolicies | psp | policy | false | PodSecurityPolicy |
priorityclasses | pc | scheduling.k8s.io | false | PriorityClass |
storageclasses | sc | storage.k8s.io | false | StorageClass |