Kubernetes　Podについてのメモ

# Podとは

Pod一番小さく一番シンプルなKubernetesのオブジェクトです。
Podとはクラスターで動作しているいくつかのコンテナのまとまりです。
通常、Pod は一つの主コンテナを実行するように設定されます。ロギングなどの補足機能を付加する、取り外し可能なサイドカーコンテナを実行することもできます。

Pod は通常 Deployment によって管理されます。

## Podが保持する詳細情報

```
$ kubectl describe pod                         
Name:         helloworld
Namespace:    default
Priority:     0
Node:         minikube/192.168.49.2
Start Time:   Wed, 14 Apr 2021 14:01:10 +0900
Labels:       run=helloworld
Annotations:  <none>
Status:       Running
IP:           172.17.0.3
IPs:
  IP:  172.17.0.3
Containers:
  helloworld:
    Container ID:   docker://e5268c35b6cad3d5416e2cc9f6ba93f1fb5d5c1a9755fc5b3d9957d4c313747d
    Image:          gcr.io/google-samples/hello-app:1.0
    Image ID:       docker-pullable://gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 14 Apr 2021 14:01:11 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-f79sx (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-f79sx:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-f79sx
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:          <none>
```

### Name

Serviceの名前です。一意である必要があります。

クライアントから提供され、リソースURL内のオブジェクトを参照する文字列です。例えば/api/v1/pods/何らかの名前のようになります。
同じ種類のオブジェクトは、同じ名前を同時に持つことはできません。しかし、オブジェクトを削除することで、旧オブジェクトと同じ名前で新しいオブジェクトを作成できます。

### Namespace

Namespace同一の物理クラスター上で複数の仮想クラスターをサポートするために使われる抽象概念です。
Namespaceはクラスター内のオブジェクトをまとめたり、クラスターのリソースを分離するための方法を提供します。

リソース名は、Namespace内で一意である必要がありますが、Namespaceをまたいだ場合はその必要はないです。

### Priority

ポッド優先順位は、他のポッドに対するポッドの重要性を示します。
POD優先順位は、PODのスケジューリング優先順位を他のPODよりも高く、より低く設定する機能を提供します。
実動クラスタワークロードの重要な機能です。

### Node

ノードはKubernetesのワーカーマシンです。

ワーカーノードは、クラスターに応じてVMまたは物理マシンの場合があります。

Podの実行に必要なローカルデーモンまたはサービスがあり、コントロールプレーンによって管理されます。

ノード上のデーモンには、kubelet、kube-proxy、およびDockerなどのCRIを実装するコンテナランタイムが含まれます。Kubernetesの初期バージョンでは、ノードは"Minion"と呼ばれていました。

### Start Time

Podの起動日時です。

### Labels

ユーザーにとって意味があり関連性のある識別属性を、オブジェクトにタグ付けするものです。
ラベルは、Podなどのオブジェクトに付与されるキーと値のペアです。オブジェクトのサブセットを組織化したり選択したりするために使われます。

### Annotations

さまざまなコンテナ化されたアプリケーションが実行されるレイヤー。

Annotationは任意の非識別メタデータをオブジェクトにアタッチするために使用されるキーと値のペアです。
アノテーション内のメタデータは、小さいか大きく、構造化または非構造化で、ラベルで許可されていない文字を含めることができます。

ツールやライブラリなどのクライアントは、このメタデータを取得できます

### Status

Podの状態を示します。

Waiting、Running、Terminatedのいずれかです。

### Containers

軽量でポータブルなソフトウェアとそのすべての依存関係が含まれている実行可能なイメージです。

コンテナはアプリケーションから基盤となるホストインフラストラクチャを分離させ、さまざまなクラウドまたはOS環境での展開を容易にし、スケーリングを容易にします。

describeコマンドでは、コンテナ対し、詳細情報が表示されます。
表示される情報はコンテナによって異なります。以下は一例です。

情報 | 詳細
--- | ---
Container ID | コンテナのID、Docker IDと同じ
Image | ベースとしているイメージ名
Image ID | イメージID
Port | ポート
Host Port | ホストで公開するポート番号ほとんどのコンテナはこれを必要としません)
State | ステータスと日時、その理由等がステータスに合わせて表示される
Ready | リクエストを受け付ける準備が整っているかどうか
Restart Count | 再起動回数
Environment | コンテナで定義される環境変数一覧
Mounts | マウント場所

