LoginSignup
51
50

More than 3 years have passed since last update.

Amazon EKS

Last updated at Posted at 2018-12-13

1.Kubernetes(k8s)って

1-1 Kubernetes(k8s)とは

Dockerなど本番環境で実際に動かそうとすると、問題となる箇所があります。

  • 複数のサーバホスト上で、リソースを確保して動かすにはどうしたらいいか。
  • ダウンタイムなくデプロイするにはどうしたらいいか。
  • 負荷に応じてスケールアウト、インするにはどうしたらいいか。

そんな問題を解決するために提供されたのが、Kubernetesであり、
自動デプロイ、スケーリング、アプリ・コンテナの運用自動化のために設計されたオープンソースのプラットフォームです。

Kubernetesはこんなことができるオーケストレーションです。

機能 説明
ホスト管理 ホストで問題があった場合にホスト上で動作させない。
既に動作していたコンテナは、他のホストに移動させて動作させることができます。
スケジューリング コンテナを実行する時に、リソース状況を見て、対象のホストを決めたり、タグを使って制御したりすることができます。
コンテナの死活監視、オートリカバリ 指定したコンテナ数を維持するために死活監視をしたり、問題がある場合は再起動を実施します。
サービスディスカバリ、ロードバランシング 複数のコンテナに分散したり、コンテナ側で通信して処理を実行する。
シークレットやアプリケーション設定の管理 複数の環境で動作させる時にも、コンテナ側の設定を共通化し、パラメータによって制御可能です。
バッチ実行 指定した時間に実行する。
エコシステムとの連携 他社エコシステムとの連携

Kubernetesは他のオーケストレーターとここが違う!

  • さまざまなOSSと組み合わせることにより、柔軟に機能拡張が可能。
  • 本格的な宣言的オペレーションとinfrastructure as codeを実現可能。
  • クラスター上にデプロイするシステムの構成をコードによって定義。

自前でKubernetesを構築しようとすると、各種コンポーネントの設定やメンテナンスが大変です。
そこで、マネージドサービスとして、提供されたのが、Amazon EKS です。

1-2 おおまかな全体像

image.png

  • API Server経由で、etcdの操作を行い、etcdの状態に応じてアクションをする仕組みとなっている。
  • API Server経由で、etcdの操作を行い、etcdの状態に一致するようにk8sが変更される。
  • マネージドサービスの場合、 Kubectlとコンテナのことだけを考えれば良い。
コンポーネント
Master k8sを管理するコンポーネントが配置されりサーバ群
node コンテナが配置されるサーバ群
etcd cluster 高信頼性KVS k8sのデータが保存される
Master
API Server etcdへのwrite,readを行うAPIサーバ
複数台配置して冗長化構成をとることができる
Controller Manager デプロイするコンテナの個数等を管理する
複数台配置できるがリーダは1つだけ
Scheduler コンテナをどのNodeにデプロイするか決める
複数台配置できるがリーダは1つだけ
Node
Container runtime コンテナのランタイム
Docker以外を使用することもできる。
Kubelet Node上に配置されるエージェント
コンテナな起動停止を行う。
Kube-proxy コンテナとの接続を保証するためにNodeのNWを管理する
Kubectl
Kubectl ユーザがk8sを操作する際に使う

1-3 基本的な構成要素

image.png

Workload
Pod(po) コンテナデプロイの最小単位
ReplicaSet(rs) デプロイしたPod数を維持するリソース
Deployment(deploy) RollingUpdteするためのReplicaSetを管理するリソース
DaemonSet(ds) 書くNodeに1個ずつPodをデプロイするリソース
StatefulSet(sts) Statefulなコンテナのデプロイの対応したリソース
Job Job用のコンテナをデプロイするリソース
CronJob Jobをcron実行するリソース

Pod

  • コンテナデプロイの最小単位のことです。
  • 1個のPodに複数のコンテナを定義できる。
  • 定義された複数のコンテナは必ず同一のNodeのデプロイされる。
  • 複数のコンテナは同一のIPアドレスを共有する。

