5.2. ゾーンを意識したデプロイメントの変更
現在、file-uploader
Deployment はゾーンを認識せず、すべての Pod を同じゾーンでスケジュールできます。この場合、サイトに障害が発生すると、アプリケーションが利用できなくなります。詳細は、Pod トポロジー分散制約の使用 を参照してください。
アプリケーションゾーンを認識させるには、アプリケーションのデプロイメント設定に Pod 配置ルールを追加する必要があります。次のコマンドを実行して、以下のように出力を確認します。次の手順では、以下の出力の下にある Start セクションおよび End セクションに示されるように、トポロジーゾーンラベルを使用するように Deployment を変更します。
$ 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
[...] 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 の配置に関して変更されたために必要です。
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 アプリケーションはアップロードされたすべてのファイルを一覧表示し、新しいファイルをアップロードしたり、既存のデータをダウンロードする機能を提供します。今は何もありません。
ローカルマシンから任意のファイルを選択し、これをアプリケーションにアップロードします。
図5.1 簡単な PHP ベースのファイルのアップロードツール
- List uploaded files をクリックし、現在アップロードされているファイルの一覧を表示します。
OpenShift Container Platform イメージレジストリー、Ingress ルーティング、およびモニターリングサービスはゾーンを認識しません。