5.2 Kubernetes基礎
Kubernetes Fundamentals
Kubernetes(K8s)は、Googleが開発しCNCFに寄贈したコンテナオーケストレーションプラットフォームである。宣言的な設定でコンテナのデプロイ、スケーリング、管理を自動化する。
Kubernetesアーキテクチャ
@startuml
skinparam backgroundColor #FEFEFE
rectangle "Kubernetes Cluster" as Cluster {
rectangle "Control Plane" as CP #DBEAFE {
rectangle "API Server" as API #93C5FD
rectangle "etcd" as ETCD #93C5FD
rectangle "Scheduler" as Sched #93C5FD
rectangle "Controller Manager" as CM #93C5FD
}
rectangle "Worker Node 1" as Node1 #D1FAE5 {
rectangle "kubelet" as KL1 #6EE7B7
rectangle "kube-proxy" as KP1 #6EE7B7
rectangle "Pod" as Pod1 #34D399 {
rectangle "Container" as C1 #10B981
}
rectangle "Pod" as Pod2 #34D399 {
rectangle "Container" as C2 #10B981
}
}
rectangle "Worker Node 2" as Node2 #D1FAE5 {
rectangle "kubelet" as KL2 #6EE7B7
rectangle "kube-proxy" as KP2 #6EE7B7
rectangle "Pod" as Pod3 #34D399 {
rectangle "Container" as C3 #10B981
}
}
}
API <--> KL1
API <--> KL2
Sched --> Node1 : スケジューリング
Sched --> Node2
@enduml
図1: Kubernetesクラスタのアーキテクチャ
| コンポーネント | 役割 |
|---|---|
| API Server | クラスタへの全リクエストを処理 |
| etcd | クラスタ状態を保存する分散KVS |
| Scheduler | Podを適切なノードに配置 |
| Controller Manager | 望ましい状態を維持 |
| kubelet | ノード上でPodを管理 |
| kube-proxy | ネットワークルールを管理 |
主要リソース
@startmindmap skinparam backgroundColor #FEFEFE * Kubernetesリソース ** ワークロード *** Pod **** 最小デプロイ単位 **** 1つ以上のコンテナ *** Deployment **** Podのレプリカ管理 **** ローリングアップデート *** StatefulSet **** ステートフルアプリ **** 順序付きデプロイ *** DaemonSet **** 全ノードで1Pod **** 監視エージェント等 ** サービス/ネットワーク *** Service **** Pod群への安定したエンドポイント **** ClusterIP, NodePort, LoadBalancer *** Ingress **** HTTP(S)ルーティング **** パスベースルーティング left side ** 設定/ストレージ *** ConfigMap **** 設定データ **** 環境変数、ファイル *** Secret **** 機密データ **** Base64エンコード *** PersistentVolume **** 永続ストレージ *** PersistentVolumeClaim **** ストレージ要求 ** Namespace *** リソースの論理分離 *** チーム/環境別 @endmindmap
図2: Kubernetesの主要リソース
Kubernetesは「望ましい状態」をYAMLファイルで宣言し、コントローラが現在の状態を望ましい状態に近づけるように動作する。この宣言的アプローチがKubernetesの特徴である [1]。
Serviceタイプ
| タイプ | アクセス範囲 | 用途 |
|---|---|---|
| ClusterIP | クラスタ内部のみ | 内部通信(デフォルト) |
| NodePort | ノードIP:ポート | 開発/テスト |
| LoadBalancer | 外部ロードバランサ | 本番公開 |
| ExternalName | 外部DNS名 | 外部サービス参照 |
マネージドK8sでのLoadBalancer
クラウド環境でtype: LoadBalancerを指定すると、各クラウドのロードバランサ(AWS ALB/NLB、Azure LB、GCP LB)が自動的にプロビジョニングされる。
クラウド環境でtype: LoadBalancerを指定すると、各クラウドのロードバランサ(AWS ALB/NLB、Azure LB、GCP LB)が自動的にプロビジョニングされる。
出典
[1] Kubernetes Documentation. https://kubernetes.io/docs/
[2] CNCF (Cloud Native Computing Foundation). https://www.cncf.io/
[2] CNCF (Cloud Native Computing Foundation). https://www.cncf.io/