Kubernetes をクラウドのマネージドサービスで使うと、クラスタを管理する部品の運用を任せられます。 ただし、アプリの設定や、ノードの更新までどこに任せられるかは、選ぶサービスや動作モードによって違います。
この章では、Kubernetes を管理する側と、コンテナを動かす側に分けて、その境界を確認します。 EKS、GKE、AKS を比べながら、利用者の手元に残る仕事を見ていきます。
GOAL この章のゴール
- クラスタを管理する側と、コンテナを動かす側を区別できる
- サービスや動作モードごとに、利用者に残る管理作業が分かる
- Kubernetes の認定制度が保証する範囲を説明できる
Pod の置き場所を決める側と、動かす側
Part 1 では、kubectl apply を受け付けて Pod の置き場所を決める側 (kube-apiserver、etcd、scheduler、controller 群) と、その決定どおりにコンテナを起動する側 (各ノードの kubelet とコンテナランタイム) を見ました。
決める側を コントロールプレーンコントロールプレーンPod やタスクの置き場所を決め、クラスタの状態を保存する側。Kubernetes では kube-apiserver、etcd、scheduler、controller 群。用語集で見る、動かす側を データプレーンデータプレーン決定どおりにコンテナを起動して動かす側。Kubernetes では各ノードの kubelet とコンテナランタイム。用語集で見る と呼びます。
ECS を使ったことがあれば、同じ分け方をすでに体験しています。 ECS の API とスケジューラが決める側で、タスクが実際に走る EC2 (container instance) や Fargate が動かす側です。 ECS のドキュメントによると、各 container instance では container agent が動き、task の状態を ECS に報告し、ECS の要求で task を起動したり止めたりします。 kubelet と同じ仕事です。
ECS の用語を Kubernetes に対応づけると、おおむね次の通りです (雑な対応なので、細部は違います)。
| 観点 | Amazon ECS | Kubernetes |
|---|---|---|
| コントロールプレーン | ECS API + スケジューラ (ソースは非公開) | kube-apiserver + etcd + scheduler + controllers (OSS) |
| ノードのエージェント | ecs-agent (OSS、Go) | kubelet |
| クラスタ | cluster (task を置く EC2 / Fargate をまとめる単位) | cluster |
| ワークロードの単位 | task (= 1 つ以上のコンテナ) | Pod |
| ワークロードの定義 | task definition (JSON) | Pod spec (YAML) |
| 複数を維持する | service | Deployment / ReplicaSet |
| 外に出す | service + ターゲットグループ | Service type: LoadBalancer / Ingress / Gateway |
| ネットワーク | awsvpc モード (task ごとに ENI) | CNI (EKS では VPC CNI が ENI のセカンダリ IP を配る) |
マネージド Kubernetesマネージドクバネティスコントロールプレーンの運用をクラウド会社が引き受けるサービス。EKS、GKE、AKS など。用語集で見る とは、この決める側 (kube-apiserver や etcd のプロセス) を、クラウド会社が自分のアカウントの中で動かして運用してくれるサービスのことです。 EKS、GKE、AKS、OKE、そして ECS はいずれもコントロールプレーンをクラウド側で動かし、利用者には API エンドポイントの URL だけを見せます。 その結果、etcd のバックアップ、apiserver の冗長化、証明書のローテーションはクラウド側の仕事になります。
EKS の境界線
EKS を作って kubectl get pods -n kube-system を打つと、aws-node、coredns、kube-proxy が並びます。
EKS のドキュメントによると、この 3 つ (Amazon VPC CNI、CoreDNS、kube-proxy) は、どのクラスタにも EKS が自動で入れる add-on です。
一方で kube-apiserver や etcd の Pod はこの一覧に現れません。
これらは利用者の VPC の外、AWS 管理のアカウントで動いているからです。
AWS のドキュメントによると、コントロールプレーンはクラスタごとに専用で、apiserver は 2 台以上、etcd は 3 台が、リージョン内の 3 つの AZ に分けて置かれ、不調になれば AWS が置き換えます。
AWS 側には kube-apiserver、etcd、scheduler、kube-controller-manager に加えて、EKS 固有の部品が居ます。
type: LoadBalancer の Service を見て ELB を作る cloud provider の LB controller、IAM の認証情報を Kubernetes のユーザーに対応づける認証の部品 (aws-iam-authenticator)、Fargate に Pod を置くための専用スケジューラと admission controller です。
どれも kubectl get pods には出ません。
利用者の VPC 側には、サブネットごとに EC2 のノードがあり、kubelet と containerd、そして Amazon VPC CNI (aws-node DaemonSet) が動きます。
kubelet は EKS の API エンドポイントに接続して Pod の指示を受けます。
反対向きの通信のために、EKS はクラスタを作るときに利用者のサブネットへ 2〜4 個のネットワークインターフェースを作ります。
kubectl exec、kubectl logs、kubectl port-forward のような kubelet API を使う機能と、コントロールプレーンとノードの間のトラフィックがそこを通ります。
VPC で説明欄に Amazon EKS <クラスタ名> と書かれた ENI が、この差し込み口です。
誰がどの層を管理するか
境界線はサービスごとに違い、同じ EKS でも Auto Mode か、Fargate か、managed node group かで変わります。 下の表で切り替えて、層ごとの管理者を比べてみてください。
EKSmanaged node groupAWS 2共同 6あなた 1
- コントロールプレーンAWSkube-apiserver を複数 AZ で冗長化して AWS が運用。Kubernetes のバージョン選択と更新の指示はあなた。
- etcd (状態の保存)AWSAWS が運用し、バックアップも取る。利用者は直接触れない。
- ノード / OS共同EKS 最適化 AMI と managed node group の更新機能は AWS。インスタンスタイプ、台数、いつ更新するかはあなた。
- kubelet (ノードのエージェント)共同AMI に同梱。ノードを更新すると kubelet も更新される。
- コンテナランタイム共同containerd (AMI 同梱)。
- ネットワーク (CNI)共同Amazon VPC CNI が既定で入る。add-on のバージョン更新はあなたが指示する。
- ストレージ (CSI)あなたEBS CSI driver は add-on として自分で入れる (IAM ロールの用意も)。
- LB 連携共同コントロールプレーン内の cloud-provider-aws が CLB / NLB を作る (重要な修正のみの保守モード)。AWS Load Balancer Controller は自分で入れる。
- アップグレード共同コントロールプレーンの更新は AWS が実行 (あなたが指示)。ノードと add-on の更新はあなた。
「共同」は、部品はクラウドが配るが、いつ入れ替えるかを決めるのはあなた、という層です。障害時に最初に疑う場所もここになります。
EKS のドキュメントは、ノードの選び方として EKS Auto Mode、Fargate、Karpenter、managed node group、self-managed ノード、オンプレミスや edge のマシンを繋ぐ Hybrid Nodes を挙げています。 どれを選ぶかで、この表の分担が変わります。
読み取れることは 4 つあります。
- コントロールプレーンと etcd は、どのマネージドでもクラウド側です。ここがマネージドの最低ラインです。
- ノード / OS の行が一番ぶれます。EKS の managed node group や GKE Standard は「AMI は配るが、いつ入れ替えるかは利用者」という共同管理で、Fargate や GKE Autopilot、EKS Auto Mode はノードそのものを意識させません。
- CSI と LB 連携は、EKS では長らく利用者が入れる側でした。GKE と AKS は最初から組み込みです。EKS Auto Mode でここが埋まりました。
- 自前 (EC2 + kubeadm) は全部利用者です。この教材のクラスタも構造としてはこれに近く、kubeadm で組んだコントロールプレーンに Cilium と kubevirt-csi を入れた状態です。
GKE、AKS、OKE の境界線
同じ構造を他のクラウドで見ます。 GKE のドキュメントでは、コントロールプレーンは apiserver、scheduler、主要な controller からなり、クラスタの状態の保存先は etcd か Spanner (Google 管理のデータベース) のどちらかで、どちらの場合もクラスタは etcd の API を提供すると説明されています。 ノードは kubelet が動く Compute Engine の VM です。 Standard モードではノードの設定を利用者が管理し (SSH もできる)、更新と修復は GKE が行います。 Autopilot ではノードの管理も GKE が行い、VM には触れず、課金は Pod が要求したリソースに対して行われます。
AKS は Azure のサービスで、ドキュメントによると kube-apiserver、etcd、kube-scheduler、kube-controller-manager、cloud-controller-manager を Azure が運用します。 ノードは node pool にまとめられた Azure の VM で、既定では Virtual Machine Scale Sets で管理されます。 Azure CNI powered by Cilium を選んだクラスタでは kube-proxy の代わりに Cilium が使われます。 OKE (Oracle) も含め、どのクラウドも「コントロールプレーンはクラウド側、ノードは利用者の VCN / VNet / VPC」という構造は共通です。
ノードを増やす OSS とマネージドサービス
Karpenter は AWS 専用のサービス名ではありません。 EKS Auto Mode は Karpenter を基盤としたノード管理を提供し、AKS の Node Auto-Provisioning も Karpenter と AKS 向け provider を使ってノードを管理します。 Pod の要求から必要なノードを用意する考え方を共有しつつ、作成する VM、ネットワーク、認証は各クラウドの実装が受け持ちます。
同じ OSS が使われても、利用者が管理する範囲はサービスによって異なります。 自分で controller を導入する構成と、クラウドが更新や運用を引き受ける構成を分けて読むと、障害時にどのログを見られ、どこから先をサービス提供者に調べてもらうかが分かります。
Certified Kubernetes が保証するもの
EKS で書いた Deployment の YAML は、GKE でも AKS でもそのまま apply できます。 この互換性を支えているのが、CNCF の Certified Kubernetes Conformance Program です。 CNCF の説明では、この制度は「どのベンダーの Kubernetes も、必要な API を OSS 版と同じように備えている」ことを確かめるためのものです。 各ベンダーは自分のディストリビューションで conformance テストを流して結果を提出し、認定を受けています。
認定を受けているのは、EKS / GKE / AKS / OKE のようなホステッドサービスだけでなく、kind、minikube、k3s のようなローカル向け、OpenShift や Rancher のようなクロスプラットフォームの製品も含みます。 提出手順はリポジトリに書かれていて、Sonobuoy か Hydrophone で得たテスト結果に製品情報と再現手順を添え、Kubernetes のバージョンごとに cncf/k8s-conformance へ pull request として出します。 bot の検査とレビューを経て認定され、認定を保つには毎年、最新バージョンで結果を出し直します。
この認定が保証するのは「Kubernetes の API が仕様通りに振る舞うこと」です。 conformance テストは、たとえば Deployment の replicas を変えると Pod の数が変わるか、Service を作ると対応する Endpoints が付くか、といった挙動を実際のクラスタに対して確かめます。 その外側、つまりノードの OS、CNI の性能、LB の作り方、IAM との繋ぎ方は保証の範囲外で、クラウドごとに違います。 この Part の残りで扱うのはその外側です。
ふりかえり
QEKS で etcd のバックアップを取るのは誰?
etcd はコントロールプレーンの一部で、AWS 管理のアカウントで動いています。利用者が見られるのは API エンドポイントだけで、etcd への直接アクセスはできません。
QECS で kubelet に相当するものは?
ecs-agent が各 container instance で動き、ECS のコントロールプレーンに接続してタスクの起動や状態報告を行います。kubelet と同じ「ノード側のエージェント」です。
QCertified Kubernetes が保証するのは?
conformance テストが検証するのは Kubernetes の API の挙動です。ノードの管理方法や LB の統合はクラウドごとに違い、認定の範囲外です。
参考
-
View Amazon EKS networking requirements for VPC and subnets (Amazon EKS User Guide)
-
Architect your solution for Amazon ECS (Amazon ECS Developer Guide)
-
Azure Kubernetes Service (AKS) Core Concepts (Microsoft Learn)
-
AWS「Scale cluster compute with Karpenter and Cluster Autoscaler」: https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html
-
Microsoft「Overview of Node Auto-Provisioning (NAP)」: https://learn.microsoft.com/en-us/azure/aks/node-autoprovision