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

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

サンプルアプリケーションは、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   30h
kube-node-lease   Active   30h
kube-public       Active   30h
kube-system       Active   30h

リストされているすべてのエントリは、システムコンポーネントの Namespace です。Kubernetes labels を使用して、作成した Namespace のみにフィルタリングします。

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

最初に行うことは、catalog コンポーネントを単独でデプロイすることです。このコンポーネントのマニフェストは ~/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

これらのマニフェストには、catalog 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

単一のレプリカを実行します

B

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

C

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

D

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

E

/health パスに対して probes/healthchecks を実行します

F

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

マニフェストには、他のコンポーネントが catalog 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 で表現したものと一致するラベルを使用して catalog Pod を選択します

catalog コンポーネントを作成しましょう。

~$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
EKS Auto Mode のコンピュートプロビジョニング

Amazon EKS Auto Mode にワークロードをデプロイすると、クラスタは Pod を実行するための EC2 インスタンスを自動的にプロビジョニングします。このプロセスをリアルタイムで観察してみましょう。

~$kubectl get pod -n catalog
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 を使用して準備ができるまで待つことができます。

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

Pod が実行されているので、ログを確認できます。例えば catalog API の場合は次のようになります。

ヒント

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

~$kubectl logs -n catalog deployment/catalog

Kubernetes では、catalog Pod の数を水平方向に簡単にスケーリングすることもできます。

~$kubectl scale -n catalog --replicas 3 deployment/catalog
deployment.apps/catalog scaled
~$kubectl wait --for=condition=Ready pods --all -n catalog --timeout=180s
Auto Mode の自動スケーリング

EKS Auto Mode は、ワークロードの需要に合わせてコンピュート容量を自動的にスケーリングします。現在のノードが処理できる以上のレプリカにスケーリングすると、Auto Mode は追加のノードを自動的にプロビジョニングします。クラスタは Pod のリソース要件に基づいて、ノードの配置と容量を継続的に最適化します。

適用したマニフェストは、クラスタ内の他のコンポーネントが接続するために使用できる、アプリケーションと 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 にアクセスし、catalog API が動作していることを確認できます。

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

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