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

Deployment

Deploymentは、ステートレスアプリケーションを実行するための最も一般的なワークロードコントローラーです。Deploymentは、アプリケーションが常に希望する数のPodを実行することを保証し、作成、スケーリング、更新、復旧を自動的に処理します。

Podを手動で管理する代わりに、DeploymentによってKubernetesは以下を実行できます:

  • 複数の同一Podを実行 - 信頼性と負荷分散のため
  • 自動的にスケール - レプリカ数を調整することで
  • 失敗したPodを復旧 - 手動介入なしで
  • ローリング更新を実行 - ダウンタイムなしで
  • 簡単にロールバック - 問題があった場合、以前のバージョンに戻す

Deploymentの作成

Deploymentを使用して小売ストアのUIをデプロイしましょう:

~/environment/eks-workshop/base-application/ui/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ui
labels:
app.kubernetes.io/created-by: eks-workshop
app.kubernetes.io/type: app
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: ui
app.kubernetes.io/instance: ui
app.kubernetes.io/component: service
template:
metadata:
annotations:
prometheus.io/path: /actuator/prometheus
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
labels:
app.kubernetes.io/name: ui
app.kubernetes.io/instance: ui
app.kubernetes.io/component: service
app.kubernetes.io/created-by: eks-workshop
spec:
serviceAccountName: ui
securityContext:
fsGroup: 1000
containers:
- name: ui
env:
- name: JAVA_OPTS
value: -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/urandom
- name: METADATA_KUBERNETES_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: METADATA_KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: METADATA_KUBERNETES_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
envFrom:
- configMapRef:
name: ui
securityContext:
capabilities:
add:
- NET_BIND_SERVICE
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
image: "public.ecr.aws/aws-containers/retail-store-sample-ui:1.2.1"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 45
periodSeconds: 20
resources:
limits:
memory: 1.5Gi
requests:
cpu: 250m
memory: 1.5Gi
volumeMounts:
- mountPath: /tmp
name: tmp-volume
volumes:
- name: tmp-volume
emptyDir:
medium: Memory
A

kind: Deployment: Deploymentコントローラーを定義

B

metadata.name: Deploymentの名前(ui)

C

spec.replicas: 希望するPod数(この例では1)

D

spec.selector: 管理されるPodを見つけるために使用されるラベル

E

spec.template: 各Podがどのように見えるべきかを定義するPodテンプレート

Deploymentは、実際のPodが常にこのテンプレートと一致することを保証します。

Deploymentを適用します:

~$kubectl apply -k ~/environment/eks-workshop/base-application/ui

Deploymentの確認

Deploymentのステータスを確認します:

~$kubectl get deployment -n ui
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
ui     1/1     1            1           30s

Deploymentによって作成されたPodをリストします:

~$kubectl get pods -n ui
NAME                  READY   STATUS    RESTARTS   AGE
ui-6d5bb7b9c8-xyz12   1/1     Running   0          30s

詳細情報を取得します:

~$kubectl describe deployment -n ui ui

Deploymentのスケーリング

5つのレプリカにスケールアップします:

~$kubectl scale deployment -n ui ui --replicas=5
~$kubectl get pods -n ui
NAME                  READY   STATUS    RESTARTS   AGE
ui-6d5bb7b9c8-abc12   1/1     Running   0          2m
ui-6d5bb7b9c8-def34   1/1     Running   0          12s
ui-6d5bb7b9c8-ghi56   1/1     Running   0          12s
ui-6d5bb7b9c8-arx97   1/1     Running   0          10s
ui-6d5bb7b9c8-uiv85   1/1     Running   0          10s
備考

Kubernetesは、高可用性のためにこれらのPodを利用可能なワーカーノード全体に自動的に分散します。

3つのレプリカにスケールダウンします:

~$kubectl scale deployment -n ui ui --replicas=3
~$kubectl get pods -n ui
NAME                  READY   STATUS    RESTARTS   AGE
ui-6d5bb7b9c8-abc12   1/1     Running   0          2m
ui-6d5bb7b9c8-def34   1/1     Running   0          12s
ui-6d5bb7b9c8-ghi56   1/1     Running   0          12s

ローリング更新とロールバック

イメージバージョンを変更することでDeploymentを更新できます:

~$kubectl set image deployment/ui ui=public.ecr.aws/aws-containers/retail-store-sample-ui:v2 -n ui
~$kubectl get pods -n ui
NAME                  READY   STATUS         RESTARTS   AGE
ui-5989474687-5gcbt   1/1     Running        0          13m
ui-5989474687-dhk6q   1/1     Running        0          14s
ui-5989474687-dw8x8   1/1     Running        0          14s
ui-7c65b44b7c-znm9c   0/1     ErrImagePull   0          7s

新しいPodが作成されましたが、ステータスがErrImagePullになっています。

それでは変更をロールバックしましょう:

~$kubectl rollout undo deployment/ui -n ui
~$kubectl get pods -n ui
NAME                  READY   STATUS         RESTARTS   AGE
ui-5989474687-5gcbt   1/1     Running        0          13m
ui-5989474687-dhk6q   1/1     Running        0          14s
ui-5989474687-dw8x8   1/1     Running        0          14s

ローリング更新により、ダウンタイムなしでアプリケーションを段階的に更新でき、Kubernetesは新しいPodが希望する状態と一致することを保証します。 無効なイメージなど問題が発生した場合は、以前の動作しているバージョンに安全にロールバックでき、アプリケーションの可用性を維持し、安定性を保つことができます。

これは、Deploymentがアプリケーションの更新を簡素化し、可用性を維持し、本番環境でのリスクを軽減する方法を示しています。

覚えておくべき重要なポイント

  • Deploymentは複数の同一Podを自動的に管理します
  • 本番環境では、Podを直接作成する代わりにDeploymentを使用します
  • スケーリングは、レプリカ数を変更するだけで簡単にできます
  • Pod名にはDeployment名とランダムなサフィックスが含まれます
  • Deploymentは、WebアプリやAPIなどのステートレスアプリケーションに最適です