Amazon Elastic Kubernetes Service (EKS) の利用方法(2/3)

Amazon EKS とは
--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/68e963ac-056f-85c1-b7ce-40a9b05b1c4e.png)
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html
__EKS（Amazon Elastic Kubernetes Service）は、Amazon Web Services（AWS）が提供する、マネージドKubernetesサービスです。__

Kubernetesは、コンテナーオーケストレーションツールとして広く使用されており、アプリケーションのデプロイやスケーリング、管理を簡素化することができます。しかし、Kubernetes自体を管理することは、一定の技術力が必要であり、リソースの調整やアップグレードなど、運用には多くの作業が必要となります。

EKSでは、KubernetesのコントロールプレーンをAWSが管理し、ユーザーはワーカーノードを自分で作成、管理します。そのため、Kubernetesに慣れていない人でも、AWSが提供するマネージドサービスとして簡単に利用することができます。また、EKSはAWSの機能であるAuto Scaling、Elastic Load Balancing、Identity and Access Management (IAM)、Virtual Private Cloud (VPC) などと連携し、セキュアな環境でのKubernetesクラスターを構築することができます。

__EKSの主な利点__
◇AWSのマネージドサービスなので、Kubernetesのコントロールプレーンを自分で管理する必要がない。
◇Kubernetesに必要なリソース（VPC、ELB、Auto Scalingなど）が自動的に作成されるので、簡単にクラスターを構築できる。
◇AWSのセキュリティ機能と統合されているので、セキュアなKubernetesクラスターを構築できる。
◇AWSの機能（CloudWatch、CloudTrail、X-Rayなど）と統合されているので、アプリケーションの監視やトラブルシューティングが容易になる。

Kubernetesにおいて、アプリケーションの実行に関するリソースは、
__ワークロード、サービス、設定、ストレージ__ に分類されます。

今回説明する内容
1.ワークロード
2.サービス
3.設定
4.ストレージ
5.ネットワーク
6.リソース作成、確認、削除
7.Pod作成

1.ワークロード
--
Kubernetesのワークロードとは、アプリケーションを実行するためのオブジェクトで、Pod、ReplicaSet、Deployment、StatefulSet、DaemonSetなどが含まれます。これらのオブジェクトは、コンテナを実行するために必要なリソースを定義します。

ワークロードに含まれる主要なオブジェクトについて説明します。

◇Pod
一つのPodには、複数のコンテナを入れる事が出来ます。
Kubernetesでアプリケーションを実行する最小単位であり、1つ以上のコンテナを含むことができます。Podは、同じノード上に共存する複数のコンテナをまとめてデプロイすることができます。また、複数のPodをまとめて管理するためのReplicaSetやDeploymentの単位として使用されます。

◇ReplicaSet
ReplicaSetは、複数のPodのレプリカ数を管理するためのオブジェクトで、必要なレプリカ数を指定することで、Podの数を自動的に調整することができます。Podをスケールする。ReplicaSetは、Podをまとめて管理するための仕組みであり、Podの起動や停止などを自動的に行うために使用されます。

◇Deployment
順次デプロイするのか、一括でデプロイするのか？
Deploymentは、複数のPodを管理するためのオブジェクトで、Podのローリングアップデートやロールバックなどを行うための仕組みを提供します。Deploymentは、ReplicaSetをラップしており、ReplicaSetを指定することで、Podの数を自動的に管理することができます。

◇StatefulSet
StatefulSetは、状態を持つアプリケーションをデプロイするためのオブジェクトで、一連のPodに一意の識別子を付与し、永続的なネットワークIDを提供します。StatefulSetは、Podの順序付けや、永続ボリュームのマウントなどを行うことができます。

◇DaemonSet
DaemonSetは、各ノード上に1つのPodをデプロイするためのオブジェクトで、各ノードで常に実行されるアプリケーションを管理するために使用されます。DaemonSetは、ログ収集エージェント、ノード監視エージェントなど、ノードレベルで必要なサービスを実行するために使用されます。


2.サービス
--
Kubernetesのサービスは、一連のPodに対して一意なDNS名とIPアドレスを提供するオブジェクトで、一般的には外部からのアクセスを可能にします。Serviceは、Podが動的に作成・削除される環境でも、一貫したアクセス先を提供することができます。Serviceのタイプには、ClusterIP、NodePort、LoadBalancer、ExternalNameがあります。

