2.4. 在受限环境中使用 odo

2.4.1. 受限环境中的 odo

要在断开连接的集群或受限环境中置备的集群中运行 odo ,集群管理员需要创建带有registry 镜像(mirror)的集群。

要在断开连接的集群中工作,必须首先将 odo init 镜像推送到集群的 registry 中,然后使用 ODO_BOOTSTRAPPER_IMAGE 环境变量覆盖 odo init 镜像路径。

在推送 odo init 镜像后,您需要为 registry 中的支持的构建程序镜像(builder image)在本地创建一个镜像(mirror)覆盖 registry 镜像(mirror),然后创建您的应用程序。构建程序镜像是为应用程序配置运行时环境所必需的,它还包含构建应用程序所需的构建工具,例如:用于 Node.js 的 npm 或用于 Java 的 Maven。一个 registry 镜像(mirror)会包含应用程序所需的所有依赖项。

2.4.2. 将 odo init 镜像推送到受限集群的 registry 中

根据集群和操作系统的配置,您可以将 odo init 镜像推送到一个 registry 镜像(mirror)中,或直接推送到内部 registry。

2.4.2.1. 先决条件

2.4.2.2. 将 odox init 镜像推送到镜像的容器镜像仓库

根据您的操作系统,您可以将 odo init 镜像推送到带有 registry 镜像(mirror)的集群中,如下所示:

2.4.2.2.1. 将 init 镜像推送到 Linux 上的镜像 registry

流程

  1. 使用 base64 对您的镜像 registry 的 root 认证授权 (CA) 内容进行编码:

    $ echo <content_of_additional_ca> | base64 -d > disconnect-ca.crt
  2. 将编码的 root CA 证书复制到适当的位置:

    $ sudo cp ./disconnect-ca.crt /etc/pki/ca-trust/source/anchors/<mirror-registry>.crt
  3. 信任客户端平台中的 CA,并登录 OpenShift Container Platform 镜像 registry:

    $ sudo update-ca-trust enable && sudo systemctl daemon-reload && sudo systemctl restart / docker && docker login <mirror-registry>:5000 -u <username> -p <password>
  4. odox init 镜像进行镜像(mirror):

    $ oc image mirror registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag> <mirror-registry>:5000/openshiftdo/odo-init-image-rhel7:<tag>
  5. 设置 ODO_BOOTSTRAPPER_IMAGE 环境变量来覆盖默认的 odo init 镜像路径:

    $ export ODO_BOOTSTRAPPER_IMAGE=<mirror-registry>:5000/openshiftdo/odo-init-image-rhel7:<tag>
2.4.2.2.2. 将 init 镜像推送到 MacOS 上的镜像 registry

流程

  1. 使用 base64 对您的镜像 registry 的 root 认证授权 (CA) 内容进行编码:

    $ echo <content_of_additional_ca> | base64 -d > disconnect-ca.crt
  2. 将编码的 root CA 证书复制到适当的位置:

    1. 使用 Docker UI 重启 Docker。
    2. 运行以下命令:

      $ docker login <mirror-registry>:5000 -u <username> -p <password>
  3. odox init 镜像进行镜像(mirror):

    $ oc image mirror registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag> <mirror-registry>:5000/openshiftdo/odo-init-image-rhel7:<tag>
  4. 设置 ODO_BOOTSTRAPPER_IMAGE 环境变量来覆盖默认的 odo init 镜像路径:

    $ export ODO_BOOTSTRAPPER_IMAGE=<mirror-registry>:5000/openshiftdo/odo-init-image-rhel7:<tag>
2.4.2.2.3. 将 init 镜像推送到 Windows 上的镜像 registry

流程

  1. 使用 base64 对您的镜像 registry 的 root 认证授权 (CA) 内容进行编码:

    PS C:\> echo <content_of_additional_ca> | base64 -d > disconnect-ca.crt
  2. 作为管理员,请执行以下命令将编码的 root CA 证书复制到适当的位置:

    PS C:\WINDOWS\system32> certutil -addstore -f "ROOT" disconnect-ca.crt
  3. 信任客户端平台中的 CA,并登录 OpenShift Container Platform 镜像 registry:

    1. 使用 Docker UI 重启 Docker。
    2. 运行以下命令:

      PS C:\WINDOWS\system32> docker login <mirror-registry>:5000 -u <username> -p <password>
  4. odox init 镜像进行镜像(mirror):

    PS C:\> oc image mirror registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag> <mirror-registry>:5000/openshiftdo/odo-init-image-rhel7:<tag>
  5. 设置 ODO_BOOTSTRAPPER_IMAGE 环境变量来覆盖默认的 odo init 镜像路径:

    PS C:\> $env:ODO_BOOTSTRAPPER_IMAGE="<mirror-registry>:5000/openshiftdo/odo-init-image-rhel7:<tag>"

2.4.2.3. 将 odo init 镜像直接推送到内部 registry

如果集群允许镜像直接推送到内部 registry,请将 odo init 镜像推送到 registry:

2.4.2.3.1. 在 Linux 中直接推送 init 镜像

