コンテンツにスキップ

Kubernetesの基本知識

Kubernetesとは

Kubernetesは複数のマシンにまたがってコンテナを管理するツールである。

Dockerとの違い

Dockerはイメージを作成したり実行したりする。

Kubernetesはイメージをもとにコンテナを実行する。複数のマシンにまたがって実行できる。

用語

uml diagram

コンテナ仮想化技術

名前 説明
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
apiVersion: v1
kind: Service
spec:
  type: 設定値
名前 説明
ClusterIP クラスタ内部からのアクセスを受け付ける設定値。Serviceのデフォルト値。
NodePort クラスタ外からIPアドレス:ポート番号でアクセス可能とする設定値。開発・学習向け。
LoadBalancer クラウド(AWS/GCP等)のロードバランサーを自動で作成してアクセスを受け付ける設定値。

ツール

ツールのインストール | Kubernetes

kubectl

kubectlはKubernetesクラスターに対してコマンドを実行できるツールである。

1
2
$ sudo snap install kubectl --classic
$ kubectl version --client

Minikube

Minikube

kubelet

コンテナランタイム

Kubernetesはデフォルトでコンテナランタイムのcontainerdを使っているらしい。Dockerも内部でcontainerdを使っている。

マルチノード

ノードは仮想か物理か選ぶことになる。

項目 物理ノード 仮想ノード
パフォーマンス 高い やや低い (仮想化オーバーヘッドがある)
スケーラビリティ 低い 高い (VMをすぐ追加可能)
運用・管理 手間がかかる 柔軟で簡単 (スナップショット、テンプレートを活用できる)
コスト 高い (ハード購入が必要) 低め~柔軟
柔軟性 低い 高い (リソース調整できる)

その他、仮想ノードは物理ノードと比べて以下のような違いがある。

  • 作り直しが簡単
  • CPUやメモリの配分が簡単
  • ネットワーク周りの挙動が微妙に違う

仮想ノードについてはさらに以下の選択肢がある。

  1. KindやMinikubeなどのKubernetes処理系でノードを作成する (以下コンテナ型仮想ノードと呼ぶ)
  2. 仮想マシンをいくつか立ててその中にノードを作成する (以下仮想マシン型仮想ノードと呼ぶ)

前者はノードがコンテナとして動く。後者はノードがOSレベルで動く。

uml diagram

項目 仮想マシン型仮想ノード コンテナ型仮想ノード 物理ノード
ノードの正体 仮想マシン(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
# Podの状態を確認する
$ kubectl get pods -w

# Podの状態をずっと確認する
$ kubectl get pods -w