◇ClusterIP
ClusterIPは、Kubernetesクラスタ内でのみアクセス可能な仮想IPアドレスを提供するServiceタイプです。このタイプのServiceは、PodのIPアドレスの後ろに隠れて、バックエンドPodにアクセスするために使用されます。このタイプのServiceは、Kubernetes内部の通信に適しています。

◇NodePort
NodePortは、Kubernetesクラスタ外からアクセス可能なServiceを提供するために使用されるServiceタイプです。このタイプのServiceは、クラスタ内の各ノードに割り当てられたポートを介してアクセスできます。このタイプのServiceは、開発/テスト環境でのデバッグやデモ目的などで使用されます。

◇LoadBalancer
LoadBalancerは、外部リソースを介してクラスタ外からアクセス可能なServiceを提供するために使用されるServiceタイプです。このタイプのServiceは、クラウドプロバイダによって提供される負荷分散器を介してトラフィックをバックエンドPodにルーティングします。このタイプのServiceは、本番環境で使用されます。

◇ExternalName
ExternalNameは、Kubernetesクラスタ内のServiceを外部のDNS名にマップするために使用されるServiceタイプです。このタイプのServiceは、外部のサービスにアクセスするために使用されます。例えば、RDSのエンドポイントをDNS名にマップするために使用されます。


3.設定
--
Kubernetesの設定は、アプリケーションの設定情報を格納するオブジェクトで、ConfigMap、Secretが含まれます。ConfigMapは、アプリケーションの設定情報をKey-Valueの形式で格納するオブジェクトで、Secretは、機密情報を暗号化して格納するオブジェクトです。

◇ConfigMap
ConfigMapは、Kubernetesクラスタ内のアプリケーションの設定情報を格納するためのオブジェクトです。ConfigMapは、Key-Valueの形式で設定情報を格納します。アプリケーションは、ConfigMapを参照して、設定情報を取得することができます。ConfigMapは、コンテナイメージにビルドする前に設定情報を変更することができるため、開発環境と本番環境の設定情報を分離することができます。また、ConfigMapを使用することで、設定情報の変更をKubernetes上で一元的に管理できるため、設定の変更がアプリケーションに反映されるまでの時間を短縮することができます。

◇Secret
Secretは、機密情報（例：パスワード、認証トークンなど）を暗号化して格納するためのオブジェクトです。Secretは、ConfigMapと同じようにKey-Valueの形式で機密情報を格納します。アプリケーションは、Secretを参照して、機密情報を取得することができます。Secretは、ConfigMapと同様に、コンテナイメージにビルドする前に機密情報を変更することができます。また、Secretを使用することで、機密情報を暗号化してKubernetes上で安全に管理することができます。

4.ストレージ
--
Kubernetesのストレージは、コンテナの永続化に使用されるオブジェクトです。ストレージは、データを保持するために必要な永続化された領域を提供します。ストレージは、永続ボリューム（Persistent Volume、PV）と永続ボリュームクレーム（Persistent Volume Claim、PVC）の2つのオブジェクトで構成されます。さらに、StorageClassオブジェクトを使用することで、動的な永続ボリュームの作成を簡素化することができます。

◇PersistentVolume
PersistentVolume（PV）は、永続化ストレージの抽象化を提供するオブジェクトです。PVは、ノードに物理的に接続されたストレージリソースを表現します。PVは、ストレージプロバイダによって提供されたストレージリソース（例：ローカルディスク、ネットワークストレージ、クラウドストレージなど）に対して、アクセスポリシーやストレージ容量などの機能を提供します。PVは、クラスタ全体で共有され、PVCによって利用されます。

◇PersistentVolumeClaim
PersistentVolumeClaim（PVC）は、永続化ストレージの要求を定義するオブジェクトです。PVCは、アプリケーションが必要とするストレージ容量やアクセス方法などの要件を定義します。PVCは、アプリケーションにとって必要なストレージリソースを割り当てるために、PVとマッピングされます。

◇StorageClass
StorageClassは、動的にPVを作成するためのクラスを定義するオブジェクトです。StorageClassは、ストレージプロバイダによって提供されるストレージクラスを定義し、PVCからの要求に基づいてPVを動的に作成します。StorageClassを使用することで、アプリケーション開発者は、ストレージの作成と削除を自動化することができます。

これらのオブジェクトを使用することで、Kubernetes上でアプリケーションの永続化ストレージを管理することができます。PVは、ストレージリソースの抽象化を提供し、PVCはアプリケーションが必要とするストレージの要件を定義します。また、StorageClassを使用することで、動的にPVを作成し、ストレージの管理を自動化することができます。


