5.2. ゾーンを意識したデプロイメントの変更

現在、file-uploader Deployment はゾーンを認識せず、すべての Pod を同じゾーンでスケジュールできます。この場合、サイトに障害が発生すると、アプリケーションが利用できなくなります。詳細は、Pod トポロジー分散制約の使用 を参照してください。

  1. アプリケーションゾーンを認識させるには、アプリケーションのデプロイメント設定に 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
    [...]
  2. デプロイメントを編集し、上記のように開始と終了の間に以下の行を追加します。

    $ 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
  3. デプロイを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. 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
  5. ブラウザーを使用して file-uploader Web アプリケーションを使用して新規ファイルをアップロードします。

    1. 作成されたルートを検索します。

      $ 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
    2. 上記のルートを使用して、ブラウザーを Web アプリケーションに指定します。ルートは異なります。

      Web アプリケーションはアップロードされたすべてのファイルを一覧表示し、新しいファイルをアップロードしたり、既存のデータをダウンロードする機能を提供します。今は何もありません。

    3. ローカルマシンから任意のファイルを選択し、これをアプリケーションにアップロードします。

      図5.1 簡単な PHP ベースのファイルのアップロードツール

      uploader screen upload
    4. List uploaded files をクリックし、現在アップロードされているファイルの一覧を表示します。
注記

OpenShift Container Platform イメージレジストリー、Ingress ルーティング、およびモニターリングサービスはゾーンを認識しません。