LoginSignup
4
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-03-19

Amazon EKS とは

image.png
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html

EKS(Elastic Kubernetes Service)は、Amazon Web Services(AWS)が提供する、マネージドKubernetesサービスの1つです。EKSは、Kubernetesのコントロールプレーンを自動的にデプロイして管理することで、クラスターの構成、スケーリング、アップグレード、パッチ適用などのタスクを簡素化し、開発者やシステム管理者がKubernetesをより簡単に利用できるようにします。

EKSは、KubernetesのワーカーノードをAWS上で実行するために必要なリソース(EC2インスタンス、ネットワーク、セキュリティグループ、ロードバランサーなど)を自動的にプロビジョニングすることができます。EKSクラスターを作成するには、AWS Management Console、AWS CLI、またはAWS SDKを使用できます。

EKSは、多くのAWSサービスと統合されており、例えばAmazon EC2、Amazon EBS、Amazon VPC、AWS IAM、Amazon CloudWatchなどのリソースとシームレスに連携して利用できます。また、EKSはオープンソースのKubernetesと互換性があり、既存のKubernetesアプリケーションやツールをEKS上で動作させることができます。

今回取り上げる内容
1.ReplicaSet作成
2.Deployment作成
3.Service作成
4.ConfigMap作成
5.Secret作成
6.永続データ作成
7.StatefulSetの作成
8.Ingressの作成

追加説明
◆Podに入ってコマンド実行
kubectl exec
kubectl run
kubectl attach
◆Pod⇔ホスト間のファイル転送
kubectl cp
◆ログ確認
kubectl describe
kubectl logs

1.ReplicaSet作成

  1. ReplicaSetマニフェストファイル作成
  2. リソース作成
  3. 手動スケールアウト

ReplicaSetを作成し、手動でスケールアウトする手順です。

1.ReplicaSetマニフェストファイルを作成する
nginx:latestイメージを使用してReplicaSetを作成するための例です。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: example-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: example-container
        image: nginx:latest

このマニフェストファイルでは、3つのレプリカを持つReplicaSetを作成し、
nginx:latestイメージを使用してコンテナを実行します。

2.リソース作成
kubectlコマンドを使用して、ReplicaSetを作成します。
上記のマニフェストファイルを使用してReplicaSetを作成するためのkubectlコマンドの例です。

kubectl apply -f example-replicaset.yaml

このコマンドは、example-replicaset.yamlファイルで指定されたReplicaSetを作成します。

3.手動スケールアウト
ReplicaSetを手動でスケールアウトするには、kubectlコマンドを使用します。
ReplicaSetを5つのレプリカにスケールアウトするためのkubectlコマンドの例です。

kubectl scale replicaset example-replicaset --replicas=5

このコマンドは、example-replicasetという名前のReplicaSetを5つのレプリカにスケールアウトします。

このように、ReplicaSetを作成し、手動でスケールアウトすることができます。

2.Deployment作成

  1. Deploymentマニフェストファイル作成
  2. リソース作成
  3. ロールアウト履歴確認
  4. Deployment修正
  5. ロールアウト履歴確認
  6. ロールバック

1.Deploymentマニフェストファイル作成
Deploymentは、Podを管理するリソースの一つであり、複数のPodを作成してスケーリングすることができます。
例としてnginxイメージを使用したDeploymentマニフェストファイルの例です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

2.リソース作成
作成したDeploymentマニフェストファイルをkubectlコマンドを使用してクラスタに適用します。

$ kubectl apply -f nginx-deployment.yaml

3.ロールアウト履歴確認
Deploymentを作成すると、自動的にロールアウトが開始されます。
ロールアウトの進捗状況を確認するには、以下のようにkubectlコマンドを使用します。

$ kubectl rollout status deployment/nginx-deployment

4.Deployment修正
Deploymentを修正する場合は、マニフェストファイルを更新します。
例えば、replicasを5に変更する場合は、次のようにします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 5
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

5.ロールアウト履歴確認
Deploymentを修正した場合、自動的にロールアウトが開始されます。
ロールアウトの進捗状況を確認するには、次のようにkubectlコマンドを使用します。

$ kubectl rollout status deployment/nginx-deployment

