Kubernetes 学習記録#1

個人の学習用になります
参考にならないことが多いです

# Kubernetes Cluster構成
|主要コンポーネント|説明|
|:--|:--|
|kube-apiserver|Kubernetesコントロールプレーンのフロントエンドになる。主に、認証機能の実施、リクエストの処理などを実装する|
|etcd|一貫性、高可用性を持ったキーバリューストアで、Kubernetesの全てのクラスター情報の保存場所になる|
|kube-scheduler|生成時のノードに、リソース、制約、監視のもとノードの割り当てを行う|
|kube-controller-manager|Kubernetesクラスター内の異なるリソースやオブジェクトを監視し、それらの状態を維持したり管理したりする役割|
|cloud-controller-manager|クラウドプロバイダーとKubernetesクラスター内のリソースをクラウドプラットフォームに適切に反映する|

# ノードコンポーネント
|主要コンポーネント|説明|
|:--|:--|
|kubelet|Kubernetesクラスター内の各ノードで実行されるエージェント。主な役割は、各ノード上で実行されるPodの管理と監視|
|kube-proxy|クラスター内の各ノードで動作するネットワークプロキシ。クラスター内および外部のネットワークセッションからPodへのネットワーク通信を可能にする|
|コンテナランタイム|コンテナランタイムは、Kubernetesの要件を満たすために必要なコンテナの実行や管理機能|
|アドオン|Kubernetesクラスターに追加の機能や構成を提供するためのリソース|
|DNS|Kubernetesサービスの名前解決や通信に使用され、コンテナ作成時、DNSレコードは自動的に作成され、他のPodや外部からの名前解決が可能になる|
|Web UI|クラスター内の全てのリソースの状態、メトリクス、ダッシュボードからリソースの作成、イベント、ログ監視、ユーザアクセス制御、RBACなど設定や確認ができる|
|コンテナリソース監視|コンテナに関するCPU使用率、メモリ使用率、ネットワークトラフィックを収集し、データベースに記録する|
|クラスターレベルのロギング |クラスター内の複数のノードやコンテナ、サービスから生成されるログの収集する|

主要コンポーネントは以下コマンドで確認できる
```
$ kubectl get pods --all-namespaces
kube-system   coredns-5dd5756b68-r2xxd                1/1     Running     0               5d13h
kube-system   etcd-minikube                           1/1     Running     0               5d13h
kube-system   kube-apiserver-minikube                 1/1     Running     0               5d13h
kube-system   kube-controller-manager-minikube        1/1     Running     0               5d13h
kube-system   kube-proxy-rk555                        1/1     Running     0               5d13h
kube-system   kube-scheduler-minikube                 1/1     Running     0               5d13h
kube-system   storage-provisioner                     1/1     Running     1 (5d13h ago)   5d13h
```

https://kubernetes.io/ja/docs/concepts/overview/components/#cloud-controller-manager

# Kubectl
Kubernetes APIを使用してKubernetesクラスターのコントロールプレーンと通信するためのコマンドツール

Client⇒Master Node⇒Node
①kubectlでマニュフェストファイルを作成し、リソースをマスターに操作をさせる
②Master Nodeに命令をする
③Master Nodeからノードする
③Podが作成される

# kubectlへアクセスする仕組み
`$HOME/.kube/config`を使用して、どのクラスターに接続するかを管理する
ファイルには、接続するクラスターの情報や認証方法が設定されている

# NodeとPodとコンテナ
|各ワーカーノード|説明|
|:-|:-|
|Node|Kubelet、コンテナランタイム、Kube-proxyなどのKubernetesコンポーネントを実行し、**Podの環境**を提供する。1つのNodeのコンポーネントに、Kubelet,コンテナランタイム,kube-proxyが含まれる|
|Pod|Kubernetesクラスター内でコンテナ化されたアプリケーションを実行するための最小単位。Pod内のコンテナは、同じNode上で共有されたネットワークおよびストレージリソースを**共有**し、**共通**のネットワーク名前空間とIPアドレスを持ち、相互にローカルホストとして通信できる|
|コンテナ|Dockerなどのコンテナランタイムで実行されるアプリケーションの実行単位で、イメージとして定義されている。各コンテナは、独立したプロセスとして実行され、他のコンテナとは隔離された状態で実行される


# Podを起動する
```
# Podを起動
$ kubectl run --image=ubuntu:22.04 --restart=Always dev-ubuntu-test-2204 -it bash
If you don't see a command prompt, try pressing enter.
root@dev-ubuntu-test-2204:/# exit
```
イメージをDocker Hubから取得し、Podが停止しても再起動する状態にする
また、Pod名をdev-ubuntu-test-2204と指定し、双方向通信する設定をアタッチし、双方向通信はbashを指定をする

