最初のコンポーネントのデプロイ
サンプルアプリケーションは、Kustomize で簡単に適用できるように構成された Kubernetes マニフェストのセットで構成されています。Kustomize はオープンソースのツールであり、kubectl CLI のネイティブ機能としても提供されています。このワークショップでは、Kustomize を使用して Kubernetes マニフェストに変更を適用し、YAML を手動で編集することなくマニフェストファイルの変更を理解しやすくします。このワークショップのさまざまなモジュールを進めていく中で、Kustomize を使用してオーバーレイとパッチを段階的に適用していきます。
サンプルアプリケーションと、このワークショップのモジュールの YAML マニフェストを参照する最も簡単な方法は、IDE のファイルブラウザを使用することです。
eks-workshop を展開し、次に base-application の項目を展開すると、サンプルアプリケーションの初期状態を構成するマニフェストを参照できます。
この構造は、サンプルアプリケーションセクションで概説された各アプリケーションコンポーネントのディレクトリで構成されています。
modules ディレクトリには、後続のラボ演習全体でクラスタに適用するマニフェストのセットが含まれています。

何かを行う前に、EKS クラスタの現在の Namespace を確認しましょう。
NAME STATUS AGE
default Active 30h
kube-node-lease Active 30h
kube-public Active 30h
kube-system Active 30h
リストされているすべてのエントリは、システムコンポーネントの Namespace です。Kubernetes labels を使用して、作成した Namespace のみにフィルタリングします。
No resources found
最初に 行うことは、catalog コンポーネントを単独でデプロイすることです。このコンポーネントのマニフェストは ~/environment/eks-workshop/base-application/catalog にあります。
configMap.yaml
deployment.yaml
kustomization.yaml
namespace.yaml
secrets.yaml
service-mysql.yaml
service.yaml
serviceAccount.yaml
statefulset-mysql.yaml
これらのマニフェストには、catalog API の望ましい状態を表現する Deployment が含まれています。
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: catalog
app.kubernetes.io/instance: catalog
app.kubernetes.io/component: service
template:
metadata:
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/name: catalog
app.kubernetes.io/instance: catalog
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
spec:
serviceAccountName: catalog
securityContext:
fsGroup: 1000
containers:
- name: catalog
envFrom:
- configMapRef:
name: catalog
- secretRef:
name: catalog-db
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
image: "public.ecr.aws/aws-containers/retail-store-sample-catalog:1.2.1"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 3
readinessProbe:
httpGet:
path: /health
port: 8080
successThreshold: 3
periodSeconds: 5
resources:
limits:
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi
volumeMounts:
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir:
medium: Memory
単一のレプリカを実行します
他のリソースが参照できるように、Pod にラベルを適用します
public.ecr.aws/aws-containers/retail-store-sample-catalog コンテナイメージを使用します
http という名前のポート 8080 でコンテナを公開します
/health パスに対して probes/healthchecks を実行します
Kubernetes スケジューラが十分な利用可能リソースを持つノードに配置できるように、特定の量の CPU とメモリをリ クエストします
マニフェストには、他のコンポーネントが catalog API にアクセスするために使用する Service も含まれています。
apiVersion: v1
kind: Service
metadata:
name: catalog
labels:
app.kubernetes.io/created-by: eks-workshop
spec:
type: ClusterIP
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: catalog
app.kubernetes.io/instance: catalog
app.kubernetes.io/component: service
ポート 80 で自身を公開し、Deployment によって公開される http ポートをターゲットにします。これはポート 8080 に変換されます
上記の Deployment で表現したものと一致するラベルを使用して catalog Pod を選択します
catalog コンポーネントを作成しましょう。
namespace/catalog created
serviceaccount/catalog created
configmap/catalog created
secret/catalog-db created
service/catalog created
service/catalog-mysql created
deployment.apps/catalog created
statefulset.apps/catalog-mysql created
Amazon EKS Auto Mode にワークロードをデプロイすると、クラスタは Pod を実行するための EC2 インスタンスを自動的にプロビジョニングします。このプロセスをリアルタイムで観察してみましょう。
NAME READY STATUS RESTARTS AGE
catalog-5fdcc8c65-jkg9f 1/1 Running 2 (87s ago) 2m6s
catalog-mysql-0 1/1 Running 0 2m5s
Pod がまだ準備できていない場合は、kubectl wait を使用して準備ができるまで待つことができます。
Pod が実行されているので、ログを確認できます。例えば catalog API の場合は次のようになります。
kubectl logs の出力を「フォロー」するには、コマンドに '-f' オプションを使用します。(出力のフォローを停止するには CTRL-C を使用します)
Kubernetes では、catalog Pod の数を水平方向に簡単にスケーリングすることもできます。
deployment.apps/catalog scaled
EKS Auto Mode は、ワークロードの需要に合わせてコン ピュート容量を自動的にスケーリングします。現在のノードが処理できる以上のレプリカにスケーリングすると、Auto Mode は追加のノードを自動的にプロビジョニングします。クラスタは Pod のリソース要件に基づいて、ノードの配置と容量を継続的に最適化します。
適用したマニフェストは、クラスタ内の他のコンポーネントが接続するために使用できる、アプリケーションと MySQL Pod のそれぞれの Service も作成します。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
catalog ClusterIP 172.20.83.84 <none> 80/TCP 2m48s
catalog-mysql ClusterIP 172.20.181.252 <none> 3306/TCP 2m48s
これらの Service はクラスタの内部にあるため、インターネットや VPC からアクセスすることはできません。ただし、exec を使用して EKS クラスタ内の既存の Pod にアクセスし、catalog API が動作していることを確認できます。
製品情報を含む JSON ペイロードが返されるはずです。おめでとうございます。Kubernetes と EKS を使用して最初のマイクロサービスをデプロイしました!