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

何かをする前に、まずEKSクラスタの現在のNamespaceを確認しましょう:
NAME STATUS AGE
default Active 1h
kube-node-lease Active 1h
kube-public Active 1h
kube-system Active 1h
リストされたエントリはすべて、事前にインストールされたシステムコンポーネント用のNamespaceです。Kubernetesラベルを使用して、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の望ましい状態を表現する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
1つのレプリカを実行する
他のリソースが参照できるようにPodにラベルを適用する
public.ecr.aws/aws-containers/retail-store-sample-catalogコンテナイメージを使用する
httpという名前のポート8080でコンテナを公開する
/healthパスに対してプローブ/ヘルスチェックを実行する
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
これで新しいNamespaceが表示されます:
NAME STATUS AGE
catalog Active 15s
このNamespace内で実行されているPodを確認してみましょう:
NAME READY STATUS RESTARTS AGE
catalog-846479dcdd-fznf5 1/1 Running 2 (43s ago) 46s
catalog-mysql-0 1/1 Running 0 46s
catalog APIのPodとMySQLデータベース用の別のPodがあることに注意してください。catalog PodがCrashLoopBackOffステータスを示している場合、起動する前にcatalog-mysql Podに接続できる必要があります。Kubernetesはこれが達成されるまでPodを再起動し続けます。その場合、kubectl waitを使用して特定のPodがReady状態になるまで監視できます:
Podが実行されたら、ログを確認できます。例えば、catalog API:
kubectl logsの出力を「フォロー」するには、コマンドで'-f'オプションを使用します。(フォローを停止するにはCTRL-Cを使用します)
Kubernetesでは、catalog Podの数を簡単に水平スケーリングすることもできます:
deployment.apps/catalog scaled
適用したマニフェストは、アプリケーションと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に最初のマイクロサービスをデプロイしました!