職場でEKSを利用しているので、EKS固有の注意点とかまとめられるといいな〜と思っていました。この記事ではオンプレでKubernetesを利用している人がEKSを使う場合にどういう点に気をつけるといいかをProductionproofing EKSも参考にしてまとめてみます。目次を見て、興味ありそうなら読んでみてください。
ニッチなケースは対策までは考えれていないので、随時思いつけたら更新できるといいなと思います。
ネットワーク
KubernetesはCNIによってネットワーク実装をプラガブルなものとしています。EKS利用時はamazon-vpc-cni-k8s(以下、aws-cni)というCNIを利用します。そのためaws-cniの仕様に基づく固有の注意点を理解する必要があります。それぞれの注意点に結びつく、aws-cniの重要な特徴は「PodのIPアドレスにEC2インスタンスのセカンダリIPを割り当てる」ということです(参考:セカンダリIPについて)。それではそれぞれの注意点を確認しましょう。
Podの起動可能数はEC2インスタンスタイプに制限される
EC2に割り当てられるセカンダリIP数はインスタンスタイプごとに異なります。Podに割り当てられるセカンダリIPが不足してしまうと、Podを起動することができないので注意が必要です。各インスタンスタイプのネットワークインターフェイスあたりのIPアドレス数は「Elastic Network Interface」を参考にしてください。例えば、m5.largeでは30個のIPを割り当てることができるので、primaryで利用する1個を除いた29個のIPをPodに割り当てることができます。
この制限については、EKSで利用するワーカーノードの起動スクリプトのこの部分で対策がされています。kubeletに--max-pods
オプションでワーカーノード上の最大起動Pod数を設定しています。この設定によりスケジューラは指定数以上のPodをワーカーノード上にスケジュールしなくなります。これでワーカーノード上にPodがスケジュールされたが、起動に失敗する事象は起きづらくなります。ただし、以下の状況で起きる場合があります。
- EC2へのENIのアタッチが失敗する
- EC2へのENIアタッチが失敗するケースがあるそうです。その場合
--max-pods
より少ないセカンダリIPしかPodのために用意することができません。
- EC2へのENIアタッチが失敗するケースがあるそうです。その場合
- セカンダリIPがcooling中で割り当てができない
- aws-cniではcooling modeを設けており、一度利用したIPをしばらく利用できないようにしています。
- 例えば
--max-pods
が30の場合に、30個フルでIPを使っているとします。この時に10個のPodが停止しても、しばらくの間利用できるIPは1個もありません。しかしKubernetesのスケジューラは--max-pods
の数にしたがって、Podをスケジュールしてしまうので、coolingが終わるまでPodが起動しません。
Podの起動可能数はSubnetやVPCに制限される
セカンダリIPアドレスはEC2が所属するVPCのSubnetから払い出されます。つまりあるSubnet上では、SbunetのCIDRレンジ分しかPodを起動できません。例えば10.7.0.0/24のサブネット上では予約されたIPを除いた251個のPodしか起動できません。
認証認可
RBACを使用する必要がある
KubernetesのRBAC機能は昔はありませんでした。EKSではRBACは必ず利用する必要があるので、利用していなかった場合は移行時に注意が必要です。
IAMを利用する必要がある
EKSのKubernetes APIを利用する場合は、aws-iam-authenticatorを利用して、IAMによる認証を行わないといけません。AWS IAMの知識がないと困る部分もあるかもしれません。
API Server endointはパブリック公開されている
EKSのKubernetes APIのエンドポイントはパブリック公開されています。上述の通り、IAMの認証により、保護されています。
マネージドならではの注意点
Kubernetesクラスタのカスタマイズができない
Kubernetesクラスタはマスターコンポーネントの起動時オプションによって様々なカスタマイズができます。しかし、マスターコンポーネントはAWSによって管理されているのでカスタマイズオプションが指定できません。そのため、例えば開発中の機能を利用できなかったり、細かい例をあげるとDockerコンテナのログローテート機能のon・offを選択できなかったりします。
オプションの例:kube-apiserver - Kubernetes
新しいバージョンが使えない
これは2018年のre:Inventで新しいバージョンへのインプレースアップデートが可能になると発表があったので2018/12/2現在の注意点です。
[レポート]Deep Dive on Amazon EKS #reinvent #CON361 | DevelopersIO