Kubernetesの勉強をする必要があるため以下の公式チュートリアルを試しています。その備忘録の共有です。
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/
分量が結構多いので今回はモジュール1〜3のまとめです。
クラスターの作成
- クラスターの中にマスターとノードが入っていて。ノードの中にはさらにノードプロセスがあるらしい。
- クラスター - マスター - ノード(複数ある) - ノードプロセス
チュートリアルで使っていたコマンド
- Step1
# minikubeのバージョン確認 minikube version # minikubeのスタート minikube start
- Step2: kubectl
# クラスターのバージョンを調べる kubectl version # クラスター情報の取得 kubectl cluster-info # ノード情報の取得 kubectl get nodes
アプリケーションのデプロイ
- Deploymentが作成される
- Deploymentがアプリケーションインスタンスを作成、更新方法を設定する
- マスターはアプリケーションインスタンスをノードにスケジュールする
- Deploymentコントローラーはアプリケーションインスタンスを監視し停止したら別のノード上のインスタンスと置き換える。
- kubectlでDeploymentの設定もできるらしい。
- Deploumentを作成する時にはアプリケーションのコンテナイメージと実行するレプリカの数を指定する必要があるらしい。
チュートリアルのコマンド
# ①コマンドのヘルプは以下のように出せる kubectl get nodes --help # ②deploymentoの作成 kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 # ③deploymentの情報を取得 kubectl get deployments # ④kubernetesで動いているアプリケーションはネットワーク的に通常見えないがkubectlではAPIを通じてやりとりできるらしい # ⑤kubectlでプライベートネットワークと接続可能なプロキシを作れるらしい。ターミナルのタブを新しく開いて以下を実行(チュートリアルではタブを開くのもコマンドクリックでできてしまう!) kubectl proxy # プロキシエンドポイント経由でホストしているAPIの確認が可能。カール実行 curl http://localhost:8001/version # ⑥APIサーバーは各podのエンドポイントを作っておりそこもプロキシ契約でアクセス可能。以下の例では環境変数にpodの名前を入れて取ってきてる。 export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME ※プロキシ使わずにdeploymentにアクセスする方法もあるらしい。でも後の話。
- ⑤の出力はこんな感じ。何の情報なのかはあまり触れられていない。
{ "major": "1", "minor": "17", "gitVersion": "v1.17.3", "gitCommit": "06ad960bfd03b39c8310aaf92d1e7c12ce618213", "gitTreeState": "clean", "buildDate": "2020-02-11T18:07:13Z", "goVersion": "go1.13.6", "compiler": "gc", "platform": "linux/amd64" }
デプロイしたアプリケーションの探索
Podとノードについて
さっきのチュートリアルでもしれっと出てきたPodについての説明。とても大切な概念。
Deploymentがノード内にアプリケーションを入れる時直接 or Dockerコンテナとしておくなではなく1つ以上のアプリケーションコンテナを含んだpodを作る。
podはkubernetesの最小単位。コンテナで共有する共通リソースもpod内に含まれる。
podに含まれてるのは主に以下3種類
- IPアドレス
- 共有ストレージ(要するにVolume)
- 設定情報。ポートとかスケジュールとか?
pod内に複数コンテナがモテるのでデータの共有などの依存関係が強いコンテナをまとめて入れてスケジューリングできる。docker-composeの上位互換な感じに聞こえますね。
ノードで障害が発生したら同じpodが別ノードで代わりに実行されるらしい。ノードを複数持っているホットスタンバイというやつですね。てかクラスター構成
ノード
- ワーカーマシン
- マスターによって管理される
- 各ノードで利用可能なリソースを考慮に入れる必要がある。
- ノードに含まれるのは以下
- kubletというマスターとノード感の通信をやりとりするためのプロセス
- イメージ取得やコンテナ回答、アプリ実行などを担当するコンテナランタイム(Dockerとか)
トラブルシューティング
トラブルシューティングに必要なkubectlコマンドは主に以下・dockerと似ている。
- kubectl get - リソースの一覧を表示
- kubectl describe - 単一リソースに関する詳細情報を表示
- kubectl logs - 単一Pod上の単一コンテナ内のログを表示
- kubectl exec - 単一Pod上の単一コンテナ内でコマンドを実行
チュートリアル
- step1:アプリケーション(というかpod)の設定を確認する
# podの一覧を取得する kubectl get pods # podの情報を参照する kubectl describe pods
- step2: アプリケーションを表示する
# podはプライベートネットワーク上にあるのでプロキシの起動してpodにアクセスできるようにする kubectl proxy # pod名を環境変数に入れる export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') echo Name of the Pod: $POD_NAME # アプリケーションの出力をターミナルに表示(curlで取ってくる) curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
- step3: ログの確認
# アプリケーションのログ確認。コンテナがpodの中に一つのときはコンテナ見の指定は不必要 kubectl logs $POD_NAME
- step4 コマンドをコンテナの中で実行する
# 環境変数のリスト表示(envと打つと出ることを初めて知った。。。)。今回もコンテナ名は省略可能。 kubectl exec $POD_NAME env # bashを実行:コンテナに乗り込む kubectl exec -ti $POD_NAME bash # アプリケーションファイル(Node.js)があるのでソースを表示してみる。 cat server.js # アプリケーションの挙動を確認する(curl)。podないで実行しているのでlocalhost指定でOK。 curl localhost:8080 # 退出するときはdockerと同じ exit
ちなみにkubectl decribeの出力は以下のようになるらしいが今は内容についてはあまり触れないらしい。
$ kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-bootcamp-765bf4c7b4-4mjpd 1/1 Running 0 80s $ kubectl describe pods Name: kubernetes-bootcamp-765bf4c7b4-4mjpd Namespace: default Priority: 0 Node: minikube/172.17.0.86 Start Time: Fri, 08 May 2020 17:41:58 +0000 Labels: pod-template-hash=765bf4c7b4 run=kubernetes-bootcamp Annotations: <none> Status: Running IP: 172.18.0.4 IPs: IP: 172.18.0.4 Controlled By: ReplicaSet/kubernetes-bootcamp-765bf4c7b4 Containers: kubernetes-bootcamp: Container ID: docker://38e8c4e3e9d159d5b05b0580ef22db83a33834c29e192d021f42545f7f44d9a6 Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af Port: 8080/TCP Host Port: 0/TCP State: Running Started: Fri, 08 May 2020 17:42:01 +0000 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-9jn9m (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-9jn9m: Type: Secret (a volume populated by a Secret) SecretName: default-token-9jn9m 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 ---- ------ ---- ---- ------- Warning FailedScheduling 3m31s (x2 over 3m31s) default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate. Normal Scheduled 3m24s default-scheduler Successfully assigned default/kubernetes-bootcamp-765bf4c7b4-4mjpd to minikube Normal Pulled 3m22s kubelet, minikube Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine Normal Created 3m21s kubelet, minikube Created container kubernetes-bootcamp Normal Started 3m21s kubelet, minikube Started container kubernetes-bootcamp
Kubernetes完全ガイド (impress top gear)
- 作者:青山 真也
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)