メインコンテンツまでスキップ

最初のコンポーネントのデプロイ

サンプルアプリケーションは、Kustomizeで簡単に適用できるように整理されたKubernetesマニフェストのセットで構成されています。Kustomizeはオープンソースのツールであり、kubectl CLIのネイティブ機能としても提供されています。このワークショップではKustomizeを使用してKubernetesマニフェストに変更を適用し、YAMLを手動で編集する必要なく、マニフェストファイルの変更を理解しやすくします。このワークショップのさまざまなモジュールを進めていく中で、Kustomizeを使用してオーバーレイとパッチを段階的に適用していきます。

サンプルアプリケーションとこのワークショップのモジュールのYAMLマニフェストを閲覧する最も簡単な方法は、IDEのファイルブラウザを使用することです:

IDE files

eks-workshopを展開し、次にbase-application項目を展開すると、サンプルアプリケーションセクションで説明したサンプルアプリケーションの初期状態を構成するマニフェストを閲覧できます:

IDE files base

この構造は、サンプルアプリケーションセクションで説明した各アプリケーションコンポーネント用のディレクトリで構成されています。

modulesディレクトリには、後続のラボ演習で適用するマニフェストのセットが含まれています:

IDE files modules

何かをする前に、まずEKSクラスタの現在のNamespaceを確認しましょう:

~$kubectl get namespaces
NAME                            STATUS   AGE
default                         Active   1h
kube-node-lease                 Active   1h
kube-public                     Active   1h
kube-system                     Active   1h

リストされたエントリはすべて、事前にインストールされたシステムコンポーネント用のNamespaceです。Kubernetesラベルを使用して、Namespaceを作成したものだけにフィルタリングすることで、これらを無視します:

~$kubectl get namespaces -l app.kubernetes.io/created-by=eks-workshop
No resources found

最初に行うことは、カタログコンポーネントを単独でデプロイすることです。このコンポーネントのマニフェストは、~/environment/eks-workshop/base-application/catalogにあります。

~$ls ~/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

これらのマニフェストには、カタログAPIの望ましい状態を表現するカタログAPIコンポーネントのDeploymentが含まれています:

~/environment/eks-workshop/base-application/catalog/deployment.yaml
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
A

1つのレプリカを実行する

B

他のリソースが参照できるようにPodにラベルを適用する

C

public.ecr.aws/aws-containers/retail-store-sample-catalogコンテナイメージを使用する

D

httpという名前のポート8080でコンテナを公開する

E

/healthパスに対してプローブ/ヘルスチェックを実行する

F

Kubernetesスケジューラが十分な利用可能なリソースを持つノードに配置できるように、特定の量のCPUとメモリをリクエストする

マニフェストには、他のコンポーネントがカタログAPIにアクセスするために使用するServiceも含まれています:

~/environment/eks-workshop/base-application/catalog/service.yaml
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
A

ポート80で公開され、Deploymentが公開するhttpポート(ポート8080に変換される)をターゲットとする

B

上記のDeploymentで表現したものと一致するラベルを使用してカタログPodを選択する

カタログコンポーネントを作成しましょう:

~$kubectl apply -k ~/environment/eks-workshop/base-application/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が表示されます:

~$kubectl get namespaces -l app.kubernetes.io/created-by=eks-workshop
NAME      STATUS   AGE
catalog   Active   15s

このNamespace内で実行されているPodを確認してみましょう:

~$kubectl get pod -n catalog
NAME                       READY   STATUS    RESTARTS      AGE
catalog-846479dcdd-fznf5   1/1     Running   2 (43s ago)   46s
catalog-mysql-0            1/1     Running   0             46s

カタログAPIのPodとMySQLデータベース用の別のPodがあることに注意してください。catalog PodがCrashLoopBackOffステータスを示している場合、起動する前にcatalog-mysql Podに接続できる必要があります。Kubernetesはこれが達成されるまでPodを再起動し続けます。その場合、kubectl waitを使用して特定のPodが準備完了状態になるまで監視できます:

~$kubectl wait --for=condition=Ready pods --all -n catalog --timeout=180s

Podが実行されたら、ログを確認できます。例えば、カタログAPI:

ヒント

kubectl logsの出力を「フォロー」するには、コマンドで'-f'オプションを使用します。(フォローを停止するにはCTRL-Cを使用します)

~$kubectl logs -n catalog deployment/catalog

Kubernetesでは、カタログPodの数を簡単に水平スケーリングすることもできます:

~$kubectl scale -n catalog --replicas 3 deployment/catalog
deployment.apps/catalog scaled
~$kubectl wait --for=condition=Ready pods --all -n catalog --timeout=180s

適用したマニフェストは、アプリケーションとMySQLのPodそれぞれに対して、クラスタ内の他のコンポーネントが接続するために使用できるServiceも作成します:

~$kubectl get svc -n catalog
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にアクセスし、カタログAPIが機能していることを確認できます:

~$kubectl -n catalog exec -i \
deployment/catalog -- curl catalog.catalog.svc/catalog/products | jq .

製品情報を含むJSONペイロードが返されるはずです。おめでとうございます、KubernetesとEKSに最初のマイクロサービスをデプロイしました!