EKSでdocker非推奨問題に対応しました

![eyecatch_2202EKSProject_Dockersupport-fs8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/004e1f79-a60a-a6e4-09c1-22a93a582cad.png)

※ 本稿は [Tech Inside Drecom](https://tech.drecom.co.jp/?_src=qiita) に掲載された記事、「[EKSでdocker非推奨問題に対応しました](https://tech.drecom.co.jp/eks-deprecates-docker/?_src=qiita)」の Qiita 出張版です。

---

こんにちは！enzaのインフラ周りの仕事をしているmendと申します！ 以前に [k8s 1.20のDocker非推奨問題でEKSを使用しているプロジェクトが対応すること](https://tech.drecom.co.jp/k8s-1_20-problem-for-eks-with-docker/)として、k8s 1.20からのdocker非推奨問題と対応案ついてまとめました。 今回の記事では先の記事でまとめた案の一つであるAWSで対応したAMIがリリースされましたので、実際に<b>EKS 1.21にアップグレードするときに行ったこと</b>と、<b>アップグレード時に気を付けるべきこと<b>をまとめたいと思います。

# EKS 1.21の新機能

2021年 7月27日にAWSの公式から[Amazon EKS が Kubernetes 1.21 のサポートを開始](https://aws.amazon.com/jp/blogs/news/amazon-eks-1-21-released/)という発表がありました。
このEKS 1.21からコンテナランタイムにcontainerdを使用することが正式にサポートようになり、1.20からDockerのコンテナランタイムが非推奨になっていた問題に対応した形になります。
その他にもCronJob の改善やGraceful Node Shutdownなどの変更も入っていますので、詳しくは上記のリンクを確認してください。 なおこれから紹介するcontainerdをコンテナランタイムに指定する設定を行わない場合、<b>EKS 1.21のデフォルト設定ではコンテナランタイムにDockerが設定されているのでご注意ください</b>。

## ちなみに

ちなみにではありますが、これまで<b>リリースされていたEKS 1.16から1.20までのEKS最適化AMIの最新版でcontainerdがサポートされました</b>。これにより、EKS 1.21まで更新してからcontainerdにした場合のアプリケーションの動作を確認するといったことは不要です。ありがたいですね！

# EKS 1.21にアップグレードする

EKS 1.21にアップグレードするにあたり、ほとんどの部分は大きく変わりませんでした。
これまでと違うのはコンテナランタイムを変更する作業がある点です。
といってもEKS 1.21でコンテナランタイムをcontainerdにする方法はそこまで難しくはありません。
起動設定の中で設定しているユーザーデータを書き換えるだけになります。
ワーカーのAMIを変更する際に一緒にやってしまいましょう。 こちらがセルフマネージドノードでEKSクラスターに参加させているワーカーノード起動時のユーザーデータの例です。

```
#!/bin/bash
set -o xtrace
/etc/eks/bootstrap.sh $CLUSTER_NAME \
--b64-cluster-ca $B64_CLUSTER_CA \
--apiserver-endpoint $API_SERVER_URL
```

このなかで `/etc/eks/bootstrap.sh` にクラスター名とその他引数を渡して起動しますが、この引数でコンテナランタイムにcontainerdを指定することで設定が可能です。 例としては以下のようになります。

```
#!/bin/bash
set -o xtrace
/etc/eks/bootstrap.sh $CLUSTER_NAME \
--b64-cluster-ca $B64_CLUSTER_CA \
--apiserver-endpoint $API_SERVER_URL \
--container-runtime containerd # コンテナランタイムにcontainerdを指定
```

この他にもeksctlでマネージドノードグループでもcontainerdを使用することができます。
詳細は[containerd ランタイムブートストラップフラグを有効にする](https://docs.aws.amazon.com/ja_jp/ja_jp/eks/latest/userguide/eks-optimized-ami.html#containerd-bootstrap)を参照してください。 ちなみにEKS 1.21まではこのように明示的に`--container-runtime containerd` を指定する必要があるのですが、EKS 1.22からはデフォルトでcontainerdになるようです。 前の記事 [k8s 1.20のDocker非推奨問題でEKSを使用しているプロジェクトが対応すること](https://tech.drecom.co.jp/k8s-1_20-problem-for-eks-with-docker/) で記載した図の再掲になりますが、containerdに移行した場合は以下の図のようにコンテナを動かす仕組みが変更されます。 

![k8s_CRI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/492c3e1c-1f12-c205-862b-8a429d9d9d45.png)

# containerdにするときに気を付けること

コンテナランタイムをcontainerdに変更する際に、Podを動かすといった点でみれば大きな変更はありません。しかしdockerを使わなくなることから主にログの設定を変更する必要があります。

## ワーカーのdockerのログ設定

EKSクラスターでログが欠損しないようにするために、ロギングドライバーの設定を変更していた場合は注意が必要です。
具体的には`/etc/eks/bootstrap.sh`に`--docker-config-json`を設定している場合になります。
この場合、dockerを使えなくなることから`--docker-config-json`で行っていた設定ができなくなりますのでご注意ください。

## ログの設定変更

Dockerの仕様により、ログ1行のサイズが16384バイトを超えてしまうと分割され、1件のログが複数行に分かれてしまう挙動があります。
そのためfluentbitでは`Docker_Mode`、fluentdでは`fluent-plugin-concat`を使うといった対策をしていたと思われます。この場合もcontainerdになることから設定の変更が必要になりますので
fluentbitでは[fluentbit-containerd-cri-o-json-log](https://github.com/microsoft/fluentbit-containerd-cri-o-json-log)を、fluentdでは[fluent-plugin-concat](https://github.com/fluent-plugins-nursery/fluent-plugin-concat)を参考にそれぞれで設定の変更を忘れずに行いましょう。

# まとめ

今回はEKS 1.21でdocker非推奨問題に対する対応の方法と注意点をまとめました。
dockerが非推奨だ！やばい！うおおお！と騒いでいたころが懐かしく感じます。
実際に移行してみるとそこまで大きな対応箇所はなく、対応する箇所も基本的にログ周りだけとなっており、非常に少なくて助かります。
実際にcontainerdに移行する際にはぜひ参考にしてみてください！

---

Tech Inside Drecom の最新の情報は Facebook や Twitter からお届けしています、フォローよろしくおねがいします！

Twitter: [@DRECOM_TECH](https://twitter.com/DRECOM_TECH)
Facebook: [tech.inside.drecom](https://www.facebook.com/tech.inside.drecom)
※ その他の Tech Inside Drecom の記事は、[コチラ](https://tech.drecom.co.jp/?_src=qiita)からお探しいただけます！