5.2. 将 Deployment 修改为区域 Aware

目前,file-uploader Deployment 不知道区,并可调度同一区域中的所有 Pod。在这种情况下,如果站点中断,则应用将不可用。如需更多信息,请参阅使用 pod 拓扑分布约束

  1. 为了让我们的应用程序区了解,我们需要在应用部署配置中添加 pod 放置规则。运行以下命令并查看下方所示的输出:在下一步中,我们将修改 Deployment 以使用拓扑区域标签,如以下输出中的 Start 和 End 部分所示。

    $ 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. 将部署扩展为 个 Pod,然后重新扩展到 四个 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 区域中的四个节点上。

    $ 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 屏幕上传
    4. 单击 已上传文件列表,以查看所有当前上传的文件的列表。
注意

OpenShift Container Platform 镜像 registry、入口路由和监控服务不被区识别