5.ネットワーク
--
「クラスタネットワーク」と「外部ネットワーク」があります。Kubernetes内は「クラスタネットワーク」と呼ばれる「外部ネットワーク」とは異なるネットワークが構築されるので、単純に「クラスタネットワーク」内のPodへアクセスすることはできません。

Kubernetesのクラスタ内では、各ノードに割り当てられたIPアドレスに基づいて、クラスタネットワークが構築されます。このネットワークは、各ノード上で実行されるPod間の通信に使用されます。一方、外部ネットワークは、Kubernetesクラスタの外部にあるネットワークで、一般的にはインターネットを指します。

クラスタネットワークは、クラスタ内のPod間の通信に最適化されていますが、外部からのアクセスは制限されています。これは、クラスタネットワークには、クラスタ内のノードやPodにのみ割り当てられるプライベートIPアドレスが使用されるためです。外部からのアクセスを可能にするには、Kubernetesのサービスを使用して、クラスタネットワーク上のPodに公開する必要があります。



6.リソース作成、確認、削除
=
Kubernetesでは、マニフェストファイルを使用してリソースを作成します。
マニフェストファイルは、YAML形式またはJSON形式で記述され、Kubernetesオブジェクトの設定情報を含みます。

__Deploymentオブジェクトを作成するためのYAML形式のマニフェストファイルの例__

~~~
apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: example-container
        image: nginx:latest
        ports:
        - containerPort: 80
~~~
このマニフェストファイルでは、Deploymentオブジェクトを作成し、nginx:latestイメージを使用して3つのレプリカを持つPodを作成するように指定しています。

__リソース作成__
マニフェストファイルを使用して、kubectlコマンドを使用してリソースを作成することができます。上記のマニフェストファイルを使用してDeploymentオブジェクトを作成するためのkubectlコマンドの例です。

~~~
kubectl apply -f example-deployment.yaml
~~~
このコマンドは、example-deployment.yamlファイルで指定されたDeploymentオブジェクトを作成します。

__リソース確認__
作成されたリソースを確認するには、kubectlコマンドを使用します。
作成されたDeploymentオブジェクトを確認するためのkubectlコマンドの例です。
~~~
kubectl get deployments
~~~
このコマンドは、作成されたDeploymentオブジェクトの一覧を表示します。

__リソース削除__
作成されたリソースを削除するには、kubectlコマンドを使用します。
作成されたDeploymentオブジェクトを削除するためのkubectlコマンドの例です。
~~~
kubectl delete deployment example-deployment
~~~
このコマンドは、example-deploymentという名前のDeploymentオブジェクトを削除します。


7.Pod作成
=
ホストにフォルダを作成し、そのフォルダをマウントしたPodを作成するための手順です。

ホストにフォルダを作成する
例えば、/home/user/testdataという名前のフォルダを作成する場合、
次のようにターミナルでコマンドを実行します。
~~~
mkdir /home/user/testdata
~~~

__Podマニフェストファイルを作成する__
Podマニフェストファイルを作成し、ホストのフォルダをマウントするように指定します。
testdataという名前のフォルダを/mnt/testdataというパスにマウントするPodマニフェストファイルの例です。
~~~
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: nginx:latest
    volumeMounts:
    - name: testdata
      mountPath: /mnt/testdata
  volumes:
  - name: testdata
    hostPath:
      path: /home/user/testdata
      type: Directory
~~~
このマニフェストファイルでは、nginx:latestイメージを使用してPodを作成し、
testdataという名前のフォルダを/mnt/testdataにマウントするように指定しています。

__リソース作成__
kubectlコマンドを使用して、作成したPodを作成します。
上記のマニフェストファイルを使用してPodを作成するためのkubectlコマンドの例です。
~~~
kubectl apply -f example-pod.yaml
~~~
このコマンドは、example-pod.yamlファイルで指定されたPodを作成します。

このように、ホストにフォルダを作成し、そのフォルダをマウントしたPodを作成することができます。

Amazon Elastic Kubernetes Service (EKS) の利用方法(1/3)
https://qiita.com/kimuni-i/items/656ca4d314a8982e70cb

Amazon Elastic Kubernetes Service (EKS) の利用方法(2/3)
https://qiita.com/kimuni-i/items/06c70de226cf074d8b23

Amazon Elastic Kubernetes Service (EKS) の利用方法(3/3)
https://qiita.com/kimuni-i/items/b2b3d07c2c76c95884a1