6.ロールバック
Deploymentの修正がうまくいかなかった場合、以前のバージョンにロールバックすることができます。
次のようにkubectlコマンドを使用します。

$ kubectl rollout undo deployment/nginx-deployment

ロールバックする際に、特定のリビジョンに戻したい場合は、
次のように--to-revisionオプションを使用します。

$ kubectl rollout undo deployment/nginx-deployment --to-revision=2

3.Service作成

  1. NodePortのServiceマニフェストファイル作成
  2. リソース作成
  3. ブラウザからアクセスして動作確認

Kubernetes上でNodePortタイプのServiceを作成する手順を説明します。

1.NodePortのServiceマニフェストファイル作成
ポート番号が30000であるServiceを定義する例です。

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  type: NodePort
  selector:
    app: example-app
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30000

このマニフェストファイルでは、Serviceの種類をNodePortに指定し、selectorによってServiceが関連付けられるPodを指定しています。portsでServiceが使用するポートを指定し、nodePortで外部からServiceにアクセスするためのポート番号を指定しています。

2.リソース作成
作成したマニフェストファイルをkubectl applyコマンドで適用してリソースを作成します。

kubectl apply -f example-service.yaml

3.ブラウザからアクセスして動作確認
Serviceが作成されたら、外部からServiceにアクセスするために、ServiceがデプロイされているKubernetesクラスタのノードのIPアドレスを調べます。

kubectl get nodes -o wide

これで、Serviceが公開しているポート番号(例: 30000)を指定して、ブラウザからアクセスして動作確認ができます。

4.ConfigMap作成

  1. ConfigMapとPodを含むマニフェストファイル作成
    2.マニフェストファイルを適用してPodを作成します
  2. Podに入ってConfigMapが接続されていることを確認

1.ConfigMapの定義を記述したマニフェストファイルを作成します。
例えば、次のようなconfigmap.yamlというファイルを作成します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  my-key: my-value

この例では、my-configという名前のConfigMapが作成され、その中にmy-keyというキーとmy-valueという値が格納されます。

マニフェストファイルを適用してConfigMapを作成します。

$ kubectl apply -f configmap.yaml

Podを含むマニフェストファイルを作成します。
例えば、次のようなpod-with-configmap.yamlというファイルを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
      volumeMounts:
        - name: config-volume
          mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: my-config

この例では、my-podという名前のPodが作成され、その中にnginxというコンテナが定義されます。
config-volumeという名前のボリュームが作成され、その中にはmy-configという名前のConfigMapがマウントされます。
my-containerコンテナは/etc/configディレクトリにConfigMapがマウントされたボリュームをマウントしています。

2.マニフェストファイルを適用してPodを作成します。

$ kubectl apply -f pod-with-configmap.yaml

3.Podに入ってConfigMapが接続されていることを確認します。

$ kubectl exec -it my-pod -- /bin/bash
root@my-pod:/# cat /etc/config/my-key
my-value

この例では、my-podという名前のPodにexecコマンドを実行してコンテナに入り、/etc/config/my-keyというファイルを読み込んでいます。このファイルには、ConfigMapで定義されたmy-keyの値であるmy-valueが格納されていることが確認できます。

5.Secret作成

  1. SecretとPodを含むマニフェストファイル作成
  2. リソース作成
  3. Podに入ってSecretが接続されていることを確認

1.SecretとPodを含むマニフェストファイル作成
KubernetesにおいてSecretとPodを作成するためのマニフェストファイルの例です。

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: <base64-encoded-username>
  password: <base64-encoded-password>
---
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage
    env:
    - name: USERNAME
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: username
    - name: PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: password

2.リソース作成

$ kubectl apply -f mypod.yaml

3.Podに入ってSecretが接続されていることを確認

$ kubectl exec -it mypod -- /bin/bash
$ env | grep USERNAME
USERNAME=<decoded-username>
$ env | grep PASSWORD
PASSWORD=<decoded-password>

この例では、Secretにはusernameとpasswordという2つのキーがあり、それぞれbase64でエンコードされた値が含まれています。
Podでは、envセクションを使用して、Secretの値を環境変数として読み込むように設定されています。
最後に、kubectl execコマンドを使用して、Pod内で環境変数が正しく設定されていることを確認します。

