4.5. 部署您的第一个镜像

在 OpenShift Container Platform 中部署应用程序的最简单方法是运行现有容器镜像。以下流程部署一个应用的前端组件,名为 national-parks-app。Web 应用显示一个交互式的地图。该地图显示全球主要国家公园的位置。

先决条件

  • 有访问 OpenShift Container Platform 集群的权限。
  • 安装 OpenShift CLI (oc) 。

流程

  • 要部署应用程序,请输入以下命令:

    $ oc new-app quay.io/openshiftroadshow/parksmap:latest --name=parksmap -l 'app=national-parks-app,component=parksmap,role=frontend,app.kubernetes.io/part-of=national-parks-app'

    输出示例

    --> Found container image 0c2f55f (12 months old) from quay.io for "quay.io/openshiftroadshow/parksmap:latest"
    
        * An image stream tag will be created as "parksmap:latest" that will track this image
    
    --> Creating resources with label app=national-parks-app,app.kubernetes.io/part-of=national-parks-app,component=parksmap,role=frontend ...
        imagestream.image.openshift.io "parksmap" created
        deployment.apps "parksmap" created
        service "parksmap" created
    --> Success

其他资源

4.5.1. 创建路由

外部客户端可以通过路由层访问 OpenShift Container Platform 上运行的应用程序,这个路由层后端的数据对象就是一个 路由(route)。默认的 OpenShift Container Platform 路由器(HAProxy)使用传入请求的 HTTP 标头来确定连接的位置。

另外,您可以为路由定义安全性,如 TLS。

先决条件

  • 有访问 OpenShift Container Platform 集群的权限。
  • 已安装 OpenShift CLI(oc)。
  • 您已部署了一个镜像。
  • 您必须具有 cluster-adminproject-admin 权限。

流程

  1. 要检索创建的应用程序服务,请输入以下命令:

    $ oc get service

    输出示例

    NAME      TYPE       CLUSTER-IP         EXTERNAL-IP    PORT(S)   AGE
    parksmap  ClusterIP  <your-cluster-IP>  <123.456.789>  8080/TCP  8m29s

  2. 要创建路由,请输入以下命令:

    $ oc create route edge parksmap --service=parksmap

    输出示例

    route.route.openshift.io/parksmap created

  3. 要检索创建的应用程序路由,请输入以下命令:

    $ oc get route

    输出示例

    NAME        HOST/PORT                                                   PATH   SERVICES   PORT       TERMINATION   WILDCARD
    parksmap    parksmap-user-getting-started.apps.cluster.example.com             parksmap   8080-tcp   edge          None

4.5.2. 检查 pod

OpenShift Container Platform 使用 Kubernetes 的 pod 概念,它是共同部署在同一主机上的一个或多个容器,也是可被定义、部署和管理的最小计算单元。对容器而言,Pod 大致相当于一个机器实例(物理或虚拟)。

您可以查看集群中的 pod,并确定这些 pod 和整个集群的健康状态。

先决条件

  • 有访问 OpenShift Container Platform 集群的权限。
  • 已安装 OpenShift CLI(oc)。
  • 您已部署了一个镜像。

