5.2. ゾーンを意識したデプロイメントの変更
現在、file-uploader
Deployment はゾーンを認識せず、すべての Pod を同じゾーンでスケジュールできます。この場合、サイトに障害が発生すると、アプリケーションは利用できなくなります。詳細は、Pod トポロジー分散制約を使用した Pod 配置の制御 を参照してください。
アプリケーションデプロイメント設定に Pod 配置ルールを追加して、アプリケーションゾーンを認識させます。
以下のコマンドを実行して出力を確認します。
$ oc get deployment file-uploader -o yaml -n my-shared-storage | less
出力例:
[...] spec: progressDeadlineSeconds: 600 replicas: 4 revisionHistoryLimit: 10 selector: matchLabels: deployment: file-uploader strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: annotations: openshift.io/generated-by: OpenShiftNewApp creationTimestamp: null labels: deployment: file-uploader spec: # <-- Start inserted lines after here containers: # <-- End inserted lines before here - image: image-registry.openshift-image-registry.svc:5000/my-shared-storage/file-uploader@sha256:a458ea62f990e431ad7d5f84c89e2fa27bdebdd5e29c5418c70c56eb81f0a26b imagePullPolicy: IfNotPresent name: file-uploader [...]
トポロジーゾーンラベルを使用するようにデプロイメントを編集します。
$ oc edit deployment file-uploader -n my-shared-storage
Start
とEnd
の間に、以下の新しい行を追加します (前のステップの出力に表示)。[...] spec: topologySpreadConstraints: - labelSelector: matchLabels: deployment: file-uploader maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule - labelSelector: matchLabels: deployment: file-uploader maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway nodeSelector: node-role.kubernetes.io/worker: "" containers: [...]
出力例:
deployment.apps/file-uploader edited
デプロイを 0 個 の Pod に変更し、その後 4 個 の Pod に戻します。これは、デプロイメントが Pod の配置に関して変更されたために必要です。
- 0 個 の Pod へのスケールダウン
$ oc scale deployment file-uploader --replicas=0 -n my-shared-storage
出力例:
deployment.apps/file-uploader scaled
- 4 個 の Pod へのスケールアップ
$ oc scale deployment file-uploader --replicas=4 -n my-shared-storage
出力例:
deployment.apps/file-uploader scaled
4 つの Pod が datacenter1 および datacenter2 ゾーンの 4 つのノードに分散されていることを確認します。
$ oc get pods -o wide -n my-shared-storage | egrep '^file-uploader'| grep -v build | awk '{print $7}' | sort | uniq -c
出力例:
1 perf1-mz8bt-worker-d2hdm 1 perf1-mz8bt-worker-k68rv 1 perf1-mz8bt-worker-ntkp8 1 perf1-mz8bt-worker-qpwsr
使用されるゾーンラベルを検索します。
$ oc get nodes -L topology.kubernetes.io/zone | grep datacenter | grep -v master
出力例:
perf1-mz8bt-worker-d2hdm Ready worker 35d v1.20.0+5fbfd19 datacenter1 perf1-mz8bt-worker-k68rv Ready worker 35d v1.20.0+5fbfd19 datacenter1 perf1-mz8bt-worker-ntkp8 Ready worker 35d v1.20.0+5fbfd19 datacenter2 perf1-mz8bt-worker-qpwsr Ready worker 35d v1.20.0+5fbfd19 datacenter2
ブラウザーを使用して file-uploader Web アプリケーションを使用して新規ファイルをアップロードします。
作成されたルートを検索します。
$ oc get route file-uploader -n my-shared-storage -o jsonpath --template="http://{.spec.host}{'\n'}"
出力例:
http://file-uploader-my-shared-storage.apps.cluster-ocs4-abdf.ocs4-abdf.sandbox744.opentlc.com
直前の手順のルートを使用して、ブラウザーを Web アプリケーションに指定します。
Web アプリケーションはアップロードしたすべてのファイルを一覧表示し、新しいファイルをアップロードしたり、既存のデータをダウンロードする機能を提供します。今は何もありません。
ローカルマシンから任意のファイルを選択し、これをアプリケーションにアップロードします。
- Choose file をクリックして任意のファイルを選択します。
アップロード をクリックします。
図5.1 簡単な PHP ベースのファイルのアップロードツール
- List uploaded files をクリックし、現在アップロードされているファイルの一覧を表示します。
OpenShift Container Platform イメージレジストリー、Ingress ルーティング、およびモニターリングサービスはゾーンを認識しません。