【レポート】Kubernetes on AWS(Amazon EKS実践入門) #AWSSummit

本日はAWS Summit Tokyo 2019に参加しています。 本エントリは「Kubernetes on AWS(Amazon EKS実践入門)」のセッションレポートになります。
2019.06.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、坂巻です。

2019/6/12(水)~14(金) の期間で開催されている、AWS Summit Tokyo 2019からセッションをレポートします。 本記事は「Kubernetes on AWS(Amazon EKS実践入門)」のレポートになります。

セッション情報

スピーカー:河野 信吾氏 (アマゾン ウェブ サービス ジャパン株式会社)

コンテナオーケストレーションツールとして人気のKubernetesですが、まだ利用に踏み出せていない方も多いのではないでしょうか?AWSではKubernetesの運用を支援するAmazon EKSを提供しています。本セッションではKubernetes初心者の方を対象に、Amazon EKSの概要や始め方、アプリケーションのデプロイを通じて具体的な利用イメージを持っていただきつつ、より効果的でAWSらしい設計手法をご理解いただきます。

レポート

agenda

  • コンテナ recap
  • Kubernetes
  • Amazon EKS
  • ユースケースとAWS連携
  • ラーニングパス
  • まとめ

コンテナ recap

コンテナとは

  • ソフトウェアをOS内の独立した環境で実行する技術
  • 代表的な実装:Docker
    • Build, share and run any application, anywhere
  • 依存関係をパッケージング
  • 特徴
    • ポータビリティ
    • いつでも作れていつでも捨てられる
    • コードで定義

Dockerコンテナの3つのフェーズ

  • Build
    • Buildはコンテナイメージを作ること
    • Dockerファイルでイメージを定義
    • 動作に依存するものを全て記述
    • docker build ..
  • Share
    • イメージレジストリにコンテナイメージを格納
    • Public RegistryはDocker Hubなどがある
    • docker push ..
  • Run
    • Dockerエンジンが実行されているホストでコンテナを起動
    • docker run ..

コンテナのユースケース例

  • マイクロサービスのアプリケーション
  • ジョブ実行
  • CI/CDの実行
  • 機械学習

コンテナ実行(RUN)時の課題と要望

  • 1台のホストで全コンテナを動作せるのは簡単だがリソースに限界がある
  • 複数ホストでDcokerを実行するホストが増えてくると運用が大変
  • 耐障害性
    • コンテナホストが停止したらコンテナ全滅、機能停止
  • 運用制
    • コンテナはどのホストで動かす?リソースは空いてる?
    • 通信したいコンテナはどこにいる?IP?名前?
    • リソース制限などを一括でかけたい
  • スケール
    • 負荷に応じてスケールアウトしたい

Kubernetes

Kubernetesとは

  • オープンソースのコンテナオーケストレーションツール
  • Cloud Native Computing Foundationが開発プロジェクトをホスト
  • 通称k8s

Kubernetesが人気の理由

  • 成長を続けるユーザー数と活発なコミュニティ
  • "Runs Anyware" クラウドでもオンプレでも
  • 拡張可能なAPIとエコシステム
  • 自分でAPIを作成して拡張も可能

コンテナオーケストレーションツールのデファクトとも言われている

Kubernetesが提供する機能

  • ノードにコンテナを自動配置
  • 手動スケール/オートスケール
  • 自動ローリングアップデート/ロールバック
  • 失敗したコンテナの自動復旧
  • 通信相手を特定/ロードバランス
  • 機密情報や設定の管理
  • バッチ実行

コンテナにおける多くの課題を解決する機能を備えている

Kubernetesのインフラ構成

  • コントロールプレーン
    • オーケストレーション機能
    • 本番運用時は冗長化が必須
  • データプレーン
    • コンテナ実行部分

Kubernetesオブジェクト

  • Pod(ポッド)
    • デプロイの最小単位「ひとつ以上のコンテナ」から構成
    • Pod内コンテナはIPアドレス、ストレージ等を共有
  • Service
    • Podを名前解決により発見(サービスディスカバリ)
    • ロードバランス(L3/L4)
  • Deployment
    • Podを維持、コントロールするReplicaset(指定Podの数の維持)の管理

Kubernetesマニフェスト宣言的設定

  • マニフェスト
    • あるべき状態(なってほしい状態)をYAMLやJSONで記述
  • 照合ループ
    • それぞれが個別に動いた結果の宣言と状態の差分を解消

KubernetesとAWS

  • 多くのKubernetesユーザーがAWSでKubernetesを動かしている
  • これまではEC2で自前でKubernetesを構築していた