image.pngimage.pngimage.png
例えば、複数のコンテナ(コンテナAとコンテナB)があり、このPodをデプロイすると、Pod単位にNICが1個あることとなる。

ReplicaSet

  • デプロイしたPod数を維持するリソースです。
  • Podに付与されているlabelを意識してReplicaSetが制御する。
  • 1個のPodにLabelを複数付与できるので、目的の違うPodのLabelの組み合わせが被らないように設計する。

image.png
image.png
image.pngimage.png
Podが死んだ場合でもReplicaSetが3になるように維持してくれる。

Deployment

  • RollingUpdateするためにReplicaSetを管理するリソースです。
  • RollingUpdate はシステムがダウンしないように少しずつアップデートをする手段です。

例えば、imageを “1.7.9”->“1.12” に変更してデプロイすると、ReplicaSetも新しく作成され、Podも新しく作成される。

Configuration
Configmap 設定情報をkey-valueの形式で保持するリソース
Secret 機密情報を保持するリソース

Configmap

  • 設定情報をkey-valueの形式で保持するリソースです。
  • 作り方:Manifestを書く。ファイルから作る (–frome-file)。
  • 使い方:環境変数とする。Volumeとしてマウントする。

Secret

  • 機密情報を保持するリソースであり、Secret Typesについては、↓のページで詳しく。
    https://docs.koki.io/short/resources/secret/

  • Secret ”Type:Opaque”について

    • Key-valueで機密情報を保持する
    • 利用する目的:ID,Password等を格納する
    • Configmapとは別の場所で管理する
Service
ClusterIP クラスタ内のアクセスを保証する
NodePort クラスタ外からクラスタのPortを指定してアクセスする
LoadBalancer 外部のIPアドレスを使⽤してアクセスする
Headless ホスト名で⽤いてクラスタ内でアクセスする
ExternalName 外部のDNSを使⽤するときに使う

ClusterIP

  • クラスタ内のアクセスを保証します。
  • サービス名で名前解決をし、クラスタ内のPodへアクセスする。

image.pngimage.pngimage.pngimage.pngimage.png
例えば、WEBサーバがあり、DBサーバにアクセスするときにDNS名で名前解決するのと同じイメージ。

NodePort

  • クラスタ外からクラスタのPortを指定してアクセスする。

image.pngimage.pngimage.png
例えば、PORT 8080は31076に流すようなイメージになる。

Namespace
Namespace 1つのクラスタの中を仮想のクラスタで分けることができる

Namespace

  • 検証、開発環境で1つのクラスタの中で分ける
  • 開発チーム単位で分ける

1-4 kubectlによるユーザーのオペレーション

基本は、Manifestを作成してk8sを操作する

コマンド
kubectl apply リソースの作成
kubectl delete リソースの削除
kubectl get リソースの情報を取得
kubectl describe リソースの詳細情報を取得
kubectl logs コンテナのログを確認
kubectl exec コンテナでコマンドを実⾏

2.Amazon EKSのTenets

Tenet 説明
1 EKSはエンタープライズ企業が本番のワークロードを実行するためのプラットフォームであること。
信頼性、可視性、スケーラビリティ、管理の容易さ
2 EKSはネイティブで最新のKubernetesの体験を提供すること現状でKubernetesで実現できることと同じことができる
3 EKSユーザが他のAWSサービスを使うときには、シームレスな連携を実現し不要な作業を取り除くこと
4 EKSチームは積極的にKubernetesプロジェクトに貢献していくこと

3.Amazon EKSの仕組み

名称 説明
コントロールプレーン KubernetesでいうMasterに当たる部分。
ここが、フルマネージドとなり、管理する必要がない部分。
ワーカーノード Kubernetesでいうnodeの部分。

スクリーンショット 2018-12-01 19.11.30.png

4.Clusterの認証