流程

  1. 要列出带有节点名称的所有 pod,请输入以下命令:

    $ oc get pods

    输出示例

    NAME                       READY   STATUS    RESTARTS   AGE
    parksmap-5f9579955-6sng8   1/1     Running   0          77s

  2. 要列出所有 pod 详情,请输入以下命令:

    $ oc describe pods

    输出示例

    Name:         parksmap-848bd4954b-5pvcc
    Namespace:    user-getting-started
    Priority:     0
    Node:         ci-ln-fr1rt92-72292-4fzf9-worker-a-g9g7c/10.0.128.4
    Start Time:   Sun, 13 Feb 2022 14:14:14 -0500
    Labels:       app=national-parks-app
                  app.kubernetes.io/part-of=national-parks-app
                  component=parksmap
                  deployment=parksmap
                  pod-template-hash=848bd4954b
                  role=frontend
    Annotations:  k8s.v1.cni.cncf.io/network-status:
                    [{
                        "name": "openshift-sdn",
                        "interface": "eth0",
                        "ips": [
                            "10.131.0.14"
                        ],
                        "default": true,
                        "dns": {}
                    }]
                  k8s.v1.cni.cncf.io/networks-status:
                    [{
                        "name": "openshift-sdn",
                        "interface": "eth0",
                        "ips": [
                            "10.131.0.14"
                        ],
                        "default": true,
                        "dns": {}
                    }]
                  openshift.io/generated-by: OpenShiftNewApp
                  openshift.io/scc: restricted
    Status:       Running
    IP:           10.131.0.14
    IPs:
      IP:           10.131.0.14
    Controlled By:  ReplicaSet/parksmap-848bd4954b
    Containers:
      parksmap:
        Container ID:   cri-o://4b2625d4f61861e33cc95ad6d455915ea8ff6b75e17650538cc33c1e3e26aeb8
        Image:          quay.io/openshiftroadshow/parksmap@sha256:89d1e324846cb431df9039e1a7fd0ed2ba0c51aafbae73f2abd70a83d5fa173b
        Image ID:       quay.io/openshiftroadshow/parksmap@sha256:89d1e324846cb431df9039e1a7fd0ed2ba0c51aafbae73f2abd70a83d5fa173b
        Port:           8080/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Sun, 13 Feb 2022 14:14:25 -0500
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-6f844 (ro)
    Conditions:
      Type              Status
      Initialized       True
      Ready             True
      ContainersReady   True
      PodScheduled      True
    Volumes:
      kube-api-access-6f844:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
        ConfigMapName:           openshift-service-ca.crt
        ConfigMapOptional:       <nil>
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason          Age   From               Message
      ----    ------          ----  ----               -------
      Normal  Scheduled       46s   default-scheduler  Successfully assigned user-getting-started/parksmap-848bd4954b-5pvcc to ci-ln-fr1rt92-72292-4fzf9-worker-a-g9g7c
      Normal  AddedInterface  44s   multus             Add eth0 [10.131.0.14/23] from openshift-sdn
      Normal  Pulling         44s   kubelet            Pulling image "quay.io/openshiftroadshow/parksmap@sha256:89d1e324846cb431df9039e1a7fd0ed2ba0c51aafbae73f2abd70a83d5fa173b"
      Normal  Pulled          35s   kubelet            Successfully pulled image "quay.io/openshiftroadshow/parksmap@sha256:89d1e324846cb431df9039e1a7fd0ed2ba0c51aafbae73f2abd70a83d5fa173b" in 9.49243308s
      Normal  Created         35s   kubelet            Created container parksmap
      Normal  Started         35s   kubelet            Started container parksmap

4.5.3. 扩展应用程序

在 Kubernetes 中,Deployment 对象定义了应用的部署方式。在大多数情况下,用户会一起使用 Pod, Service, ReplicaSets, 和 Deployment 资源。在大多数情况下,OpenShift Container Platform 会为您创建资源。

当您部署 national-parks-app 镜像时,会创建一个部署资源。在本例中,只部署了一个 Pod

以下流程将 national-parks-image 扩展为使用两个实例。

先决条件

  • 有访问 OpenShift Container Platform 集群的权限。
  • 已安装 OpenShift CLI(oc)。
  • 您已部署了一个镜像。

流程

  • 要将应用程序从一个 pod 实例扩展到两个 pod 实例,请输入以下命令:

    $ oc scale --current-replicas=1 --replicas=2 deployment/parksmap

    输出示例

    deployment.apps/parksmap scaled

验证

  1. 要确保应用程序正确扩展,请输入以下命令:

    $ oc get pods

    输出示例

    NAME                       READY   STATUS    RESTARTS   AGE
    parksmap-5f9579955-6sng8   1/1     Running   0          7m39s
    parksmap-5f9579955-8tgft   1/1     Running   0          24s

  2. 要将应用程序缩减至一个 pod 实例,请输入以下命令:

    $ oc scale --current-replicas=2 --replicas=1 deployment/parksmap

其他资源