はじめに
この記事では、初心者がYoutube動画からkubernetesの基本概念についてまとめたものとなります。
以下のYoutubeで学んだ内容をピックアップしてまとめました。
この動画は、IT初心者の自分でもかなりクリアにK8sの概要が入ってきたとってもいい動画です!
https://www.youtube.com/watch?v=r0NpHb-6IvY
k8sの難しいところ
抽象的な概念が多く、レイヤーの異なる概念が混在しているから。

1. コンポーネント
コンポーネントとは、k8sを構成しているもの。大きく分けて二つある。

- Control Planes:マスターとして、他のサーバーに指示を出す。実際の現場では3,4台で冗長化を図る。
- Nodes:ワーカー。実際にコンテナが動作する環境。

上の図をさらに具体的にすると、こうなる。左がマスターノード、右がワーカーノード。
ポイントは、「全てkube-api-serverで繋がっている。APIで連携している。」 ということ。
ここまでで、以下の文章が理解できればOK
- マスターとワーカーノードでクラスタが構成されている
- コンテナをワーカーノードのコンテナランタイムで動かす
- マスターノードとkubelet(各ワーカーノードで実行されるエージェント。マスターノードとやりとりして指示に従う)が通信している
- マスターノードではいろんなコンポーネンントが動いている(全てAPI連携)
2. リソース
k8sではコンテナをうまく管理するために、OSの機能や仕組みをリソースというもので抽象化している。
例)apacheコンテナを起動してポート8080で外部公開する場合
┌──────────────────────────────────────────────────────────────┐
│ ユーザーが記述(抽象化) │
├──────────────────────────────────────────────────────────────┤
│ apiVersion: v1 │
│ kind: Service │
│ spec: │
│ ports: │
│ - port: 8080 ← これだけで定義できる │
└──────────────────────────────────────────────────────────────┘
↓
kube-proxyが自動変換
↓
┌──────────────────────────────────────────────────────────────┐
│ 実体(OSの機能:iptables) │
├──────────────────────────────────────────────────────────────┤
│ iptables -A KUBE-SERVICES \ │
│ -p tcp --dport 8080 \ │
│ -j KUBE-SVC-XXXXXXXX │
│ │
│ iptables -A KUBE-SVC-XXXXXXXX \ │
│ -m statistic --mode random \ │
│ -j KUBE-SEP-YYYYYYYY ← 複雑なルールを自動生成 │
└──────────────────────────────────────────────────────────────┘
上の説明を聞いて、リソースとは
作業がテーマ別でまとめられたもの と理解しました。
リソースとは:テーマ別の作業のまとまり
従来の方法:
┌──────────────────────────────────────────────────────────┐
│ 作業1: コンテナ起動 ← バラバラに作業が必要 │
│ 作業2: ネットワーク設定 │
│ 作業3: プロセス管理 │
│ 作業4: ロードバランシング │
│ 作業5: ログ管理 │
└──────────────────────────────────────────────────────────┘
Kubernetesのリソース:
┌──────────────────────────────────────────────────────────┐
│ Podリソース ← 「コンテナ実行」に関する作業を集約 │
│ └─ 作業: コンテナ起動、リソース制限など │
├──────────────────────────────────────────────────────────┤
│ Serviceリソース ← 「ネットワーク」に関する作業を集約 │
│ └─ 作業: ポート公開、ロードバランシング、DNS登録など │
├──────────────────────────────────────────────────────────┤
│ Deploymentリソース ← 「管理・運用」に関する作業を集約 │
│ └─ 作業: レプリカ管理、自動再起動、更新戦略など │
└──────────────────────────────────────────────────────────┘
3. リソース例を見てみる(Podの起動)
最後に、実際の起動の流れの一部を例に取ってみてきます。
2までの内容で、実際にPodが起動する際には以下が順番に実行されると理解しました。
- Podリソース
- Serviceリソース
- deploymentリソース
ここではそのうちのPodリソースにおいて、実際にKubernetes内部で自動的に行われている処理をみていきます。
-
Podの作成を依頼(kubectlやAPIなど)
- クライアントPCから、
kubectl applyなどのコマンドでPodの作成を依頼し、API ServerにPodリソースの情報が送信される
- クライアントPCから、
-
ControllerがAPI Serverの変化を検知して別のAPIを呼ぶ
- ControllerはAPI Serverを監視しているので、リソースの変化を検知し他のAPIを呼び出し追加の処理を実行する
-
kube-schedulerがAPI Serverの変化を検知してPodをどのワーカーノードに配置するか指定
- APIが叩かれるとKubeschedulerがAPIサーバーに、podの置く場所(最適なワーカーノード)を提案する
-
kubeletがマスターノードのAPI Serverの動きを定期的にチェックしているので、そこからPodの作成依頼を取得
- kubeletも定期的にAPI Serverを監視しているので、自分のワーカーノードにコンテナ起動する場合自分で気づいて、Podの作成依頼内容を取得する。
-
kubeletからDocker(コンテナランタイム)へコンテナの作成を依頼
- kubeletが取得したPodの作成依頼内容を、コンテナランタイム(Docker/containerdなど)にAPI経由で依頼する。
-
Docker(コンテナランタイム)によってコンテナが作成される
- コンテナランタイムが実際にコンテナイメージを取得し、コンテナを起動し、Podが実際に動作状態になる。
まとめ
概念がk8s専用なので、大きいところからまず理解して、切り分ける。
その後、切り分けた後の1つを例に取って流れを理解していく。(手を動かす)
この流れで勉強するといいのではないかなと思いました。次は、実際に手を動かしてみます!