Kubernetes運用の悩み

  • コントロールプレーンの運用は"重労働"
    • コントロールの冗長化は必須
    • 運用中のバージョンアップは大変
    • 運用責任はお客様
  • ユーザーはもっとアプリケーションを実行する部分に集中したい

Amazon EKS

  • Kubernetesのコントロールプレーンマネージドで提供
  • Kubernetesのリリースを改変なく利用
  • CNCFによるKubernetes準拠の認定既存のエコシステムがそのまま動作
  • AWSサービスとのスムーズな連携
  • 東京リージョン含め、13リージョンで利用可能

Amazon EKSを使う理由

  • 堅牢なコントロールプレーンをマネージドで提供
    • ユーザーをコントロールプレーンの運用から開放
  • Kubernetesの運用を支援する機能
    • バージョンアップ、コントロールプレーンログの集約
  • AWSマネージドサービスとスムーズな連携が可能
  • 選択可能なデータプレーン(ノード)
    • ワークロードに合わせたインスタンスタイプやEC2 AMIを利用できる

Amazon EKSが提供する価値

"Undifferentiated Heavy Lifting"を削減し、ビジネス価値の創出に集中できる

Amazon EKS事/Snapchat

  • 性能問題でサービス拡大が困難
  • EKSを利用しコスト削減、性能が向上した

EKSをデプロイする方法

  • AWSマネジメントコンソール
  • AWS CLI
  • CloudFormation
  • OSS
    • eksctl
    • terraform

Amazon EKSの構築と利用の準備

  • EKS構築に必要な権限を割り当て(IAM)
  • 必要なコマンドをインストール
    • ekctl
    • kubectl
  • eksctlコマンドで作成実行
    • eksctl create cluster -f 設定ファイル

Kubernetesの世界へようこそ!

  • kubectlを使って,Kubernetes APIにアクセス

会場では、eksctlを利用してデプロイのデモがありました!!

ユースケースとAWS連携

HTTP/HTTPS対応のロードバランサーを使いたい

  • SSLオフロード、パスベースルーティング、複数ドメイン対応などをしたい
    • Ingressオブジェクトによるロードバランサ機能
  • ALB Ingress Controller
    • AWSのサービスチームがメンテナンスに参加
    • ALBを自動デプロイ設定
    • Route 53、ACM等その他、AWSマネージドサービスと連携

ログを集約したい

  • FluentdのDemonSetを利用して、ログを集約
    • https://github.com/fluent/fluentd-Kubernetes-daemonset
  • CloudWatch Container Insights(プレビュー)
    • コンテナログとメトリクスをCloudWatchに集約
    • 数個のマニフェストを適用するだけの、簡単なセットアップ
  • EKSコントロールプレーンのログもCloudWatch Logsに配信可能

オートスケールしたい

  • 2種類の水平オートスケール
    • Podレベル:水平オートスケーリング
    • ノードレベル:クラスタオートスケーリング
  • ノードレベルはAuto Scalingと連携
    • ノード(EC2)でPodのPendingを検知してスケール

デプロイを効率したい

Codeシリーズを利用して、パイプラインを構築

  1. CodeCommitへpush
  2. 変更を検知、パイプライン開始
  3. コンテナをBuild、Amazon ECRにpush
  4. Lambdaをトリガー
  5. Golang SDKを利用してDeploymentを更新
  6. コンテナイメージを取得
Amazon ECR
  • スケーラブルなフルマネージドイメージレジストリ
  • セキュア(IAM連携、クロスアカウントアクセス、イメージの暗号化)
  • ライフサイクルポリシーによるイメージのクリーンアップ

堅牢なデータストアを使いたい

  • Amazon RDS(Aurora)、DynamoDB、ElastiCacheなど
    • 冗長構成による可用性向上
    • リードレプリカによる負荷分散
    • 自動バックアップによるデータ保全
    • 多彩なデータベースエンジンを選択可能

マネージドサービスの利用を推奨

ラーニングパス

  • コンテナ入門 -> 本セッション -> Blackbelt Online セミナー/EKS Workshop(ハンズオン) -> 実際の開発
  • GitHubでコンテナ関連のワークロードのロードマップを公開している

まとめ

  • AWSはKubernetesのプラットフォームとして豊富な実績をもっており、多くのユーザーが利用している
  • EKSはマネージドコントロールプレーン、AWSマネージドサービスとの連携を提供

感想

Kubernetes on AWSの特徴を理解することができました。提示のあったラーニングパスを使用してキャッチアップしていきたいと思います。