流程

  1. 启用默认路由:

    $ oc patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"defaultRoute":true}}' --type='merge' -n openshift-image-registry
  2. 获取通配符路由 CA:

    $ oc get secret router-certs-default -n openshift-ingress -o yaml
    apiVersion: v1
    data:
      tls.crt: **************************
      tls.key: ##################
    kind: Secret
    metadata:
      [...]
    type: kubernetes.io/tls
  3. 使用 base64 对您的镜像 registry 的 root 认证授权 (CA) 内容进行编码:

    $ echo <tls.crt> | base64 -d > ca.crt
  4. 在客户端平台中信任 CA:

    $ sudo cp ca.crt  /etc/pki/ca-trust/source/anchors/externalroute.crt && sudo update-ca-trust enable && sudo systemctl daemon-reload && sudo systemctl restart docker
  5. 登录到内部 registry:

    $ oc get route -n openshift-image-registry
    NAME       HOST/PORT    PATH   SERVICES     PORT  TERMINATION   WILDCARD
    default-route   <registry_path>          image-registry   <all>   reencrypt     None
    
    $ docker login <registry_path> -u kubeadmin -p $(oc whoami -t)
  6. 推送 odo init 镜像:

    $ docker pull registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag>
    
    $ docker tag registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag> <registry_path>/openshiftdo/odo-init-image-rhel7:<tag>
    
    $ docker push <registry_path>/openshiftdo/odo-init-image-rhel7:<tag>
  7. 设置 ODO_BOOTSTRAPPER_IMAGE 环境变量来覆盖默认的 odo init 镜像路径:

    $ export ODO_BOOTSTRAPPER_IMAGE=<registry_path>/openshiftdo/odo-init-image-rhel7:1.0.1
2.4.2.3.2. 在 MacOS 上直接推送 init 镜像

流程

  1. 启用默认路由:

    $ oc patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"defaultRoute":true}}' --type='merge' -n openshift-image-registry
  2. 获取通配符路由 CA:

    $ oc get secret router-certs-default -n openshift-ingress -o yaml
    apiVersion: v1
    data:
      tls.crt: **************************
      tls.key: ##################
    kind: Secret
    metadata:
      [...]
    type: kubernetes.io/tls
  3. 使用 base64 对您的镜像 registry 的 root 认证授权 (CA) 内容进行编码:

    $ echo <tls.crt> | base64 -d > ca.crt
  4. 在客户端平台中信任 CA:

    $ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ca.crt
  5. 登录到内部 registry:

    $ oc get route -n openshift-image-registry
    NAME       HOST/PORT    PATH   SERVICES     PORT  TERMINATION   WILDCARD
    default-route   <registry_path>          image-registry   <all>   reencrypt     None
    
    $ docker login <registry_path> -u kubeadmin -p $(oc whoami -t)
  6. 推送 odo init 镜像:

    $ docker pull registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag>
    
    $ docker tag registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag> <registry_path>/openshiftdo/odo-init-image-rhel7:<tag>
    
    $ docker push <registry_path>/openshiftdo/odo-init-image-rhel7:<tag>
  7. 设置 ODO_BOOTSTRAPPER_IMAGE 环境变量来覆盖默认的 odo init 镜像路径:

    $ export ODO_BOOTSTRAPPER_IMAGE=<registry_path>/openshiftdo/odo-init-image-rhel7:1.0.1
2.4.2.3.3. 在 Windows 上直接推送 init 镜像

流程

  1. 启用默认路由:

    PS C:\> oc patch configs.imageregistry.operator.openshift.io cluster -p '{"spec":{"defaultRoute":true}}' --type='merge' -n openshift-image-registry
  2. 获取通配符路由 CA:

    PS C:\> oc get secret router-certs-default -n openshift-ingress -o yaml
    apiVersion: v1
    data:
      tls.crt: **************************
      tls.key: ##################
    kind: Secret
    metadata:
      [...]
    type: kubernetes.io/tls
  3. 使用 base64 对您的镜像 registry 的 root 认证授权 (CA) 内容进行编码:

    PS C:\> echo <tls.crt> | base64 -d > ca.crt
  4. 作为管理员,请执行以下命令在客户端平台中信任 CA:

    PS C:\WINDOWS\system32> certutil -addstore -f "ROOT" ca.crt
  5. 登录到内部 registry:

    PS C:\> oc get route -n openshift-image-registry
    NAME       HOST/PORT    PATH   SERVICES     PORT  TERMINATION   WILDCARD
    default-route   <registry_path>          image-registry   <all>   reencrypt     None
    
    PS C:\> docker login <registry_path> -u kubeadmin -p $(oc whoami -t)
  6. 推送 odo init 镜像:

    PS C:\> docker pull registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag>
    
    PS C:\> docker tag registry.access.redhat.com/openshiftdo/odo-init-image-rhel7:<tag> <registry_path>/openshiftdo/odo-init-image-rhel7:<tag>
    
    PS C:\> docker push <registry_path>/openshiftdo/odo-init-image-rhel7:<tag>
  7. 设置 ODO_BOOTSTRAPPER_IMAGE 环境变量来覆盖默认的 odo init 镜像路径:

    PS C:\> $env:ODO_BOOTSTRAPPER_IMAGE="<registry_path>/openshiftdo/odo-init-image-rhel7:<tag>"