6.永続データ作成

  1. PVとPVCを含むマニフェストファイル作成
  2. リソース作成

1.PVとPVCを含むマニフェストファイル作成
Kubernetesにおいて永続データを作成するためのマニフェストファイルの例です。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: slow
  hostPath:
    path: /mnt/data

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: slow

2.リソース作成

$ kubectl apply -f my-pv-pvc.yaml

この例では、永続化されるデータのための永続ボリューム(PV)と永続ボリュームクレーム(PVC)を作成しています。
PVは、hostPathを使用してホストのファイルシステムにマウントされ、PVCはPVを要求して永続化されるデータを格納する場所を指定します。
この例では、PVCはmy-pvcという名前で1Giのストレージを要求し、slowストレージクラスを使用します。
PVはmy-pvという名前で1Giのストレージを提供し、ReadWriteOnceアクセスモードを持ち、再利用する場合のポリシーを指定するRetainポリシーを使用します。

マニフェストを作成した後は、kubectl applyコマンドを使用してリソースを作成できます。

7.StatefulSetの作成

  1. StatefulSetおよびServiceのマニフェストを作成
  2. デバッグ用PodからService経由でPodにアクセス

1.StatefulSetおよびServiceのマニフェストを作成
KubernetesにおいてStatefulSetとServiceを作成するためのマニフェストファイルの例です。

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-statefulset
spec:
  serviceName: my-service
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: my-pvc
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: my-pvc
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    port: 80
    targetPort: 8080

2.デバッグ用PodからService経由でPodにアクセス

$ kubectl run -it --rm debug --image=busybox --restart=Never -- /bin/sh
/ # nslookup my-service
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      my-service.default.svc.cluster.local
Address 1: 10.244.2.2 my-statefulset-1.my-service.default.svc.cluster.local
Address 2: 10.244.3.3 my-statefulset-2.my-service.default.svc.cluster.local
Address 3: 10.244.4.4 my-statefulset-0.my-service.default.svc.cluster.local
/ # wget -O - http://my-service.default.svc.cluster.local:80

この例では、StatefulSetとServiceの2つのマニフェストファイルがあります。
StatefulSetは3つのレプリカを持ち、my-containerコンテナを含むPodテンプレートを使用しています。
このコンテナは、my-pvcという名前の永続ボリュームをマウントして、/dataディレクトリにアクセスできるようになっています。
Serviceは、my-appというラベルを持つPodにトラフィックを転送し、ポート80を使用します。

デバッグ用のPodを起動し、nslookupコマンドでServiceの名前解決を行い、結果を表示してから、wgetコマンドを使用して
Serviceにアクセスします。StatefulSetによって作成された3つのPodのうち、1つが応答するはずです。

8.Ingressの作成

  1. Deployment, Service を準備
  2. Ingress を作成
  3. 外部からアクセス

KubernetesにおいてIngressを作成するための例です。

1.Deployment, Service を準備
DeploymentとServiceのマニフェストを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    port: 80
    targetPort: 8080

2.Ingress を作成
Ingressのマニフェストを作成します。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              name: http

この例では、Ingressを作成し、ホスト名example.comにアクセスした場合にServiceにルーティングするように指定しています。
また、/appというパスがある場合にServiceにルーティングするようにも指定しています。

3.外部からアクセス
Ingressを作成した後、外部からIngressにアクセスできるように設定する必要があります。
このためには、KubernetesクラスターにIngress Controllerをインストールする必要があります。
代表的なIngress Controllerには、NGINX、Traefik、GKE Ingressがあります。

NGINX Ingress Controllerを使用する場合は、次のコマンドを実行して、必要なリソースを作成します。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml

Ingress Controllerをインストールしたら、Ingressにアクセスするために使用するIPアドレスまたはドメイン名を取得する必要があります。これは、Ingress Controllerによって異なります。たとえば、NGINX Ingress Controllerを使用する場合は、次のコマンドを使用して、Ingress ControllerのIPアドレスを取得できます。

$ kubectl get services -n ingress-nginx ingress-nginx-controller

取得したIPアドレスを使用して、ブラウザなどのクライアントからIngressにアクセスできます。
例えば、http://example.com/appにアクセスすると、IngressによってServiceにルーティングされます。

