Kubernetesの勉強

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)

Kubernetes完全ガイド (impress top gear)

  • 作者:青山 真也
  • 発売日: 2018/09/21
  • メディア: 単行本(ソフトカバー)