Heptio Authenticator を利用することで、AWSのIAM と KubernetesのRBACシステム を連携して認証を行う。

 *Heptio Authenticator ついては詳しくないので↓を参考に
 heptio-authenticator-awsの使い方

なので、IAMだけ認証できても、RBACシステムに登録されていないユーザーはクラスタにアクセスできません。

ちなみに、そんなときは以下の項目を確認してトラブルシュートを行います。
・IAMユーザを利用してクラスタを作成しているか。
・heptio-Authenticator-awsが正しくインストールされているか。
・RBACにユーザーが追加されているか。
極基本的な部分ですね。

5.設定

■リソース
Podの定義で実際に利用するCPU、Memoryのrequests(要求する最小リソース)とlimits(コンテナが利用できる最大リソース)を設定する。
実際に運用する上で指定がないと、意図せずリソースを消費してノードが応答しなくなることがあるので、必ず設定しましょう。

・CPUの制限は、1AWS vCPUごとに100m~1000m(0.1~1)
・Memoryの制限は、メモリサイズに合わせて、MiやGiで指定する。

namespace:kube-system → kubernetesに必要なコンポーネントが動いているため、こちらが消費しているリソース分も含めて計算する。

ところで、Podって?
Podとは、Kubernetesでコンテナを管理するための最小単位です。
コンテナを単独で管理するのではなく、グループとして管理することで、コンテナの使いにくさを解消することができます。

■ヘルスチェック
・Liveness Prode:ヘルスチェックに失敗すると、Podの再起動が行われます。チェックに成功するまでRunningになりません。
・Rediness Prode:ヘルスチェックに失敗すると、Running状態でもLoad Balancerの振り分け対象から外れ、ユーザからのアクセスを受け付けない状態となります。

成功か失敗かは何で決めるの?
・exec:設定したコードで判定する。
・httpGet:httpでリクエストして、ステータスコードで判定する。
・tcpSocket:tcpコネクションが確立できるかで判定する。
と、それぞれの環境に合わせて設定する。

■スケジューリング

名称 説明
demonset 必ずnodeには、特定の1つのPodを配置する
nodeSelector 指定したLabelのnodeにPodを配置する
taint/tolerations 指定したkey=value:effectに一致しないPodは配置しない
nodeAffinity nodeにLabelにある条件を指定し一致したPodを配置する

・Kubectl describe node node名 → 現在のLabelを確認することができます。
・Kubectl label nodes node名 key=value → key=valueを追加することが可能です。
・spec.affinity.node.Affinity 設定(matchExpressions) を書き、条件に一致(In,Exists)不一致(NOde,DoesNotExists)により、Podを起動するノードを制御することが可能です。

■オートスケーリング
ワーカーノードとPodの2つ視点から検討する必要があり、マニフェストに指定する「targetAnerageUtilization」にCPU使用率が近づくようにスケールする。
・Cluster Autoscaler:ワーカーノードのオートスケーリング
・Horizontal Pod AutoScaler:Podのオートスケーリング

6.トラブルシュート

何かあったらログをみろ。

・Podのログ
 Kubectl logs pod名 のコマンドで確認
 
・Kuberbetesのログ
 kubectl describe pod Pod名 のコマンドで確認
 kubectl describe node Node名 のコマンドで確認

・Kubelet のログ
 journalctl -u kubelet のSSHで確認

7.料金

課金されないように停止したい!
→現状では、クラスターを削除して、不要になったら作成するしかなさそう。

Amazon EKS ワーカーノードは標準の Amazon EC2 インスタンスであり、通常の Amazon EC2 オンデマンドインスタンス価格に基づいて請求されます。

8.暗号化

[Mar 1, 2021]今まで新規クラスターへのKMS暗号化には対応していましたが、既存クラスターの機密情報も KMS キーを利用して暗号化できるようになったようです。

9.クラスターの起動時間

[Mar 19, 2021]新しいクラスターの作成時間が 40% 短縮され、平均 9 分以内で EKS クラスターを作成できるようになったようです。

51
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
50