Kubernetesの基本知識
Kubernetesとは
Kubernetesは複数のマシンにまたがってコンテナを管理するツールである。
Dockerとの違い
Dockerはイメージを作成したり実行したりする。
Kubernetesはイメージをもとにコンテナを実行する。複数のマシンにまたがって実行できる。
用語
コンテナ仮想化技術
| 名前 | 説明 |
|---|---|
| Container | アプリケーションとその実行環境をひとまとめにしたものを指す。 |
| Image | Containerを作成するのに必要となるものを指す。 |
クラスターコンピューティング
| 名前 | 説明 |
|---|---|
| Cluster | Nodeの集合体を管理するもの。小規模な構成ではClusterとNodeは同一のマシンになりうる。 |
| Node | コンピュータ1台を指す。Kubernetesにおいては仮想マシンもしくは物理マシンのことを指す。 |
Kubernetesリソース
| 名前 | 説明 |
|---|---|
| Pod | Containerの集合体を指す。しかし実際には1Pod=1Containerで運用することが多いらしい。Kubernetesにおいて最小単位になる。Podの設定はDeploymentのYAMLに書くのが一般的らしい。 |
| Deployment | Podを管理する。宣言通りの状態になるようにPodの数を維持したり、落ちたら復活させたりする。 |
| Service | Podへの固定のアクセス先を提供し、Podへ転送する。後述の設定によってどこからアクセスを受け付けるか指定できる。 |
| ConfigMap | Podが使用する環境変数や設定ファイルを定義する。 |
| Ingress | 本番向けにクラスタ外からのHTTP/HTTPSアクセスを受け付け、Serviceへ転送する。 |
| Gateway | Ingressの後継となるリソース群Gateway APIのうちの1つ。本番向けにクラスタ外からのHTTP/HTTPSアクセスを受け付け、Serviceへ転送する。 |
| HorizontalPodAutoscaler | CPU使用率に応じてPodを自動で増減させる設定を定義する。 |
| Secret | 秘密の情報を格納する。(Kubernetesでは.envは使わない) |
Serviceの接続元
Serviceはどこからのアクセスを受け付けるかを設定できる。
1 2 3 4 | |
| 名前 | 説明 |
|---|---|
| ClusterIP | クラスタ内部からのアクセスを受け付ける設定値。Serviceのデフォルト値。 |
| NodePort | クラスタ外からIPアドレス:ポート番号でアクセス可能とする設定値。開発・学習向け。 |
| LoadBalancer | クラウド(AWS/GCP等)のロードバランサーを自動で作成してアクセスを受け付ける設定値。 |
ツール
kubectl
kubectlはKubernetesクラスターに対してコマンドを実行できるツールである。
1 2 | |
Minikube
kubelet
コンテナランタイム
Kubernetesはデフォルトでコンテナランタイムのcontainerdを使っているらしい。Dockerも内部でcontainerdを使っている。
マルチノード
ノードは仮想か物理か選ぶことになる。
| 項目 | 物理ノード | 仮想ノード |
|---|---|---|
| パフォーマンス | 高い | やや低い (仮想化オーバーヘッドがある) |
| スケーラビリティ | 低い | 高い (VMをすぐ追加可能) |
| 運用・管理 | 手間がかかる | 柔軟で簡単 (スナップショット、テンプレートを活用できる) |
| コスト | 高い (ハード購入が必要) | 低め~柔軟 |
| 柔軟性 | 低い | 高い (リソース調整できる) |
その他、仮想ノードは物理ノードと比べて以下のような違いがある。
- 作り直しが簡単
- CPUやメモリの配分が簡単
- ネットワーク周りの挙動が微妙に違う
仮想ノードについてはさらに以下の選択肢がある。
- KindやMinikubeなどのKubernetes処理系でノードを作成する (以下コンテナ型仮想ノードと呼ぶ)
- 仮想マシンをいくつか立ててその中にノードを作成する (以下仮想マシン型仮想ノードと呼ぶ)
前者はノードがコンテナとして動く。後者はノードがOSレベルで動く。
| 項目 | 仮想マシン型仮想ノード | コンテナ型仮想ノード | 物理ノード |
|---|---|---|---|
| ノードの正体 | 仮想マシン(UbuntuなどフルOS) | Dockerコンテナ内でkubelet | 実機サーバ(Ubuntuなど) |
| OSレベルの挙動 | 本番とほぼ同じ | 軽量OS・一部ホスト依存 | 本番と完全一致 |
| cgroup / systemd / ネットワーク | 本番同様 | 制限あり・ホスト依存 | 本番と完全一致 |
| 起動速度 | 遅め(数十秒〜分) | 速い(数秒〜10秒) | 遅い(サーバ起動時間) |
| リソース消費 | 高い(OSごとに割当) | 軽い(ホストと共有) | 高い(物理リソース丸ごと) |
| スナップショット/再作成 | ディスク大きく重い | すぐ作り直せる | 面倒・物理交換が必要 |
| ネットワーク挙動 | 本番とほぼ同じ | 一部ホスト経由で制限あり | 本番と完全一致 |
| スケール | ホストリソース依存 | 軽量なので多ノード可能 | 物理リソース依存 |
| 適した用途 | 本番準拠の検証、クラウド学習 | 学習、CI/CDテスト、軽量クラスタ | 本番運用、性能検証 |
| 目的 | 推奨ノードタイプ | 理由 |
|---|---|---|
| 学習 / ローカルK8s入門 | コンテナ型仮想ノード | 軽量・簡単・速い |
| CI/CDでクラスタ挙動確認 | コンテナ型仮想ノード | 短時間で作り直せる |
| 本番互換の挙動確認 | 仮想マシン型仮想ノード | OS挙動やネットワークも本番同様 |
| 本番運用 | 物理ノードorクラウドVM | 性能・安定性が最優先 |
オブジェクトの種類(YAML)
Kubernetesオブジェクトを理解する | Kubernetes
YAMLには最低以下を定義する。
| 必須フィールド | 説明 |
|---|---|
apiVersion |
どのバージョンのKubernetesAPIを利用してオブジェクトを作成するか |
kind |
どの種類のオブジェクトを作成するか |
metadata |
オブジェクトを一意に特定するための情報、文字列のname、UID、また任意のnamespaceが該当する |
spec |
オブジェクトの望ましい状態 |
オブジェクトの種類は何十種類もある。
最低限必要なのはDeploymentで、これはPodの管理をやってくれる。
外部からアクセスできるようにしたいなら追加でServiceを定義する。
よく使うコマンド
1 2 3 4 5 | |