2.4.3. 在断开连接的集群中创建和部署组件

init 镜像推送到具有镜像(mirror) registry 的集群中后,您必须使用 oc 工具为应用程序所需的构建程序镜像创建一个镜像(mirror),使用环境变量覆盖镜像 registry,然后创建组件。

2.4.3.1. 先决条件

2.4.3.2. 为支持的构建器镜像创建一个镜像(mirror)

要使用 Node.js 依赖项的 npm 软件包及 Java 依赖项的 Maven 软件包,并为应用程序配置运行时环境,您必须从镜像 registry 中镜像相应的构建器镜像。

流程

  1. 验证所需镜像标签没有导入:

    $ oc describe is nodejs -n openshift
    Name:                   nodejs
    Namespace:              openshift
    [...]
    
    10
      tagged from <mirror-registry>:<port>/rhoar-nodejs/nodejs-10
        prefer registry pullthrough when referencing this tag
    
      Build and run Node.js 10 applications on RHEL 7. For more information about using this builder image, including OpenShift considerations, see https://github.com/nodeshift/centos7-s2i-nodejs.
      Tags: builder, nodejs, hidden
      Example Repo: https://github.com/sclorg/nodejs-ex.git
    
      ! error: Import failed (NotFound): dockerimage.image.openshift.io "<mirror-registry>:<port>/rhoar-nodejs/nodejs-10:latest" not found
          About an hour ago
    
    10-SCL (latest)
      tagged from <mirror-registry>:<port>/rhscl/nodejs-10-rhel7
        prefer registry pullthrough when referencing this tag
    
      Build and run Node.js 10 applications on RHEL 7. For more information about using this builder image, including OpenShift considerations, see https://github.com/nodeshift/centos7-s2i-nodejs.
      Tags: builder, nodejs
      Example Repo: https://github.com/sclorg/nodejs-ex.git
    
      ! error: Import failed (NotFound): dockerimage.image.openshift.io "<mirror-registry>:<port>/rhscl/nodejs-10-rhel7:latest" not found
          About an hour ago
    
    [...]
  2. 将支持的镜像标签镜像到私有 registry:

    $ oc image mirror registry.access.redhat.com/rhscl/nodejs-10-rhel7:<tag> <private_registry>/rhscl/nodejs-10-rhel7:<tag>
  3. 导入镜像:

    $ oc tag <mirror-registry>:<port>/rhscl/nodejs-10-rhel7:<tag> nodejs-10-rhel7:latest --scheduled

    您必须定期重新导入镜像。--scheduled 标志启用镜像自动重新导入。

  4. 验证带有指定标签的镜像已被导入:

    $ oc describe is nodejs -n openshift
    Name:                   nodejs
    [...]
    10-SCL (latest)
      tagged from <mirror-registry>:<port>/rhscl/nodejs-10-rhel7
        prefer registry pullthrough when referencing this tag
    
      Build and run Node.js 10 applications on RHEL 7. For more information about using this builder image, including OpenShift considerations, see https://github.com/nodeshift/centos7-s2i-nodejs.
      Tags: builder, nodejs
      Example Repo: https://github.com/sclorg/nodejs-ex.git
    
      * <mirror-registry>:<port>/rhscl/nodejs-10-rhel7@sha256:d669ecbc11ac88293de50219dae8619832c6a0f5b04883b480e073590fab7c54
          3 minutes ago
    
    [...]

2.4.3.3. mirror registry 介绍

要从私有 mirror registry 中为 Node.js 依赖项下载 npm 软件包,及为 Java 依赖项下载 Maven 软件包,您必须在集群中创建并配置 mirror npm 或 Maven registry。然后您可以覆盖现有组件上的 mirror registry,或覆盖创建新组件时的 mirror registry。

流程

  • 覆盖现有组件上的 mirror registry:

    $ odo config set --env NPM_MIRROR=<npm_mirror_registry>
  • 覆盖创建组件时的 mirror registry:

    $ odo component create nodejs --env NPM_MIRROR=<npm_mirror_registry>

2.4.3.4. 使用 odo 创建 Node.js 应用程序

要创建一个 Node.js 组件,请下载 Node.js 应用程序并使用 odo将源代码推送到您的集群中。

流程

  1. 将当前目录变为您的应用程序的目录:

    $ cd <directory_name>
  2. 将类型 Node.js 的组件添加到应用程序中:

    $ odo create nodejs
    注意

    默认情况下使用最新的镜像。也可以使用 odo create openshift/nodejs:8 明确指定一个镜像版本。

  3. 将初始源代码推送到组件中:

    $ odo push

    现在,您的组件已被部署到 OpenShift Container Platform 中。

  4. 创建一个 URL,按以下方法在本地配置文件中添加条目:

    $ odo url create --port 8080
  5. 推送更改。这会在集群中创建一个 URL。

    $ odo push
  6. 列出用于检查组件所需 URL 的 URL。

    $ odo url list
  7. 使用生成的 URL 查看部署的应用程序。

    $ curl <url>