追加説明

◆Podに入ってコマンド実行
Kubernetesの場合、Podに入ってコマンドを実行するには、次のような方法があります。

kubectl execを使用する方法
kubectl execコマンドを使用して、Podに対してコマンドを実行できます。
Podに入ってlsコマンドを実行する例です。

kubectl exec -it <pod-name> -- ls

-itオプションは、対話的なモードで実行するためのオプションです。
には、実行したいPodの名前を指定します。コマンドを実行する際には、--の後にコマンドを指定します。

kubectl runを使用する方法
kubectl runコマンドを使用して、Podを新たに作成し、その中でコマンドを実行できます。
Podに入ってlsコマンドを実行する例です。

kubectl run -it --rm --image=<image-name> my-pod -- ls

-itオプションは、対話的なモードで実行するためのオプションです。--rmオプションは、コマンド実行後にPodを削除するためのオプションです。--imageオプションは、実行したいコマンドを含むコンテナイメージを指定します。my-podには、新たに作成されるPodの名前を指定します。コマンドを実行する際には、Podが作成された後に対話的なモードで入るため、--の後にコマンドを指定しません。

kubectl attachを使用する方法
kubectl attachコマンドを使用して、既に実行中のPodに対して入ってコマンドを実行できます。
Podに入ってlsコマンドを実行する例です。

kubectl attach -it <pod-name>

-itオプションは、対話的なモードで実行するためのオプションです。
< pod-name >には、入りたいPodの名前を指定します。Podに入った後に、コマンドを実行できます。

◆Pod⇔ホスト間のファイル転送
Kubernetesの場合、Podとホスト間でファイルを転送するには、次のような方法があります。

kubectl cpを使用する方法
kubectl cpコマンドを使用して、ファイルをPodとホスト間で転送できます。
Podからローカルのファイルをホストに転送する例です。

kubectl cp <pod-name>:<source-path> <destination-path>

< pod-name>には、転送元のPodの名前を指定します。< source-path>には、転送元のファイルのパスを指定します。
< destination-path>には、転送先のパスを指定します。

ホストからPodにファイルを転送する例です。

kubectl cp <source-path> <pod-name>:<destination-path>

< source-path> には、転送元のファイルのパスを指定します。< destination-path> には、転送先のパスを指定します。

Volumeを使用する方法
Volumeを使用して、Podとホスト間でデータを共有することができます。
Podとホストで同じディレクトリをマウントするVolumeを作成する例です。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: shared-data
      mountPath: /data
  volumes:
  - name: shared-data
    hostPath:
      path: /host-data
      type: Directory

hostPathフィールドにホスト上のディレクトリを指定することで、Pod内の/dataディレクトリにホスト上のディレクトリがマウントされます。ホスト上のディレクトリにファイルを保存することで、Pod内からアクセスすることができます。

注意:Volumeを使用する場合、Podとホスト間で共有されるため、セキュリティ上のリスクが存在します。ファイルを共有する必要がある場合は、適切なアクセス制御を実施してください。

◆ログ確認
KubernetesでPodやDeploymentなどのリソースのログを確認するには、次のような方法があります。

kubectl describeコマンドを使用する方法
kubectl describeコマンドを使用することで、PodやDeploymentの詳細情報を確認できます。
ログに関する情報も含まれます。
Podの詳細情報を確認する例です。

kubectl describe pod <pod-name>

ログに関する情報は、Eventsセクションに表示されます。
ここには、Podがどのような状態になっているか、何が起こっているかなどが記録されます。

kubectl logsコマンドを使用する方法
kubectl logsコマンドを使用することで、Podのログを確認できます。
Podのログを確認する例です。

kubectl logs <pod-name>

デフォルトでは、最新のログが表示されます。-fオプションを付けることで、ログのリアルタイムな出力も可能です。

kubectl logs -f <pod-name>

DeploymentやReplicaSetなどの場合、Podの名前がランダムに生成されます。
そのため、kubectl logsコマンドで直接Podの名前を指定することはできません。
代わりに、-lオプションを使用して、ラベルを指定することができます。
特定のラベルを持つPodのログを確認する例です。

kubectl logs -l <label-key>=<label-value>

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

4
2
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
4
2