|起動オプション|説明|
|:-|:-|
|Never|コンテナが停止した場合に**再起動しない**|
|Always|**コンテナが停止した場合でも常に再起動する**|
|OnFailure|コンテナが**エラー終了した場合のみ再起動**|

gcpを利用するの指定
```
# タグによる pull
$ kubectl run --image gcr.io/google-samples/hello-app:2.0
```

```
# ダイジェスト別の pull
$ kubectl run --image gcr.io/google-samples/hello-app@sha256:7104356ed4e3476a96a23b96f8d7c04dfa7a1881aa97d66a76217f6bc8a370d0
```

# Podを表示
```
$ kubectl get pods
NAME                               READY   STATUS             RESTARTS         AGE
dev-ubuntu-test-2204               1/1     Running            1 (7m52s ago)    7m58s

#IPアドレスも表示可
$ kubectl get pods --output wide
dev-ubuntu-test-2204               1/1     Running            1 (13m ago)      13m     10.244.0.18   minikube   <none>           <none>

```
表示される内容
|列|説明|
|:-|:-|
|Name|Podの名前を示します|
|READY|Pod内のコンテナが実行可能な状態にあるかどうかを示します。1/1 は、1つのコンテナが実行可能な状態であることを示します。|
|STATUS|Podの現在の状態を示します。|
|RESTARTS|Podが再起動された回数を示します。|
|RESTARTS|Podが作成されてからの経過時間を示します。|

kubectl get podsのオプション
|主なオプション|説明|
|:-|:-|
|-n または --namespace|特定の名前空間のPodのみを表示します。|
|-l または --selector|特定のラベルセレクターに一致するPodのみを表示します。|
|-o または --output|出力形式を指定します|
|--show-labels|Podのラベルも表示します。|
|--field-selector|特定のフィールドに一致するPodのみを表示します|
|--watch|リアルタイムでPodの状態を監視します。|
|--no-headers|ヘッダーを表示しないようにします。|
|--sort-by|指定されたフィールドでPodをソートします。|



# Pod内のログを表示
指定されたPodのデフォルトのコンテナから直近のログを出力する
```
$ kubectl logs dev-ubuntu-test-2204
2024/04/07 13:19:31 Server listening on port 8080
```

kubectl logs のオプション
|主なオプション|説明|
|:-|:-|
|-f, --follow|ログのリアルタイム表示を有効にします。|
|-p, --previou|直前のコンテナのログを表示します。Podが再起動した場合、前のコンテナのログも表示できます。|
|-c, --container|特定のコンテナのログを表示します。Pod内に複数のコンテナがある場合、このオプションで特定のコンテナを指定します。|
|-l, --selector|特定のラベルセレクターに一致するPodのログを表示します。|
|--field-selector|特定のフィールドに一致するPodのみを表示します|
|--since|特定の時間以降に生成されたログのみを表示します。|
|--tail|直近のログ行数を指定します。|
|--timestamps|ログにタイムスタンプを表示します。|


# Podのメタデータの表示
```
$ kubectl describe pod dev-ubuntu-test-2204
```

# 作動中のコンテナの中にシェルで入る
```
$ kubectl exec -it dev-ubuntu-test-2204 -- bash
```

# Podを削除
```
$ kubectl delete pod dev-ubuntu-test-2204
pod "dev-ubuntu-test-2204" deleted
```
|主なオプション|説明|
|:-|:-|
|--all, -a|全てのリソースを削除します。--all または -a を指定すると、全てのPodが削除されます。|
|--selector, -l|特定のラベルを持つPodを削除します。例えば、-l key=value を指定すると、指定されたキーと値のラベルを持つPodが削除されます。|
|--field-selector|特定のフィールドの値に基づいてPodを選択して削除します。例えば、--field-selector=status.phase=Running を指定すると、実行中のPodのみが削除されます。|
|-l, --selector|特定のラベルセレクターに一致するPodのログを表示します。|
|--grace-period|強制的にPodを削除します。このオプションを指定すると、Podが削除されるまでの待機時間が無視されます。|
|kubectl delete pod -f dev-ubuntu-test-76d6865ff5-5h4hk|特定の時間以降に生成されたログのみを表示します。|



# コンテナに繋げるホスト側のポートを変える 
```
$ kubectl run dev-ubuntu-test-2204 --image=ubuntu:22.04 --restart=Never --port=8080 -- /bin/sh -c "trap : TERM INT; sleep infinity & wait"
```

# 接続をする
```
$ kubectl exec -it dev-ubuntu-test-2204 -- bash
```