[Liveness Probe、Readiness ProbeおよびStartup Probeを使用する | Kubernetes](https://kubernetes.io/ja/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)

```
containers:
  helloworld:
    Container ID:   docker://e5268c35b6cad3d5416e2cc9f6ba93f1fb5d5c1a9755fc5b3d9957d4c313747d
    Image:          gcr.io/google-samples/hello-app:1.0
    Image ID:       docker-pullable://gcr.io/google-samples/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 14 Apr 2021 14:01:11 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-f79sx (ro)
```

### Condition

PodにはPodStatusがあります。
それはPodが成功したかどうかの情報を持つPodConditionsの配列です。

フィールド名 | 内容
- | -
type | このPodの状態の名前です。
Initialized | すべてのInitコンテナが正常に開始されました。
Ready | Podはリクエストを処理できるようになり、マッチするすべてのサービスのロードバランシングプールに追加されることになります。
ContainersReady | Pod内のすべてのコンテナが準備できています。
PodScheduled | PodがNodeにスケジュールされています。
status | その状態が適用可能かどうか示します。可能な値は"True"と"False"、"Unknown"のうちのいずれかです。
lastProbeTime | Pod Conditionが最後に確認されたときのタイムスタンプが表示されます。
lastTransitionTime | 最後にPodのステータスの遷移があった際のタイムスタンプが表示されます。
reason | 最後の状態遷移の理由を示す、機械可読のアッパーキャメルケースのテキストです。
message | ステータスの遷移に関する詳細を示す人間向けのメッセージです。

```
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
```

### Volume

[Volumes | Kubernetes](https://kubernetes.io/docs/concepts/storage/volumes/)

コンテナ内のディスク上のファイルは一時的なものであり、コンテナ内で実行する場合、重要なアプリケーションでいくつかの問題が発生します。
1つの問題は、コンテナーがクラッシュしたときにファイルが失われることです。
Kubeletはコンテナを再起動しますが、クリーンな状態です。
2番目の問題は、ポッド内で一緒に実行されているコンテナー間でファイルを共有するときに発生します。
Kubernetesボリュームの抽象化は、これらの問題の両方を解決します。

#### バックグラウンド

Kubernetesは多くの種類のボリュームをサポートしています。
ポッドは、任意の数のボリュームタイプを同時に使用できます。一時ボリュームタイプにはポッドの存続期間がありますが、永続ボリュームはポッドの存続期間を超えて存在します。
その結果、ボリュームはポッド内で実行されるすべてのコンテナーよりも長持ちし、データはコンテナーの再起動後も保持されます。ポッドが存在しなくなると、Kubernetesは一時的なボリュームを破棄します。ただし、Kubernetesは永続ボリュームを破棄しません。

### ボリュームの種類

[Kubernetesで使えるボリューム・タイプのチートシート - Qiita](https://qiita.com/MahoTakara/items/37b9f9eb0ab7f8ab5b6c)

### QoS Class

KubernetesはPodの作成時に次のいずれかのQoSクラスをPodに割り当てます:

QoSクラス | 役割
-- | --
Guaranteed | Pod内のすべてのコンテナにメモリーの制限と要求が与えられており、同じ値であること。<br>Pod内のすべてのコンテナにCPUの制限と要求が与えられており、同じ値であること。
Burstable | PodがGuaranteed QoSクラスの基準に満たない場合。<br>Pod内の1つ以上のコンテナがメモリーまたはCPUの要求を与えられている場合。
BestEffort | PodにBestEffort QoSクラスを与えるには、Pod内のコンテナにはメモリーやCPUの制限や要求を指定してはなりません。

### Node-Selectors

#### Node上へのPodのスケジューリング

Podが稼働するNodeを特定のものに指定したり、優先条件を指定して制限することができます。

#### NodeSelector

nodeSelectorは、Nodeを選択するための、最も簡単で推奨されている手法です。

nodeSelectorはPodSpecのフィールドです。これはkey-valueペアのマップを特定します。 あるノードでPodを稼働させるためには、そのノードがラベルとして指定されたkey-valueペアを保持している必要があります(複数のラベルを保持することも可能です)。 最も一般的な使用方法は、1つのkey-valueペアを付与する方法です。

### Tolerations

toleration はPodに適用され、一致するtaintが付与されたNodeへPodがスケジューリングされることを認めるものです。ただしそのNodeへ必ずスケジューリングされるとは限りません。

## 参考

[Kubernetesドキュメント | Kubernetes](https://kubernetes.io/ja/docs/home/)