CLI 工具

OpenShift Container Platform 4.8

如何使用 OpenShift Container Platform 的命令行工具

摘要

本文档提供有关安装、配置和使用 OpenShift Container Platform 命令行工具的信息。它还包含 CLI 命令的参考信息,以及如何使用它们的示例。

第 1 章 OpenShift CLI (oc)

1.1. OpenShift CLI 入门

1.1.1. 关于 OpenShift CLI

使用 OpenShift 命令行界面(CLI),oc命令,您可以通过终端创建应用程序并管理 OpenShift Container Platform 项目。OpenShift CLI 在以下情况下是理想的选择:

  • 直接使用项目源代码
  • 编写 OpenShift Container Platform 操作脚本
  • 在管理项目时,受带宽资源的限制,Web 控制台无法使用

1.1.2. 安装 OpenShift CLI

您可以通过下载二进制文件或使用 RPM 来安装 OpenShift CLI(oc)。

1.1.2.1. 通过下载二进制文件安装 OpenShift CLI

您需要安装 CLI(oc) 来使用命令行界面与 OpenShift Container Platform 进行交互。您可在 Linux 、Windows 或 macOS 上安装 oc

重要

如果安装了旧版本的 oc,则无法使用 OpenShift Container Platform 4.8 中的所有命令。下载并安装新版本的 oc

在 Linux 上安装 OpenShift CLI

您可以按照以下流程在 Linux 上安装 OpenShift CLI(oc)二进制文件。

流程

  1. 导航到红帽客户门户网站上的 OpenShift Container Platform 下载页面
  2. Version 下拉菜单中选择相应的版本。
  3. 单击 OpenShift v4.8 Linux 客户端 条目旁边的 Download Now,再保存文件。
  4. 解包存档:

    $ tar xvzf <file>
  5. oc 二进制代码放到 PATH 中的目录中。

    执行以下命令可以查看当前的 PATH 设置:

    $ echo $PATH

安装 OpenShift CLI 后,可以使用 oc 命令:

$ oc <command>
在 Windows 上安装 OpenShift CLI

您可以按照以下流程在 Windows 上安装 OpenShift CLI(oc)二进制代码。

流程

  1. 导航到红帽客户门户网站上的 OpenShift Container Platform 下载页面
  2. Version 下拉菜单中选择相应的版本。
  3. 单击 OpenShift v4.8 Windows 客户端 条目旁边的 Download Now,再保存文件。
  4. 使用 ZIP 程序解压存档。
  5. oc 二进制代码放到 PATH 中的目录中。

    要查看您的 PATH,请打开命令提示窗口并执行以下命令:

    C:\> path

安装 OpenShift CLI 后,可以使用 oc 命令:

C:\> oc <command>
在 macOS 上安装 OpenShift CLI

您可以按照以下流程在 macOS 上安装 OpenShift CLI(oc)二进制代码。

流程

  1. 导航到红帽客户门户网站上的 OpenShift Container Platform 下载页面
  2. Version 下拉菜单中选择相应的版本。
  3. 单击 OpenShift v4.8 MacOSX 客户端 条目旁边的 Download Now,再保存文件。
  4. 解包和解压存档。
  5. oc 二进制文件移到 PATH 的目录中。

    要查看您的 PATH,打开一个终端窗口并执行以下命令:

    $ echo $PATH

安装 OpenShift CLI 后,可以使用 oc 命令:

$ oc <command>

1.1.2.2. 使用 RPM 安装 OpenShift CLI

对于 Red Hat Enterprise Linux (RHEL),如果您的红帽帐户中包括有效的 OpenShift Container Platform 订阅,则可将通过 RPM 安装 OpenShift CLI (oc)。

先决条件

  • 必须具有 root 或 sudo 权限。

流程

  1. 使用 Red Hat Subscription Manager 注册:

    # subscription-manager register
  2. 获取最新的订阅数据:

    # subscription-manager refresh
  3. 列出可用的订阅:

    # subscription-manager list --available --matches '*OpenShift*'
  4. 在上一命令的输出中,找到 OpenShift Container Platform 订阅的池 ID,并把订阅附加到注册的系统:

    # subscription-manager attach --pool=<pool_id>
  5. 启用 OpenShift Container Platform 4.8 所需的存储库。

    • Red Hat Enterprise Linux 8:

      # subscription-manager repos --enable="rhocp-4.7-for-rhel-8-x86_64-rpms"
    • Red Hat Enterprise Linux 7:

      # subscription-manager repos --enable="rhel-7-server-ose-4.7-rpms"
  6. 安装 openshift-clients 软件包:

    # yum install openshift-clients

安装 CLI 后,就可以使用oc命令:

$ oc <command>

1.1.3. 登录到 OpenShift CLI

您可以登录到 OpenShift CLI(oc)以访问和管理集群。

先决条件

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

要访问只能通过 HTTP 代理服务器访问的集群,可以设置 HTTP_PROXYHTTPS_PROXYNO_PROXY 变量。oc CLI 会使用这些环境变量以便所有与集群的通信都通过 HTTP 代理进行。

流程

  1. 输入 oc login 命令并传递用户名:

    $ oc login -u user1
  2. 提示时,请输入所需信息:

    输出示例

    Server [https://localhost:8443]: https://openshift.example.com:6443 1
    The server uses a certificate signed by an unknown authority.
    You can bypass the certificate check, but any data you send to the server could be intercepted by others.
    Use insecure connections? (y/n): y 2
    
    Authentication required for https://openshift.example.com:6443 (openshift)
    Username: user1
    Password: 3
    Login successful.
    
    You don't have any projects. You can try to create a new project, by running
    
        oc new-project <projectname>
    
    Welcome! See 'oc help' to get started.

    1
    输入 OpenShift Container Platform 服务器的 URL。
    2
    输入是否使用不安全的连接。
    3
    输入用户密码。
注意

如果登录到 web 控制台,您可以生成包含令牌和服务器信息的 oc login 命令。您可以使用 命令来登录 OpenShift Container Platform CLI,而无需交互式提示。要生成 命令,请从 web 控制台右上角的用户名下拉菜单中选择 Copy login command

您现在可以创建项目或执行其他命令来管理集群。

1.1.4. 使用 OpenShift CLI

参阅以下部分以了解如何使用 CLI 完成常见任务。

1.1.4.1. 创建一个项目

使用oc new-project命令创建新项目。

$ oc new-project my-project

输出示例

Now using project "my-project" on server "https://openshift.example.com:6443".

1.1.4.2. 创建一个新的应用程序

使用oc new-app命令创建新应用程序。

$ oc new-app https://github.com/sclorg/cakephp-ex

输出示例

--> Found image 40de956 (9 days old) in imagestream "openshift/php" under tag "7.2" for "php"

...

    Run 'oc status' to view your app.

1.1.4.3. 查看 pod

使用oc get pods命令查看当前项目的 pod。

$ oc get pods -o wide

输出示例

NAME                  READY   STATUS      RESTARTS   AGE     IP            NODE                           NOMINATED NODE
cakephp-ex-1-build    0/1     Completed   0          5m45s   10.131.0.10   ip-10-0-141-74.ec2.internal    <none>
cakephp-ex-1-deploy   0/1     Completed   0          3m44s   10.129.2.9    ip-10-0-147-65.ec2.internal    <none>
cakephp-ex-1-ktz97    1/1     Running     0          3m33s   10.128.2.11   ip-10-0-168-105.ec2.internal   <none>

1.1.4.4. 查看 pod 日志

使用oc logs命令查看特定 pod 的日志。

$ oc logs cakephp-ex-1-deploy

输出示例

--> Scaling cakephp-ex-1 to 1
--> Success

1.1.4.5. 查看当前项目

使用oc project命令查看当前项目。

$ oc project

输出示例

Using project "my-project" on server "https://openshift.example.com:6443".

1.1.4.6. 查看当前项目的状态

使用 oc status 命令查看有关当前项目的信息,如服务、部署和构建配置。

$ oc status

输出示例

In project my-project on server https://openshift.example.com:6443

svc/cakephp-ex - 172.30.236.80 ports 8080, 8443
  dc/cakephp-ex deploys istag/cakephp-ex:latest <-
    bc/cakephp-ex source builds https://github.com/sclorg/cakephp-ex on openshift/php:7.2
    deployment #1 deployed 2 minutes ago - 1 pod

3 infos identified, use 'oc status --suggest' to see details.

1.1.4.7. 列出支持的 API 资源

使用oc api-resources命令查看服务器上支持的 API 资源列表。

$ oc api-resources

输出示例

NAME                                  SHORTNAMES       APIGROUP                              NAMESPACED   KIND
bindings                                                                                     true         Binding
componentstatuses                     cs                                                     false        ComponentStatus
configmaps                            cm                                                     true         ConfigMap
...

1.1.5. 获得帮助

您可以通过以下方式获得有关 CLI 命令和 OpenShift Container Platform 资源的帮助信息。

  • 使用oc help获取所有可用 CLI 命令的列表和描述:

    示例:获取 CLI 的常规帮助信息

    $ oc help

    输出示例

    OpenShift Client
    
    This client helps you develop, build, deploy, and run your applications on any OpenShift or Kubernetes compatible
    platform. It also includes the administrative commands for managing a cluster under the 'adm' subcommand.
    
    Usage:
      oc [flags]
    
    Basic Commands:
      login           Log in to a server
      new-project     Request a new project
      new-app         Create a new application
    
    ...

  • 使用--help标志获取有关特定CLI命令的帮助信息:

    示例:获取oc create命令的帮助信息

    $ oc create --help

    输出示例

    Create a resource by filename or stdin
    
    JSON and YAML formats are accepted.
    
    Usage:
      oc create -f FILENAME [flags]
    
    ...

  • 使用oc explain命令查看特定资源的描述信息和项信息:

    示例:查看 Pod 资源的文档

    $ oc explain pods

    输出示例

    KIND:     Pod
    VERSION:  v1
    
    DESCRIPTION:
         Pod is a collection of containers that can run on a host. This resource is
         created by clients and scheduled onto hosts.
    
    FIELDS:
       apiVersion	<string>
         APIVersion defines the versioned schema of this representation of an
         object. Servers should convert recognized schemas to the latest internal
         value, and may reject unrecognized values. More info:
         https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
    
    ...

1.1.6. 注销 OpenShift CLI

您可以注销 OpenShift CLI 以结束当前会话。

  • 使用oc logout命令。

    $ oc logout

    输出示例

    Logged "user1" out on "https://openshift.example.com"

这将从服务器中删除已保存的身份验证令牌,并将其从配置文件中删除。

1.2. 配置 OpenShift CLI

1.2.1. 启用 tab 自动完成功能

在安装oc CLI工具后,可以启用 tab 自动完成功能,以便在按 Tab 键时自动完成oc命令或显示建议选项。

先决条件

  • 已安装oc CLI工具。
  • 已安装软件包 bash-completion

流程

以下过程为 Bash 启用 tab 自动完成功能。

  1. 将Bash完成代码保存到一个文件中。

    $ oc completion bash > oc_bash_completion
  2. 将文件复制到/etc/bash_completion.d/

    $ sudo cp oc_bash_completion /etc/bash_completion.d/

    您也可以将文件保存到一个本地目录,并从您的.bashrc文件中 source 这个文件。

开新终端时 tab 自动完成功能将被启用。

1.3. 使用插件扩展 OpenShift CLI

您可以针对默认的oc命令编写并安装插件,从而可以使用OpenShift Container Platform CLI执行新的及更复杂的任务。

1.3.1. 编写CLI插件

您可以使用任何可以编写命令行命令的编程语言或脚本为OpenShift Container Platform CLI编写插件。请注意,您不能使用插件来覆盖现有的oc命令。

重要

OpenShift CLI插件目前是技术预览功能。技术预览功能不包括在红帽生产服务级别协议(SLA)中,且其功能可能并不完善。因此,红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关详细信息,请参阅红帽技术预览功能支持范围

流程

此过程创建一个简单的Bash插件,它的功能是在执行oc foo命令时将消息输出到终端。

  1. 创建一个名为oc-foo的文件。

    在命名插件文件时,请记住以下几点:

    • 文件必须以oc-kubectl-开始。
    • 文件名决定了调用这个插件的命令。例如,oc foo bar命令将会调用文件名为oc-foo-bar的插件。如果希望命令中包含破折号,也可以使用下划线。例如,可以通过oc foo-bar命令调用文件名为oc-foo_bar的插件。
  2. 将以下内容添加到该文件中。

    #!/bin/bash
    
    # optional argument handling
    if [[ "$1" == "version" ]]
    then
        echo "1.0.0"
        exit 0
    fi
    
    # optional argument handling
    if [[ "$1" == "config" ]]
    then
        echo $KUBECONFIG
        exit 0
    fi
    
    echo "I am a plugin named kubectl-foo"

为OpenShift Container Platform CLI安装此插件后,可以使用oc foo命令调用它。

其它资源

1.3.2. 安装和使用CLI插件

为OpenShift Container Platform CLI编写自定义插件后,必须安装它以使用它提供的功能。

重要

OpenShift CLI插件目前是技术预览功能。技术预览功能不包括在红帽生产服务级别协议(SLA)中,且其功能可能并不完善。因此,红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关详细信息,请参阅红帽技术预览功能支持范围

先决条件

  • 已安装oc CLI工具。
  • 有一个 CLI 插件文件,其文件名以 oc-kubectl-开始。

流程

  1. 将插件文件设置为可执行文件。

    $ chmod +x <plugin_file>
  2. 将文件放在PATH中的任何位置,例如/usr/local/bin/

    $ sudo mv <plugin_file> /usr/local/bin/.
  3. 运行 oc plugin list 以确认插件可以被列出。

    $ oc plugin list

    输出示例

    The following compatible plugins are available:
    
    /usr/local/bin/<plugin_file>

    如果您的插件没有被列出,检查文件是否以OC-kubectl-开始,是否可执行,并在您的PATH中。

  4. 调用插件引入的新命令或选项。

    例如,如果您从 Sample plug-in repository 构建并安装了 kubectl-ns 插件,则可以使用以下命令查看当前命名空间。

    $ oc ns

    请注意,调用插件的命令取决于插件的文件名。例如,文件名为 oc-foo-bar的插件会被 oc foo bar 命令调用。

1.4. OpenShift CLI 开发人员命令参考

本参考提供了 OpenShift CLI(oc)开发人员命令的描述和示例命令。有关管理员命令,请参阅 OpenShift CLI 管理员命令参考

运行 oc help 来列出所有命令或运行 oc <command> --help 获取特定命令的附加详情。

1.4.1. OpenShift CLI(oc)开发人员命令

1.4.1.1. oc annotate

更新资源上的注解

示例用法

  # Update pod 'foo' with the annotation 'description' and the value 'my frontend'.
  # If the same annotation is set multiple times, only the last value will be applied
  oc annotate pods foo description='my frontend'

  # Update a pod identified by type and name in "pod.json"
  oc annotate -f pod.json description='my frontend'

  # Update pod 'foo' with the annotation 'description' and the value 'my frontend running nginx', overwriting any existing value.
  oc annotate --overwrite pods foo description='my frontend running nginx'

  # Update all pods in the namespace
  oc annotate pods --all description='my frontend running nginx'

  # Update pod 'foo' only if the resource is unchanged from version 1.
  oc annotate pods foo description='my frontend running nginx' --resource-version=1

  # Update pod 'foo' by removing an annotation named 'description' if it exists.
  # Does not require the --overwrite flag.
  oc annotate pods foo description-

1.4.1.2. oc api-resources

在服务器上显示支持的 API 资源

示例用法

  # Print the supported API Resources
  oc api-resources

  # Print the supported API Resources with more information
  oc api-resources -o wide

  # Print the supported API Resources sorted by a column
  oc api-resources --sort-by=name

  # Print the supported namespaced resources
  oc api-resources --namespaced=true

  # Print the supported non-namespaced resources
  oc api-resources --namespaced=false

  # Print the supported API Resources with specific APIGroup
  oc api-resources --api-group=extensions

1.4.1.3. oc api-versions

以"group/version"的形式输出服务器上支持的 API 版本。

示例用法

  # Print the supported API versions
  oc api-versions

1.4.1.4. oc apply

按文件名或 stdin 将配置应用到资源

示例用法

  # Apply the configuration in pod.json to a pod.
  oc apply -f ./pod.json

  # Apply resources from a directory containing kustomization.yaml - e.g. dir/kustomization.yaml.
  oc apply -k dir/

  # Apply the JSON passed into stdin to a pod.
  cat pod.json | oc apply -f -

  # Note: --prune is still in Alpha
  # Apply the configuration in manifest.yaml that matches label app=nginx and delete all the other resources that are not in the file and match label app=nginx.
  oc apply --prune -f manifest.yaml -l app=nginx

  # Apply the configuration in manifest.yaml and delete all the other configmaps that are not in the file.
  oc apply --prune -f manifest.yaml --all --prune-whitelist=core/v1/ConfigMap

1.4.1.5. oc apply edit-last-applied

编辑资源/对象的最新 last-applied-configuration 注解

示例用法

  # Edit the last-applied-configuration annotations by type/name in YAML.
  oc apply edit-last-applied deployment/nginx

  # Edit the last-applied-configuration annotations by file in JSON.
  oc apply edit-last-applied -f deploy.yaml -o json

1.4.1.6. oc apply set-last-applied

设置 live 对象上的 last-applied-configuration 注释,以匹配文件的内容。

示例用法

  # Set the last-applied-configuration of a resource to match the contents of a file.
  oc apply set-last-applied -f deploy.yaml

  # Execute set-last-applied against each configuration file in a directory.
  oc apply set-last-applied -f path/

  # Set the last-applied-configuration of a resource to match the contents of a file, will create the annotation if it does not already exist.
  oc apply set-last-applied -f deploy.yaml --create-annotation=true

1.4.1.7. oc apply view-last-applied

查看资源/对象最新的最后应用配置注解

示例用法

  # View the last-applied-configuration annotations by type/name in YAML.
  oc apply view-last-applied deployment/nginx

  # View the last-applied-configuration annotations by file in JSON
  oc apply view-last-applied -f deploy.yaml -o json

1.4.1.8. oc attach

附加到正在运行的容器

示例用法

  # Get output from running pod mypod, use the oc.kubernetes.io/default-container annotation
  # for selecting the container to be attached or the first container in the pod will be chosen
  oc attach mypod

  # Get output from ruby-container from pod mypod
  oc attach mypod -c ruby-container

  # Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod mypod
  # and sends stdout/stderr from 'bash' back to the client
  oc attach mypod -c ruby-container -i -t

  # Get output from the first pod of a ReplicaSet named nginx
  oc attach rs/nginx

1.4.1.9. oc auth can-i

检查是否允许操作

示例用法

  # Check to see if I can create pods in any namespace
  oc auth can-i create pods --all-namespaces

  # Check to see if I can list deployments in my current namespace
  oc auth can-i list deployments.apps

  # Check to see if I can do everything in my current namespace ("*" means all)
  oc auth can-i '*' '*'

  # Check to see if I can get the job named "bar" in namespace "foo"
  oc auth can-i list jobs.batch/bar -n foo

  # Check to see if I can read pod logs
  oc auth can-i get pods --subresource=log

  # Check to see if I can access the URL /logs/
  oc auth can-i get /logs/

  # List all allowed actions in namespace "foo"
  oc auth can-i --list --namespace=foo

1.4.1.10. oc auth reconcile

协调 RBAC 角色、RoleBinding、ClusterRole 和 ClusterRoleBinding 对象的规则

示例用法

  # Reconcile rbac resources from a file
  oc auth reconcile -f my-rbac-rules.yaml

1.4.1.11. oc autoscale

自动缩放部署配置、部署、副本集、有状态集或复制控制器

示例用法

  # Auto scale a deployment "foo", with the number of pods between 2 and 10, no target CPU utilization specified so a default autoscaling policy will be used:
  oc autoscale deployment foo --min=2 --max=10

  # Auto scale a replication controller "foo", with the number of pods between 1 and 5, target CPU utilization at 80%:
  oc autoscale rc foo --max=5 --cpu-percent=80

1.4.1.12. oc cancel-build

取消正在运行、待处理或新的构建

示例用法

  # Cancel the build with the given name
  oc cancel-build ruby-build-2

  # Cancel the named build and print the build logs
  oc cancel-build ruby-build-2 --dump-logs

  # Cancel the named build and create a new one with the same parameters
  oc cancel-build ruby-build-2 --restart

  # Cancel multiple builds
  oc cancel-build ruby-build-1 ruby-build-2 ruby-build-3

  # Cancel all builds created from the 'ruby-build' build config that are in the 'new' state
  oc cancel-build bc/ruby-build --state=new

1.4.1.13. oc cluster-info

显示集群信息

示例用法

  # Print the address of the control plane and cluster services
  oc cluster-info

1.4.1.14. oc cluster-info dump

转储用于调试和诊断的大量相关信息

示例用法

  # Dump current cluster state to stdout
  oc cluster-info dump

  # Dump current cluster state to /path/to/cluster-state
  oc cluster-info dump --output-directory=/path/to/cluster-state

  # Dump all namespaces to stdout
  oc cluster-info dump --all-namespaces

  # Dump a set of namespaces to /path/to/cluster-state
  oc cluster-info dump --namespaces default,kube-system --output-directory=/path/to/cluster-state

1.4.1.15. oc completion

输出指定 shell 的 shell 完成代码(bash 或 zsh)

示例用法

  # Installing bash completion on macOS using homebrew
  ## If running Bash 3.2 included with macOS
  brew install bash-completion
  ## or, if running Bash 4.1+
  brew install bash-completion@2
  ## If oc is installed via homebrew, this should start working immediately.
  ## If you've installed via other means, you may need add the completion to your completion directory
  oc completion bash > $(brew --prefix)/etc/bash_completion.d/oc


  # Installing bash completion on Linux
  ## If bash-completion is not installed on Linux, please install the 'bash-completion' package
  ## via your distribution's package manager.
  ## Load the oc completion code for bash into the current shell
  source <(oc completion bash)
  ## Write bash completion code to a file and source it from .bash_profile
  oc completion bash > ~/.kube/completion.bash.inc
  printf "
  # Kubectl shell completion
  source '$HOME/.kube/completion.bash.inc'
  " >> $HOME/.bash_profile
  source $HOME/.bash_profile

  # Load the oc completion code for zsh[1] into the current shell
  source <(oc completion zsh)
  # Set the oc completion code for zsh[1] to autoload on startup
  oc completion zsh > "${fpath[1]}/_oc"

1.4.1.16. oc config current-context

显示当前上下文

示例用法

  # Display the current-context
  oc config current-context

1.4.1.17. oc config delete-cluster

从 kubeconfig 删除指定的集群

示例用法

  # Delete the minikube cluster
  oc config delete-cluster minikube

1.4.1.18. oc config delete-context

从 kubeconfig 删除指定的上下文

示例用法

  # Delete the context for the minikube cluster
  oc config delete-context minikube

1.4.1.19. oc config delete-user

从 kubeconfig 删除指定用户

示例用法

  # Delete the minikube user
  oc config delete-user minikube

1.4.1.20. oc config get-clusters

显示 kubeconfig 中定义的集群

示例用法

  # List the clusters oc knows about
  oc config get-clusters

1.4.1.21. oc config get-contexts

描述一个或多个上下文

示例用法

  # List all the contexts in your kubeconfig file
  oc config get-contexts

  # Describe one context in your kubeconfig file.
  oc config get-contexts my-context

1.4.1.22. oc config get-users

显示 kubeconfig 中定义的用户

示例用法

  # List the users oc knows about
  oc config get-users

1.4.1.23. oc config rename-context

从 kubeconfig 文件中重命名上下文。

示例用法

  # Rename the context 'old-name' to 'new-name' in your kubeconfig file
  oc config rename-context old-name new-name

1.4.1.24. oc config set

在 kubeconfig 文件中设置单个值

示例用法

  # Set server field on the my-cluster cluster to https://1.2.3.4
  oc config set clusters.my-cluster.server https://1.2.3.4

  # Set certificate-authority-data field on the my-cluster cluster.
  oc config set clusters.my-cluster.certificate-authority-data $(echo "cert_data_here" | base64 -i -)

  # Set cluster field in the my-context context to my-cluster.
  oc config set contexts.my-context.cluster my-cluster

  # Set client-key-data field in the cluster-admin user using --set-raw-bytes option.
  oc config set users.cluster-admin.client-key-data cert_data_here --set-raw-bytes=true

1.4.1.25. oc config set-cluster

在 kubeconfig 中设置集群条目

示例用法

  # Set only the server field on the e2e cluster entry without touching other values.
  oc config set-cluster e2e --server=https://1.2.3.4

  # Embed certificate authority data for the e2e cluster entry
  oc config set-cluster e2e --embed-certs --certificate-authority=~/.kube/e2e/kubernetes.ca.crt

  # Disable cert checking for the dev cluster entry
  oc config set-cluster e2e --insecure-skip-tls-verify=true

  # Set custom TLS server name to use for validation for the e2e cluster entry
  oc config set-cluster e2e --tls-server-name=my-cluster-name

1.4.1.26. oc config set-context

在 kubeconfig 中设置上下文条目

示例用法

  # Set the user field on the gce context entry without touching other values
  oc config set-context gce --user=cluster-admin

1.4.1.27. oc config set-credentials

在 kubeconfig 中设置用户条目

示例用法

  # Set only the "client-key" field on the "cluster-admin"
  # entry, without touching other values:
  oc config set-credentials cluster-admin --client-key=~/.kube/admin.key

  # Set basic auth for the "cluster-admin" entry
  oc config set-credentials cluster-admin --username=admin --password=uXFGweU9l35qcif

  # Embed client certificate data in the "cluster-admin" entry
  oc config set-credentials cluster-admin --client-certificate=~/.kube/admin.crt --embed-certs=true

  # Enable the Google Compute Platform auth provider for the "cluster-admin" entry
  oc config set-credentials cluster-admin --auth-provider=gcp

  # Enable the OpenID Connect auth provider for the "cluster-admin" entry with additional args
  oc config set-credentials cluster-admin --auth-provider=oidc --auth-provider-arg=client-id=foo --auth-provider-arg=client-secret=bar

  # Remove the "client-secret" config value for the OpenID Connect auth provider for the "cluster-admin" entry
  oc config set-credentials cluster-admin --auth-provider=oidc --auth-provider-arg=client-secret-

  # Enable new exec auth plugin for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-command=/path/to/the/executable --exec-api-version=client.authentication.k8s.io/v1beta1

  # Define new exec auth plugin args for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-arg=arg1 --exec-arg=arg2

  # Create or update exec auth plugin environment variables for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-env=key1=val1 --exec-env=key2=val2

  # Remove exec auth plugin environment variables for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-env=var-to-remove-

1.4.1.28. oc config unset

在 kubeconfig 文件中取消设置单个值

示例用法

  # Unset the current-context.
  oc config unset current-context

  # Unset namespace in foo context.
  oc config unset contexts.foo.namespace

1.4.1.29. oc config use-context

在 kubeconfig 文件中设置当前上下文

示例用法

  # Use the context for the minikube cluster
  oc config use-context minikube

1.4.1.30. oc config view

显示合并的 kubeconfig 设置或指定的 kubeconfig 文件

示例用法

  # Show merged kubeconfig settings.
  oc config view

  # Show merged kubeconfig settings and raw certificate data.
  oc config view --raw

  # Get the password for the e2e user
  oc config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

1.4.1.31. oc cp

将文件和目录复制到容器或从容器中复制。

示例用法

  # !!!Important Note!!!
  # Requires that the 'tar' binary is present in your container
  # image.  If 'tar' is not present, 'oc cp' will fail.
  #
  # For advanced use cases, such as symlinks, wildcard expansion or
  # file mode preservation consider using 'oc exec'.

  # Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace>
  tar cf - /tmp/foo | oc exec -i -n <some-namespace> <some-pod> -- tar xf - -C /tmp/bar

  # Copy /tmp/foo from a remote pod to /tmp/bar locally
  oc exec -n <some-namespace> <some-pod> -- tar cf - /tmp/foo | tar xf - -C /tmp/bar

  # Copy /tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace
  oc cp /tmp/foo_dir <some-pod>:/tmp/bar_dir

  # Copy /tmp/foo local file to /tmp/bar in a remote pod in a specific container
  oc cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>

  # Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace>
  oc cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar

  # Copy /tmp/foo from a remote pod to /tmp/bar locally
  oc cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar

1.4.1.32. oc create

从文件或 stdin 创建资源。

示例用法

  # Create a pod using the data in pod.json.
  oc create -f ./pod.json

  # Create a pod based on the JSON passed into stdin.
  cat pod.json | oc create -f -

  # Edit the data in docker-registry.yaml in JSON then create the resource using the edited data.
  oc create -f docker-registry.yaml --edit -o json

1.4.1.33. oc create build

创建一个新构建

示例用法

  # Create a new build
  oc create build myapp

1.4.1.34. oc create clusterresourcequota

创建集群资源配额

示例用法

  # Create a cluster resource quota limited to 10 pods
  oc create clusterresourcequota limit-bob --project-annotation-selector=openshift.io/requester=user-bob --hard=pods=10

1.4.1.35. oc create clusterrole

创建 ClusterRole。

示例用法

  # Create a ClusterRole named "pod-reader" that allows user to perform "get", "watch" and "list" on pods
  oc create clusterrole pod-reader --verb=get,list,watch --resource=pods

  # Create a ClusterRole named "pod-reader" with ResourceName specified
  oc create clusterrole pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod

  # Create a ClusterRole named "foo" with API Group specified
  oc create clusterrole foo --verb=get,list,watch --resource=rs.extensions

  # Create a ClusterRole named "foo" with SubResource specified
  oc create clusterrole foo --verb=get,list,watch --resource=pods,pods/status

  # Create a ClusterRole name "foo" with NonResourceURL specified
  oc create clusterrole "foo" --verb=get --non-resource-url=/logs/*

  # Create a ClusterRole name "monitoring" with AggregationRule specified
  oc create clusterrole monitoring --aggregation-rule="rbac.example.com/aggregate-to-monitoring=true"

1.4.1.36. oc create clusterrolebinding

为特定 ClusterRole 创建 ClusterRoleBinding

示例用法

  # Create a ClusterRoleBinding for user1, user2, and group1 using the cluster-admin ClusterRole
  oc create clusterrolebinding cluster-admin --clusterrole=cluster-admin --user=user1 --user=user2 --group=group1

1.4.1.37. oc create configmap

从本地文件、目录或字面值创建 configmap

示例用法

  # Create a new configmap named my-config based on folder bar
  oc create configmap my-config --from-file=path/to/bar

  # Create a new configmap named my-config with specified keys instead of file basenames on disk
  oc create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt

  # Create a new configmap named my-config with key1=config1 and key2=config2
  oc create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

  # Create a new configmap named my-config from the key=value pairs in the file
  oc create configmap my-config --from-file=path/to/bar

  # Create a new configmap named my-config from an env file
  oc create configmap my-config --from-env-file=path/to/bar.env

1.4.1.38. oc create cronjob

使用指定名称创建一个 cronjob。

示例用法

  # Create a cronjob
  oc create cronjob my-job --image=busybox --schedule="*/1 * * * *"

  # Create a cronjob with command
  oc create cronjob my-job --image=busybox --schedule="*/1 * * * *" -- date

1.4.1.39. oc create deployment

使用指定名称创建部署。

示例用法

  # Create a deployment named my-dep that runs the busybox image.
  oc create deployment my-dep --image=busybox

  # Create a deployment with command
  oc create deployment my-dep --image=busybox -- date

  # Create a deployment named my-dep that runs the nginx image with 3 replicas.
  oc create deployment my-dep --image=nginx --replicas=3

  # Create a deployment named my-dep that runs the busybox image and expose port 5701.
  oc create deployment my-dep --image=busybox --port=5701

1.4.1.40. oc create deploymentconfig

使用给定镜像的默认选项创建部署配置

示例用法

  # Create an nginx deployment config named my-nginx
  oc create deploymentconfig my-nginx --image=nginx

1.4.1.41. oc create identity

手动创建身份(仅在禁用自动创建时才需要)

示例用法

  # Create an identity with identity provider "acme_ldap" and the identity provider username "adamjones"
  oc create identity acme_ldap:adamjones

1.4.1.42. oc create imagestream

创建新的空镜像流

示例用法

  # Create a new image stream
  oc create imagestream mysql

1.4.1.43. oc create imagestreamtag

创建新镜像流标签

示例用法

  # Create a new image stream tag based on an image in a remote registry
  oc create imagestreamtag mysql:latest --from-image=myregistry.local/mysql/mysql:5.0

1.4.1.44. oc create ingress

使用指定名称创建一个入口。

示例用法

  # Create a single ingress called 'simple' that directs requests to foo.com/bar to svc
  # svc1:8080 with a tls secret "my-cert"
  oc create ingress simple --rule="foo.com/bar=svc1:8080,tls=my-cert"

  # Create a catch all ingress of "/path" pointing to service svc:port and Ingress Class as "otheringress"
  oc create ingress catch-all --class=otheringress --rule="/path=svc:port"

  # Create an ingress with two annotations: ingress.annotation1 and ingress.annotations2
  oc create ingress annotated --class=default --rule="foo.com/bar=svc:port" \
  --annotation ingress.annotation1=foo \
  --annotation ingress.annotation2=bla

  # Create an ingress with the same host and multiple paths
  oc create ingress multipath --class=default \
  --rule="foo.com/=svc:port" \
  --rule="foo.com/admin/=svcadmin:portadmin"

  # Create an ingress with multiple hosts and the pathType as Prefix
  oc create ingress ingress1 --class=default \
  --rule="foo.com/path*=svc:8080" \
  --rule="bar.com/admin*=svc2:http"

  # Create an ingress with TLS enabled using the default ingress certificate and different path types
  oc create ingress ingtls --class=default \
  --rule="foo.com/=svc:https,tls" \
  --rule="foo.com/path/subpath*=othersvc:8080"

  # Create an ingress with TLS enabled using a specific secret and pathType as Prefix
  oc create ingress ingsecret --class=default \
  --rule="foo.com/*=svc:8080,tls=secret1"

  # Create an ingress with a default backend
  oc create ingress ingdefault --class=default \
  --default-backend=defaultsvc:http \
  --rule="foo.com/*=svc:8080,tls=secret1"

1.4.1.45. oc create job

使用指定名称创建作业。

示例用法

  # Create a job
  oc create job my-job --image=busybox

  # Create a job with command
  oc create job my-job --image=busybox -- date

  # Create a job from a CronJob named "a-cronjob"
  oc create job test-job --from=cronjob/a-cronjob

1.4.1.46. oc create namespace

使用指定名称创建命名空间

示例用法

  # Create a new namespace named my-namespace
  oc create namespace my-namespace

1.4.1.47. oc create poddisruptionBudget

使用指定名称创建 pod 中断预算。

示例用法

  # Create a pod disruption budget named my-pdb that will select all pods with the app=rails label
  # and require at least one of them being available at any point in time.
  oc create poddisruptionbudget my-pdb --selector=app=rails --min-available=1

  # Create a pod disruption budget named my-pdb that will select all pods with the app=nginx label
  # and require at least half of the pods selected to be available at any point in time.
  oc create pdb my-pdb --selector=app=nginx --min-available=50%

1.4.1.48. oc create priorityclass

使用指定名称创建一个优先级类。

示例用法

  # Create a priorityclass named high-priority
  oc create priorityclass high-priority --value=1000 --description="high priority"

  # Create a priorityclass named default-priority that considered as the global default priority
  oc create priorityclass default-priority --value=1000 --global-default=true --description="default priority"

  # Create a priorityclass named high-priority that can not preempt pods with lower priority
  oc create priorityclass high-priority --value=1000 --description="high priority" --preemption-policy="Never"

1.4.1.49. oc create quota

使用指定名称创建配额。

示例用法

  # Create a new resourcequota named my-quota
  oc create quota my-quota --hard=cpu=1,memory=1G,pods=2,services=3,replicationcontrollers=2,resourcequotas=1,secrets=5,persistentvolumeclaims=10

  # Create a new resourcequota named best-effort
  oc create quota best-effort --hard=pods=100 --scopes=BestEffort

1.4.1.50. oc create role

使用一条规则创建角色。

示例用法

  # Create a Role named "pod-reader" that allows user to perform "get", "watch" and "list" on pods
  oc create role pod-reader --verb=get --verb=list --verb=watch --resource=pods

  # Create a Role named "pod-reader" with ResourceName specified
  oc create role pod-reader --verb=get --resource=pods --resource-name=readablepod --resource-name=anotherpod

  # Create a Role named "foo" with API Group specified
  oc create role foo --verb=get,list,watch --resource=rs.extensions

  # Create a Role named "foo" with SubResource specified
  oc create role foo --verb=get,list,watch --resource=pods,pods/status

1.4.1.51. oc create rolebinding

为特定角色或 ClusterRole 创建 RoleBinding

示例用法

  # Create a RoleBinding for user1, user2, and group1 using the admin ClusterRole
  oc create rolebinding admin --clusterrole=admin --user=user1 --user=user2 --group=group1

1.4.1.52. oc create route edge

创建使用边缘 TLS 终止的路由

示例用法

  # Create an edge route named "my-route" that exposes the frontend service
  oc create route edge my-route --service=frontend

  # Create an edge route that exposes the frontend service and specify a path
  # If the route name is omitted, the service name will be used
  oc create route edge --service=frontend --path /assets

1.4.1.53. oc create route passthrough

创建使用 passthrough TLS 终止的路由

示例用法

  # Create a passthrough route named "my-route" that exposes the frontend service
  oc create route passthrough my-route --service=frontend

  # Create a passthrough route that exposes the frontend service and specify
  # a host name. If the route name is omitted, the service name will be used
  oc create route passthrough --service=frontend --hostname=www.example.com

1.4.1.54. oc create route reencrypt

创建使用重新加密 TLS 终止的路由

示例用法

  # Create a route named "my-route" that exposes the frontend service
  oc create route reencrypt my-route --service=frontend --dest-ca-cert cert.cert

  # Create a reencrypt route that exposes the frontend service, letting the
  # route name default to the service name and the destination CA certificate
  # default to the service CA
  oc create route reencrypt --service=frontend

1.4.1.55. oc create secret docker-registry

创建用于 Docker registry 的 secret

示例用法

  # If you don't already have a .dockercfg file, you can create a dockercfg secret directly by using:
  oc create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

  # Create a new secret named my-secret from ~/.docker/config.json
  oc create secret docker-registry my-secret --from-file=.dockerconfigjson=path/to/.docker/config.json

1.4.1.56. oc create secret generic

从本地文件、目录或实际的值创建 secret

示例用法

  # Create a new secret named my-secret with keys for each file in folder bar
  oc create secret generic my-secret --from-file=path/to/bar

  # Create a new secret named my-secret with specified keys instead of names on disk
  oc create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-file=ssh-publickey=path/to/id_rsa.pub

  # Create a new secret named my-secret with key1=supersecret and key2=topsecret
  oc create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret

  # Create a new secret named my-secret using a combination of a file and a literal
  oc create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-literal=passphrase=topsecret

  # Create a new secret named my-secret from an env file
  oc create secret generic my-secret --from-env-file=path/to/bar.env

1.4.1.57. oc create secret tls

创建 TLS secret

示例用法

  # Create a new TLS secret named tls-secret with the given key pair:
  oc create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.key

1.4.1.58. oc create service clusterip

创建 ClusterIP 服务。

示例用法

  # Create a new ClusterIP service named my-cs
  oc create service clusterip my-cs --tcp=5678:8080

  # Create a new ClusterIP service named my-cs (in headless mode)
  oc create service clusterip my-cs --clusterip="None"

1.4.1.59. oc create service externalname

创建 ExternalName 服务。

示例用法

  # Create a new ExternalName service named my-ns
  oc create service externalname my-ns --external-name bar.com

1.4.1.60. oc create service loadbalancer

创建 LoadBalancer 服务。

示例用法

  # Create a new LoadBalancer service named my-lbs
  oc create service loadbalancer my-lbs --tcp=5678:8080

1.4.1.61. oc create service nodeport

创建 NodePort 服务。

示例用法

  # Create a new NodePort service named my-ns
  oc create service nodeport my-ns --tcp=5678:8080

1.4.1.62. oc create serviceaccount

使用指定名称创建服务帐户

示例用法

  # Create a new service account named my-service-account
  oc create serviceaccount my-service-account

1.4.1.63. oc create user

手动创建用户(仅在禁用自动创建时才需要)

示例用法

  # Create a user with the username "ajones" and the display name "Adam Jones"
  oc create user ajones --full-name="Adam Jones"

1.4.1.64. oc create useridentitymapping

手动将身份映射到用户

示例用法

  # Map the identity "acme_ldap:adamjones" to the user "ajones"
  oc create useridentitymapping acme_ldap:adamjones ajones

1.4.1.65. oc debug

启动用于调试的 pod 的新实例

示例用法

  # Start a shell session into a pod using the OpenShift tools image
  oc debug

  # Debug a currently running deployment by creating a new pod
  oc debug deploy/test

  # Debug a node as an administrator
  oc debug node/master-1

  # Launch a shell in a pod using the provided image stream tag
  oc debug istag/mysql:latest -n openshift

  # Test running a job as a non-root user
  oc debug job/test --as-user=1000000

  # Debug a specific failing container by running the env command in the 'second' container
  oc debug daemonset/test -c second -- /bin/env

  # See the pod that would be created to debug
  oc debug mypod-9xbc -o yaml

  # Debug a resource but launch the debug pod in another namespace
  # Note: Not all resources can be debugged using --to-namespace without modification. For example,
  # volumes and service accounts are namespace-dependent. Add '-o yaml' to output the debug pod definition
  # to disk.  If necessary, edit the definition then run 'oc debug -f -' or run without --to-namespace
  oc debug mypod-9xbc --to-namespace testns

1.4.1.66. oc delete

通过文件名、stdin、资源和名称删除资源,或者按资源和标签选择器删除资源

示例用法

  # Delete a pod using the type and name specified in pod.json.
  oc delete -f ./pod.json

  # Delete resources from a directory containing kustomization.yaml - e.g. dir/kustomization.yaml.
  oc delete -k dir

  # Delete a pod based on the type and name in the JSON passed into stdin.
  cat pod.json | oc delete -f -

  # Delete pods and services with same names "baz" and "foo"
  oc delete pod,service baz foo

  # Delete pods and services with label name=myLabel.
  oc delete pods,services -l name=myLabel

  # Delete a pod with minimal delay
  oc delete pod foo --now

  # Force delete a pod on a dead node
  oc delete pod foo --force

  # Delete all pods
  oc delete pods --all

1.4.1.67. oc describe

显示特定资源或一组资源的详情

示例用法

  # Describe a node
  oc describe nodes kubernetes-node-emt8.c.myproject.internal

  # Describe a pod
  oc describe pods/nginx

  # Describe a pod identified by type and name in "pod.json"
  oc describe -f pod.json

  # Describe all pods
  oc describe pods

  # Describe pods by label name=myLabel
  oc describe po -l name=myLabel

  # Describe all pods managed by the 'frontend' replication controller (rc-created pods
  # get the name of the rc as a prefix in the pod the name).
  oc describe pods frontend

1.4.1.68. oc diff

针对 would-be 应用版本的 diff live version

示例用法

  # Diff resources included in pod.json.
  oc diff -f pod.json

  # Diff file read from stdin
  cat service.yaml | oc diff -f -

1.4.1.69. oc edit

编辑服务器上的资源

示例用法

  # Edit the service named 'docker-registry':
  oc edit svc/docker-registry

  # Use an alternative editor
  KUBE_EDITOR="nano" oc edit svc/docker-registry

  # Edit the job 'myjob' in JSON using the v1 API format:
  oc edit job.v1.batch/myjob -o json

  # Edit the deployment 'mydeployment' in YAML and save the modified config in its annotation:
  oc edit deployment/mydeployment -o yaml --save-config

1.4.1.70. oc ex dockergc

执行垃圾回收以释放 docker 存储中的空间

示例用法

  # Perform garbage collection with the default settings
  oc ex dockergc

1.4.1.71. oc exec

在容器中执行命令

示例用法

  # Get output from running 'date' command from pod mypod, using the first container by default
  oc exec mypod -- date

  # Get output from running 'date' command in ruby-container from pod mypod
  oc exec mypod -c ruby-container -- date

  # Switch to raw terminal mode, sends stdin to 'bash' in ruby-container from pod mypod
  # and sends stdout/stderr from 'bash' back to the client
  oc exec mypod -c ruby-container -i -t -- bash -il

  # List contents of /usr from the first container of pod mypod and sort by modification time.
  # If the command you want to execute in the pod has any flags in common (e.g. -i),
  # you must use two dashes (--) to separate your command's flags/arguments.
  # Also note, do not surround your command and its flags/arguments with quotes
  # unless that is how you would execute it normally (i.e., do ls -t /usr, not "ls -t /usr").
  oc exec mypod -i -t -- ls -t /usr

  # Get output from running 'date' command from the first pod of the deployment mydeployment, using the first container by default
  oc exec deploy/mydeployment -- date

  # Get output from running 'date' command from the first pod of the service myservice, using the first container by default
  oc exec svc/myservice -- date

1.4.1.72. oc explain

资源文档

示例用法

  # Get the documentation of the resource and its fields
  oc explain pods

  # Get the documentation of a specific field of a resource
  oc explain pods.spec.containers

1.4.1.73. oc expose

将复制的应用程序作为服务或路由公开

示例用法

  # Create a route based on service nginx. The new route will reuse nginx's labels
  oc expose service nginx

  # Create a route and specify your own label and route name
  oc expose service nginx -l name=myroute --name=fromdowntown

  # Create a route and specify a host name
  oc expose service nginx --hostname=www.example.com

  # Create a route with a wildcard
  oc expose service nginx --hostname=x.example.com --wildcard-policy=Subdomain
  # This would be equivalent to *.example.com. NOTE: only hosts are matched by the wildcard; subdomains would not be included

  # Expose a deployment configuration as a service and use the specified port
  oc expose dc ruby-hello-world --port=8080

  # Expose a service as a route in the specified path
  oc expose service nginx --path=/nginx

  # Expose a service using different generators
  oc expose service nginx --name=exposed-svc --port=12201 --protocol="TCP" --generator="service/v2"
  oc expose service nginx --name=my-route --port=12201 --generator="route/v1"

  # Exposing a service using the "route/v1" generator (default) will create a new exposed route with the "--name" provided
  # (or the name of the service otherwise). You may not specify a "--protocol" or "--target-port" option when using this generator

1.4.1.74. oc extract

将 secret 或配置映射提取到磁盘

示例用法

  # Extract the secret "test" to the current directory
  oc extract secret/test

  # Extract the config map "nginx" to the /tmp directory
  oc extract configmap/nginx --to=/tmp

  # Extract the config map "nginx" to STDOUT
  oc extract configmap/nginx --to=-

  # Extract only the key "nginx.conf" from config map "nginx" to the /tmp directory
  oc extract configmap/nginx --to=/tmp --keys=nginx.conf

1.4.1.75. oc get

显示一个或多个资源

示例用法

  # List all pods in ps output format.
  oc get pods

  # List all pods in ps output format with more information (such as node name).
  oc get pods -o wide

  # List a single replication controller with specified NAME in ps output format.
  oc get replicationcontroller web

  # List deployments in JSON output format, in the "v1" version of the "apps" API group:
  oc get deployments.v1.apps -o json

  # List a single pod in JSON output format.
  oc get -o json pod web-pod-13je7

  # List a pod identified by type and name specified in "pod.yaml" in JSON output format.
  oc get -f pod.yaml -o json

  # List resources from a directory with kustomization.yaml - e.g. dir/kustomization.yaml.
  oc get -k dir/

  # Return only the phase value of the specified pod.
  oc get -o template pod/web-pod-13je7 --template={{.status.phase}}

  # List resource information in custom columns.
  oc get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image

  # List all replication controllers and services together in ps output format.
  oc get rc,services

  # List one or more resources by their type and names.
  oc get rc/web service/frontend pods/web-pod-13je7

1.4.1.76. oc idle

闲置可扩展资源

示例用法

  # Idle the scalable controllers associated with the services listed in to-idle.txt
  $ oc idle --resource-names-file to-idle.txt

1.4.1.77. oc image append

向镜像添加层并将其推送到 registry

示例用法

  # Remove the entrypoint on the mysql:latest image
  oc image append --from mysql:latest --to myregistry.com/myimage:latest --image '{"Entrypoint":null}'

  # Add a new layer to the image
  oc image append --from mysql:latest --to myregistry.com/myimage:latest layer.tar.gz

  # Add a new layer to the image and store the result on disk
  # This results in $(pwd)/v2/mysql/blobs,manifests
  oc image append --from mysql:latest --to file://mysql:local layer.tar.gz

  # Add a new layer to the image and store the result on disk in a designated directory
  # This will result in $(pwd)/mysql-local/v2/mysql/blobs,manifests
  oc image append --from mysql:latest --to file://mysql:local --dir mysql-local layer.tar.gz

  # Add a new layer to an image that is stored on disk (~/mysql-local/v2/image exists)
  oc image append --from-dir ~/mysql-local --to myregistry.com/myimage:latest layer.tar.gz

  # Add a new layer to an image that was mirrored to the current directory on disk ($(pwd)/v2/image exists)
  oc image append --from-dir v2 --to myregistry.com/myimage:latest layer.tar.gz

  # Add a new layer to a multi-architecture image for an os/arch that is different from the system's os/arch
  # Note: Wildcard filter is not supported with append. Pass a single os/arch to append
  oc image append --from docker.io/library/busybox:latest --filter-by-os=linux/s390x --to myregistry.com/myimage:latest layer.tar.gz

1.4.1.78. oc image extract

将文件从镜像复制到文件系统

示例用法

  # Extract the busybox image into the current directory
  oc image extract docker.io/library/busybox:latest

  # Extract the busybox image into a designated directory (must exist)
  oc image extract docker.io/library/busybox:latest --path /:/tmp/busybox

  # Extract the busybox image into the current directory for linux/s390x platform
  # Note: Wildcard filter is not supported with extract. Pass a single os/arch to extract
  oc image extract docker.io/library/busybox:latest --filter-by-os=linux/s390x

  # Extract a single file from the image into the current directory
  oc image extract docker.io/library/centos:7 --path /bin/bash:.

  # Extract all .repo files from the image's /etc/yum.repos.d/ folder into the current directory
  oc image extract docker.io/library/centos:7 --path /etc/yum.repos.d/*.repo:.

  # Extract all .repo files from the image's /etc/yum.repos.d/ folder into a designated directory (must exist)
  # This results in /tmp/yum.repos.d/*.repo on local system
  oc image extract docker.io/library/centos:7 --path /etc/yum.repos.d/*.repo:/tmp/yum.repos.d

  # Extract an image stored on disk into the current directory ($(pwd)/v2/busybox/blobs,manifests exists)
  # --confirm is required because the current directory is not empty
  oc image extract file://busybox:local --confirm

  # Extract an image stored on disk in a directory other than $(pwd)/v2 into the current directory
  # --confirm is required because the current directory is not empty ($(pwd)/busybox-mirror-dir/v2/busybox exists)
  oc image extract file://busybox:local --dir busybox-mirror-dir --confirm

  # Extract an image stored on disk in a directory other than $(pwd)/v2 into a designated directory (must exist)
  oc image extract file://busybox:local --dir busybox-mirror-dir --path /:/tmp/busybox

  # Extract the last layer in the image
  oc image extract docker.io/library/centos:7[-1]

  # Extract the first three layers of the image
  oc image extract docker.io/library/centos:7[:3]

  # Extract the last three layers of the image
  oc image extract docker.io/library/centos:7[-3:]

1.4.1.79. oc image info

显示镜像的信息

示例用法

  # Show information about an image
  oc image info quay.io/openshift/cli:latest

  # Show information about images matching a wildcard
  oc image info quay.io/openshift/cli:4.*

  # Show information about a file mirrored to disk under DIR
  oc image info --dir=DIR file://library/busybox:latest

  # Select which image from a multi-OS image to show
  oc image info library/busybox:latest --filter-by-os=linux/arm64

1.4.1.80. oc image mirror

将镜像从一个存储库镜像到另一个存储库

示例用法

  # Copy image to another tag
  oc image mirror myregistry.com/myimage:latest myregistry.com/myimage:stable

  # Copy image to another registry
  oc image mirror myregistry.com/myimage:latest docker.io/myrepository/myimage:stable

  # Copy all tags starting with mysql to the destination repository
  oc image mirror myregistry.com/myimage:mysql* docker.io/myrepository/myimage

  # Copy image to disk, creating a directory structure that can be served as a registry
  oc image mirror myregistry.com/myimage:latest file://myrepository/myimage:latest

  # Copy image to S3 (pull from <bucket>.s3.amazonaws.com/image:latest)
  oc image mirror myregistry.com/myimage:latest s3://s3.amazonaws.com/<region>/<bucket>/image:latest

  # Copy image to S3 without setting a tag (pull via @<digest>)
  oc image mirror myregistry.com/myimage:latest s3://s3.amazonaws.com/<region>/<bucket>/image

  # Copy image to multiple locations
  oc image mirror myregistry.com/myimage:latest docker.io/myrepository/myimage:stable \
  docker.io/myrepository/myimage:dev

  # Copy multiple images
  oc image mirror myregistry.com/myimage:latest=myregistry.com/other:test \
  myregistry.com/myimage:new=myregistry.com/other:target

  # Copy manifest list of a multi-architecture image, even if only a single image is found
  oc image mirror myregistry.com/myimage:latest=myregistry.com/other:test \
  --keep-manifest-list=true

  # Copy specific os/arch manifest of a multi-architecture image
  # Run 'oc image info myregistry.com/myimage:latest' to see available os/arch for multi-arch images
  # Note that with multi-arch images, this results in a new manifest list digest that includes only
  # the filtered manifests
  oc image mirror myregistry.com/myimage:latest=myregistry.com/other:test \
  --filter-by-os=os/arch

  # Copy all os/arch manifests of a multi-architecture image
  # Run 'oc image info myregistry.com/myimage:latest' to see list of os/arch manifests that will be mirrored
  oc image mirror myregistry.com/myimage:latest=myregistry.com/other:test \
  --keep-manifest-list=true

  # Note the above command is equivalent to
  oc image mirror myregistry.com/myimage:latest=myregistry.com/other:test \
  --filter-by-os=.*

1.4.1.81. oc import-image

从容器镜像 registry 中导入镜像

示例用法

  # Import tag latest into a new image stream
  oc import-image mystream --from=registry.io/repo/image:latest --confirm

  # Update imported data for tag latest in an already existing image stream
  oc import-image mystream

  # Update imported data for tag stable in an already existing image stream
  oc import-image mystream:stable

  # Update imported data for all tags in an existing image stream
  oc import-image mystream --all

  # Import all tags into a new image stream
  oc import-image mystream --from=registry.io/repo/image --all --confirm

  # Import all tags into a new image stream using a custom timeout
  oc --request-timeout=5m import-image mystream --from=registry.io/repo/image --all --confirm

1.4.1.82. oc kustomize

从目录或 URL 构建 kustomization 目标。

示例用法

  # Build the current working directory
  oc kustomize

  # Build some shared configuration directory
  oc kustomize /home/config/production

  # Build from github
  oc kustomize https://github.com/kubernetes-sigs/kustomize.git/examples/helloWorld?ref=v1.0.6

1.4.1.83. oc label

更新资源上的标签

示例用法

  # Update pod 'foo' with the label 'unhealthy' and the value 'true'.
  oc label pods foo unhealthy=true

  # Update pod 'foo' with the label 'status' and the value 'unhealthy', overwriting any existing value.
  oc label --overwrite pods foo status=unhealthy

  # Update all pods in the namespace
  oc label pods --all status=unhealthy

  # Update a pod identified by the type and name in "pod.json"
  oc label -f pod.json status=unhealthy

  # Update pod 'foo' only if the resource is unchanged from version 1.
  oc label pods foo status=unhealthy --resource-version=1

  # Update pod 'foo' by removing a label named 'bar' if it exists.
  # Does not require the --overwrite flag.
  oc label pods foo bar-

1.4.1.84. oc login

登录到服务器

示例用法

  # Log in interactively
  oc login --username=myuser

  # Log in to the given server with the given certificate authority file
  oc login localhost:8443 --certificate-authority=/path/to/cert.crt

  # Log in to the given server with the given credentials (will not prompt interactively)
  oc login localhost:8443 --username=myuser --password=mypass

1.4.1.85. oc logout

结束当前服务器会话

示例用法

  # Log out
  oc logout

1.4.1.86. oc logs

显示 pod 中容器的日志

示例用法

  # Start streaming the logs of the most recent build of the openldap build config
  oc logs -f bc/openldap

  # Start streaming the logs of the latest deployment of the mysql deployment config
  oc logs -f dc/mysql

  # Get the logs of the first deployment for the mysql deployment config. Note that logs
  # from older deployments may not exist either because the deployment was successful
  # or due to deployment pruning or manual deletion of the deployment
  oc logs --version=1 dc/mysql

  # Return a snapshot of ruby-container logs from pod backend
  oc logs backend -c ruby-container

  # Start streaming of ruby-container logs from pod backend
  oc logs -f pod/backend -c ruby-container

1.4.1.87. oc new-app

创建新应用程序

示例用法

  # List all local templates and image streams that can be used to create an app
  oc new-app --list

  # Create an application based on the source code in the current git repository (with a public remote) and a Docker image
  oc new-app . --docker-image=registry/repo/langimage

  # Create an application myapp with Docker based build strategy expecting binary input
  oc new-app  --strategy=docker --binary --name myapp

  # Create a Ruby application based on the provided [image]~[source code] combination
  oc new-app centos/ruby-25-centos7~https://github.com/sclorg/ruby-ex.git

  # Use the public Docker Hub MySQL image to create an app. Generated artifacts will be labeled with db=mysql
  oc new-app mysql MYSQL_USER=user MYSQL_PASSWORD=pass MYSQL_DATABASE=testdb -l db=mysql

  # Use a MySQL image in a private registry to create an app and override application artifacts' names
  oc new-app --docker-image=myregistry.com/mycompany/mysql --name=private

  # Create an application from a remote repository using its beta4 branch
  oc new-app https://github.com/openshift/ruby-hello-world#beta4

  # Create an application based on a stored template, explicitly setting a parameter value
  oc new-app --template=ruby-helloworld-sample --param=MYSQL_USER=admin

  # Create an application from a remote repository and specify a context directory
  oc new-app https://github.com/youruser/yourgitrepo --context-dir=src/build

  # Create an application from a remote private repository and specify which existing secret to use
  oc new-app https://github.com/youruser/yourgitrepo --source-secret=yoursecret

  # Create an application based on a template file, explicitly setting a parameter value
  oc new-app --file=./example/myapp/template.json --param=MYSQL_USER=admin

  # Search all templates, image streams, and Docker images for the ones that match "ruby"
  oc new-app --search ruby

  # Search for "ruby", but only in stored templates (--template, --image-stream and --docker-image
  # can be used to filter search results)
  oc new-app --search --template=ruby

  # Search for "ruby" in stored templates and print the output as YAML
  oc new-app --search --template=ruby --output=yaml

1.4.1.88. oc new-build

创建新构建配置

示例用法

  # Create a build config based on the source code in the current git repository (with a public
  # remote) and a Docker image
  oc new-build . --docker-image=repo/langimage

  # Create a NodeJS build config based on the provided [image]~[source code] combination
  oc new-build centos/nodejs-8-centos7~https://github.com/sclorg/nodejs-ex.git

  # Create a build config from a remote repository using its beta2 branch
  oc new-build https://github.com/openshift/ruby-hello-world#beta2

  # Create a build config using a Dockerfile specified as an argument
  oc new-build -D $'FROM centos:7\nRUN yum install -y httpd'

  # Create a build config from a remote repository and add custom environment variables
  oc new-build https://github.com/openshift/ruby-hello-world -e RACK_ENV=development

  # Create a build config from a remote private repository and specify which existing secret to use
  oc new-build https://github.com/youruser/yourgitrepo --source-secret=yoursecret

  # Create a build config from a remote repository and inject the npmrc into a build
  oc new-build https://github.com/openshift/ruby-hello-world --build-secret npmrc:.npmrc

  # Create a build config from a remote repository and inject environment data into a build
  oc new-build https://github.com/openshift/ruby-hello-world --build-config-map env:config

  # Create a build config that gets its input from a remote repository and another Docker image
  oc new-build https://github.com/openshift/ruby-hello-world --source-image=openshift/jenkins-1-centos7 --source-image-path=/var/lib/jenkins:tmp

1.4.1.89. oc new-project

请求新项目

示例用法

  # Create a new project with minimal information
  oc new-project web-team-dev

  # Create a new project with a display name and description
  oc new-project web-team-dev --display-name="Web Team Development" --description="Development project for the web team."

1.4.1.90. oc observe

观察资源的变化并对其做出反应(实验性)

示例用法

  # Observe changes to services
  oc observe services

  # Observe changes to services, including the clusterIP and invoke a script for each
  oc observe services --template '{ .spec.clusterIP }' -- register_dns.sh

  # Observe changes to services filtered by a label selector
  oc observe namespaces -l regist-dns=true --template '{ .spec.clusterIP }' -- register_dns.sh

1.4.1.91. oc patch

资源的更新字段

示例用法

  # Partially update a node using a strategic merge patch. Specify the patch as JSON.
  oc patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

  # Partially update a node using a strategic merge patch. Specify the patch as YAML.
  oc patch node k8s-node-1 -p $'spec:\n unschedulable: true'

  # Partially update a node identified by the type and name specified in "node.json" using strategic merge patch.
  oc patch -f node.json -p '{"spec":{"unschedulable":true}}'

  # Update a container's image; spec.containers[*].name is required because it's a merge key.
  oc patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

  # Update a container's image using a json patch with positional arrays.
  oc patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]'

1.4.1.92. oc policy add-role-to-user

为当前项目的用户或服务帐户添加角色

示例用法

  # Add the 'view' role to user1 for the current project
  oc policy add-role-to-user view user1

  # Add the 'edit' role to serviceaccount1 for the current project
  oc policy add-role-to-user edit -z serviceaccount1

1.4.1.93. oc policy scc-review

检查哪个服务帐户可以创建 pod

示例用法

  # Check whether service accounts sa1 and sa2 can admit a pod with a template pod spec specified in my_resource.yaml
  # Service Account specified in myresource.yaml file is ignored
  oc policy scc-review -z sa1,sa2 -f my_resource.yaml

  # Check whether service accounts system:serviceaccount:bob:default can admit a pod with a template pod spec specified in my_resource.yaml
  oc policy scc-review -z system:serviceaccount:bob:default -f my_resource.yaml

  # Check whether the service account specified in my_resource_with_sa.yaml can admit the pod
  oc policy scc-review -f my_resource_with_sa.yaml

  # Check whether the default service account can admit the pod; default is taken since no service account is defined in myresource_with_no_sa.yaml
  oc policy scc-review -f myresource_with_no_sa.yaml

1.4.1.94. oc policy scc-subject-review

检查用户或服务帐户是否可以创建 pod

示例用法

  # Check whether user bob can create a pod specified in myresource.yaml
  oc policy scc-subject-review -u bob -f myresource.yaml

  # Check whether user bob who belongs to projectAdmin group can create a pod specified in myresource.yaml
  oc policy scc-subject-review -u bob -g projectAdmin -f myresource.yaml

  # Check whether a service account specified in the pod template spec in myresourcewithsa.yaml can create the pod
  oc policy scc-subject-review -f myresourcewithsa.yaml

1.4.1.95. oc port-forward

将一个或多个本地端口转发到一个 pod

示例用法

  # Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the pod
  oc port-forward pod/mypod 5000 6000

  # Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in a pod selected by the deployment
  oc port-forward deployment/mydeployment 5000 6000

  # Listen on port 8443 locally, forwarding to the targetPort of the service's port named "https" in a pod selected by the service
  oc port-forward service/myservice 8443:https

  # Listen on port 8888 locally, forwarding to 5000 in the pod
  oc port-forward pod/mypod 8888:5000

  # Listen on port 8888 on all addresses, forwarding to 5000 in the pod
  oc port-forward --address 0.0.0.0 pod/mypod 8888:5000

  # Listen on port 8888 on localhost and selected IP, forwarding to 5000 in the pod
  oc port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000

  # Listen on a random port locally, forwarding to 5000 in the pod
  oc port-forward pod/mypod :5000

1.4.1.96. oc process

将模板处理为资源列表

示例用法

  # Convert the template.json file into a resource list and pass to create
  oc process -f template.json | oc create -f -

  # Process a file locally instead of contacting the server
  oc process -f template.json --local -o yaml

  # Process template while passing a user-defined label
  oc process -f template.json -l name=mytemplate

  # Convert a stored template into a resource list
  oc process foo

  # Convert a stored template into a resource list by setting/overriding parameter values
  oc process foo PARM1=VALUE1 PARM2=VALUE2

  # Convert a template stored in different namespace into a resource list
  oc process openshift//foo

  # Convert template.json into a resource list
  cat template.json | oc process -f -

1.4.1.97. oc project

切换到另一个项目

示例用法

  # Switch to the 'myapp' project
  oc project myapp

  # Display the project currently in use
  oc project

1.4.1.98. oc projects

显示现有项目

示例用法

  # List all projects
  oc projects

1.4.1.99. oc proxy

运行到 Kubernetes API 服务器的代理

示例用法

  # To proxy all of the kubernetes api and nothing else.
  oc proxy --api-prefix=/

  # To proxy only part of the kubernetes api and also some static files.
  # You can get pods info with 'curl localhost:8001/api/v1/pods'
  oc proxy --www=/my/files --www-prefix=/static/ --api-prefix=/api/

  # To proxy the entire kubernetes api at a different root.
  # You can get pods info with 'curl localhost:8001/custom/api/v1/pods'
  oc proxy --api-prefix=/custom/

  # Run a proxy to kubernetes apiserver on port 8011, serving static content from ./local/www/
  oc proxy --port=8011 --www=./local/www/

  # Run a proxy to kubernetes apiserver on an arbitrary local port.
  # The chosen port for the server will be output to stdout.
  oc proxy --port=0

  # Run a proxy to kubernetes apiserver, changing the api prefix to k8s-api
  # This makes e.g. the pods api available at localhost:8001/k8s-api/v1/pods/
  oc proxy --api-prefix=/k8s-api

1.4.1.100. oc registry info

输出有关集成 registry 的信息

示例用法

  # Display information about the integrated registry
  oc registry info

1.4.1.101. oc registry login

登录到集成的 registry

示例用法

  # Log in to the integrated registry
  oc registry login

  # Log in as the default service account in the current namespace
  oc registry login -z default

  # Log in to different registry using BASIC auth credentials
  oc registry login --registry quay.io/myregistry --auth-basic=USER:PASS

1.4.1.102. oc replace

将资源替换为文件名或 stdin

示例用法

  # Replace a pod using the data in pod.json.
  oc replace -f ./pod.json

  # Replace a pod based on the JSON passed into stdin.
  cat pod.json | oc replace -f -

  # Update a single-container pod's image version (tag) to v4
  oc get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | oc replace -f -

  # Force replace, delete and then re-create the resource
  oc replace --force -f ./pod.json

1.4.1.103. oc rollback

将应用程序的一部分还原回以前的部署

示例用法

  # Perform a rollback to the last successfully completed deployment for a deployment config
  oc rollback frontend

  # See what a rollback to version 3 will look like, but do not perform the rollback
  oc rollback frontend --to-version=3 --dry-run

  # Perform a rollback to a specific deployment
  oc rollback frontend-2

  # Perform the rollback manually by piping the JSON of the new config back to oc
  oc rollback frontend -o json | oc replace dc/frontend -f -

  # Print the updated deployment configuration in JSON format instead of performing the rollback
  oc rollback frontend -o json

1.4.1.104. oc rollout cancel

取消进行中的部署

示例用法

  # Cancel the in-progress deployment based on 'nginx'
  oc rollout cancel dc/nginx

1.4.1.105. oc rollout history

查看推出(rollout)历史记录

示例用法

  # View the rollout history of a deployment
  oc rollout history dc/nginx

  # View the details of deployment revision 3
  oc rollout history dc/nginx --revision=3

1.4.1.106. oc rollout latest

使用来自触发器的最新状态为部署配置启动一个新的 rollout 操作

示例用法

  # Start a new rollout based on the latest images defined in the image change triggers
  oc rollout latest dc/nginx

  # Print the rolled out deployment config
  oc rollout latest dc/nginx -o json

1.4.1.107. oc rollout pause

将提供的资源标记为暂停

示例用法

  # Mark the nginx deployment as paused. Any current state of
  # the deployment will continue its function, new updates to the deployment will not
  # have an effect as long as the deployment is paused
  oc rollout pause dc/nginx

1.4.1.108. oc rollout restart

重启资源

示例用法

  # Restart a deployment
  oc rollout restart deployment/nginx

  # Restart a daemonset
  oc rollout restart daemonset/abc

1.4.1.109. oc rollout resume

恢复暂停的资源

示例用法

  # Resume an already paused deployment
  oc rollout resume dc/nginx

1.4.1.110. oc rollout retry

重试最新失败的 rollout 操作

示例用法

  # Retry the latest failed deployment based on 'frontend'
  # The deployer pod and any hook pods are deleted for the latest failed deployment
  oc rollout retry dc/frontend

1.4.1.111. oc rollout status

显示推出部署的状态

示例用法

  # Watch the status of the latest rollout
  oc rollout status dc/nginx

1.4.1.112. oc rollout undo

撤消之前的推出部署

示例用法

  # Roll back to the previous deployment
  oc rollout undo dc/nginx

  # Roll back to deployment revision 3. The replication controller for that version must exist
  oc rollout undo dc/nginx --to-revision=3

1.4.1.113. oc rsh

在容器中启动 shell 会话

示例用法

  # Open a shell session on the first container in pod 'foo'
  oc rsh foo

  # Open a shell session on the first container in pod 'foo' and namespace 'bar'
  # (Note that oc client specific arguments must come before the resource name and its arguments)
  oc rsh -n bar foo

  # Run the command 'cat /etc/resolv.conf' inside pod 'foo'
  oc rsh foo cat /etc/resolv.conf

  # See the configuration of your internal registry
  oc rsh dc/docker-registry cat config.yml

  # Open a shell session on the container named 'index' inside a pod of your job
  oc rsh -c index job/sheduled

1.4.1.114. oc rsync

在本地文件系统和 pod 间复制文件

示例用法

  # Synchronize a local directory with a pod directory
  oc rsync ./local/dir/ POD:/remote/dir

  # Synchronize a pod directory with a local directory
  oc rsync POD:/remote/dir/ ./local/dir

1.4.1.115. oc run

在集群中运行特定镜像

示例用法

  # Start a nginx pod.
  oc run nginx --image=nginx

  # Start a hazelcast pod and let the container expose port 5701.
  oc run hazelcast --image=hazelcast/hazelcast --port=5701

  # Start a hazelcast pod and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the container.
  oc run hazelcast --image=hazelcast/hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"

  # Start a hazelcast pod and set labels "app=hazelcast" and "env=prod" in the container.
  oc run hazelcast --image=hazelcast/hazelcast --labels="app=hazelcast,env=prod"

  # Dry run. Print the corresponding API objects without creating them.
  oc run nginx --image=nginx --dry-run=client

  # Start a nginx pod, but overload the spec with a partial set of values parsed from JSON.
  oc run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'

  # Start a busybox pod and keep it in the foreground, don't restart it if it exits.
  oc run -i -t busybox --image=busybox --restart=Never

  # Start the nginx pod using the default command, but use custom arguments (arg1 .. argN) for that command.
  oc run nginx --image=nginx -- <arg1> <arg2> ... <argN>

  # Start the nginx pod using a different command and custom arguments.
  oc run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>

1.4.1.116. oc scale

为 Deployment、ReplicaSet 或 Replication Controller 设置一个新的大小

示例用法

  # Scale a replicaset named 'foo' to 3.
  oc scale --replicas=3 rs/foo

  # Scale a resource identified by type and name specified in "foo.yaml" to 3.
  oc scale --replicas=3 -f foo.yaml

  # If the deployment named mysql's current size is 2, scale mysql to 3.
  oc scale --current-replicas=2 --replicas=3 deployment/mysql

  # Scale multiple replication controllers.
  oc scale --replicas=5 rc/foo rc/bar rc/baz

  # Scale statefulset named 'web' to 3.
  oc scale --replicas=3 statefulset/web

1.4.1.119. oc serviceaccounts create-kubeconfig

为服务帐户生成 kubeconfig 文件

示例用法

  # Create a kubeconfig file for service account 'default'
  oc serviceaccounts create-kubeconfig 'default' > default.kubeconfig

1.4.1.120. oc serviceaccounts get-token

获取分配给服务帐户的令牌

示例用法

  # Get the service account token from service account 'default'
  oc serviceaccounts get-token 'default'

1.4.1.121. oc serviceaccounts new-token

为服务帐户生成新令牌

示例用法

  # Generate a new token for service account 'default'
  oc serviceaccounts new-token 'default'

  # Generate a new token for service account 'default' and apply
  # labels 'foo' and 'bar' to the new token for identification
  oc serviceaccounts new-token 'default' --labels foo=foo-value,bar=bar-value

1.4.1.122. oc set build-hook

更新构建配置上的构建 hook

示例用法

  # Clear post-commit hook on a build config
  oc set build-hook bc/mybuild --post-commit --remove

  # Set the post-commit hook to execute a test suite using a new entrypoint
  oc set build-hook bc/mybuild --post-commit --command -- /bin/bash -c /var/lib/test-image.sh

  # Set the post-commit hook to execute a shell script
  oc set build-hook bc/mybuild --post-commit --script="/var/lib/test-image.sh param1 param2 && /var/lib/done.sh"

1.4.1.123. oc set build-secret

更新构建配置上的构建 secret

示例用法

  # Clear the push secret on a build config
  oc set build-secret --push --remove bc/mybuild

  # Set the pull secret on a build config
  oc set build-secret --pull bc/mybuild mysecret

  # Set the push and pull secret on a build config
  oc set build-secret --push --pull bc/mybuild mysecret

  # Set the source secret on a set of build configs matching a selector
  oc set build-secret --source -l app=myapp gitsecret

1.4.1.124. oc set data

更新配置映射或 secret 中的数据

示例用法

  # Set the 'password' key of a secret
  oc set data secret/foo password=this_is_secret

  # Remove the 'password' key from a secret
  oc set data secret/foo password-

  # Update the 'haproxy.conf' key of a config map from a file on disk
  oc set data configmap/bar --from-file=../haproxy.conf

  # Update a secret with the contents of a directory, one key per file
  oc set data secret/foo --from-file=secret-dir

1.4.1.125. oc set deployment-hook

更新部署配置上的部署 hook

示例用法

  # Clear pre and post hooks on a deployment config
  oc set deployment-hook dc/myapp --remove --pre --post

  # Set the pre deployment hook to execute a db migration command for an application
  # using the data volume from the application
  oc set deployment-hook dc/myapp --pre --volumes=data -- /var/lib/migrate-db.sh

  # Set a mid deployment hook along with additional environment variables
  oc set deployment-hook dc/myapp --mid --volumes=data -e VAR1=value1 -e VAR2=value2 -- /var/lib/prepare-deploy.sh

1.4.1.126. oc set env

更新 pod 模板上的环境变量

示例用法

  # Update deployment config 'myapp' with a new environment variable
  oc set env dc/myapp STORAGE_DIR=/local

  # List the environment variables defined on a build config 'sample-build'
  oc set env bc/sample-build --list

  # List the environment variables defined on all pods
  oc set env pods --all --list

  # Output modified build config in YAML
  oc set env bc/sample-build STORAGE_DIR=/data -o yaml

  # Update all containers in all replication controllers in the project to have ENV=prod
  oc set env rc --all ENV=prod

  # Import environment from a secret
  oc set env --from=secret/mysecret dc/myapp

  # Import environment from a config map with a prefix
  oc set env --from=configmap/myconfigmap --prefix=MYSQL_ dc/myapp

  # Remove the environment variable ENV from container 'c1' in all deployment configs
  oc set env dc --all --containers="c1" ENV-

  # Remove the environment variable ENV from a deployment config definition on disk and
  # update the deployment config on the server
  oc set env -f dc.json ENV-

  # Set some of the local shell environment into a deployment config on the server
  oc set env | grep RAILS_ | oc env -e - dc/myapp

1.4.1.127. oc set image

更新 pod 模板的镜像

示例用法

  # Set a deployment configs's nginx container image to 'nginx:1.9.1', and its busybox container image to 'busybox'.
  oc set image dc/nginx busybox=busybox nginx=nginx:1.9.1

  # Set a deployment configs's app container image to the image referenced by the imagestream tag 'openshift/ruby:2.3'.
  oc set image dc/myapp app=openshift/ruby:2.3 --source=imagestreamtag

  # Update all deployments' and rc's nginx container's image to 'nginx:1.9.1'
  oc set image deployments,rc nginx=nginx:1.9.1 --all

  # Update image of all containers of daemonset abc to 'nginx:1.9.1'
  oc set image daemonset abc *=nginx:1.9.1

  # Print result (in yaml format) of updating nginx container image from local file, without hitting the server
  oc set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml

1.4.1.128. oc set image-lookup

更改部署应用程序时镜像的解析方式

示例用法

  # Print all of the image streams and whether they resolve local names
  oc set image-lookup

  # Use local name lookup on image stream mysql
  oc set image-lookup mysql

  # Force a deployment to use local name lookup
  oc set image-lookup deploy/mysql

  # Show the current status of the deployment lookup
  oc set image-lookup deploy/mysql --list

  # Disable local name lookup on image stream mysql
  oc set image-lookup mysql --enabled=false

  # Set local name lookup on all image streams
  oc set image-lookup --all

1.4.1.129. oc set probe

更新 pod 模板上的探测

示例用法

  # Clear both readiness and liveness probes off all containers
  oc set probe dc/myapp --remove --readiness --liveness

  # Set an exec action as a liveness probe to run 'echo ok'
  oc set probe dc/myapp --liveness -- echo ok

  # Set a readiness probe to try to open a TCP socket on 3306
  oc set probe rc/mysql --readiness --open-tcp=3306

  # Set an HTTP startup probe for port 8080 and path /healthz over HTTP on the pod IP
  oc probe dc/webapp --startup --get-url=http://:8080/healthz

  # Set an HTTP readiness probe for port 8080 and path /healthz over HTTP on the pod IP
  oc probe dc/webapp --readiness --get-url=http://:8080/healthz

  # Set an HTTP readiness probe over HTTPS on 127.0.0.1 for a hostNetwork pod
  oc set probe dc/router --readiness --get-url=https://127.0.0.1:1936/stats

  # Set only the initial-delay-seconds field on all deployments
  oc set probe dc --all --readiness --initial-delay-seconds=30

1.4.1.130. oc set resources

使用 pod 模板更新对象上的资源请求/限制

示例用法

  # Set a deployments nginx container CPU limits to "200m and memory to 512Mi"
  oc set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi

  # Set the resource request and limits for all containers in nginx
  oc set resources deployment nginx --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi

  # Remove the resource requests for resources on containers in nginx
  oc set resources deployment nginx --limits=cpu=0,memory=0 --requests=cpu=0,memory=0

  # Print the result (in YAML format) of updating nginx container limits locally, without hitting the server
  oc set resources -f path/to/file.yaml --limits=cpu=200m,memory=512Mi --local -o yaml

1.4.1.131. oc set route-backends

更新路由的后端

示例用法

  # Print the backends on the route 'web'
  oc set route-backends web

  # Set two backend services on route 'web' with 2/3rds of traffic going to 'a'
  oc set route-backends web a=2 b=1

  # Increase the traffic percentage going to b by 10%% relative to a
  oc set route-backends web --adjust b=+10%%

  # Set traffic percentage going to b to 10%% of the traffic going to a
  oc set route-backends web --adjust b=10%%

  # Set weight of b to 10
  oc set route-backends web --adjust b=10

  # Set the weight to all backends to zero
  oc set route-backends web --zero

1.4.1.132. oc set selector

在资源上设置选择器

示例用法

  # Set the labels and selector before creating a deployment/service pair.
  oc create service clusterip my-svc --clusterip="None" -o yaml --dry-run | oc set selector --local -f - 'environment=qa' -o yaml | oc create -f -
  oc create deployment my-dep -o yaml --dry-run | oc label --local -f - environment=qa -o yaml | oc create -f -

1.4.1.133. oc set serviceaccount

更新资源的 ServiceAccount

示例用法

  # Set deployment nginx-deployment's service account to serviceaccount1
  oc set serviceaccount deployment nginx-deployment serviceaccount1

  # Print the result (in YAML format) of updated nginx deployment with service account from a local file, without hitting the API server
  oc set sa -f nginx-deployment.yaml serviceaccount1 --local --dry-run -o yaml

1.4.1.134. oc set subject

更新 RoleBinding/ClusterRoleBinding 中的 User、Group 或 ServiceAccount

示例用法

  # Update a cluster role binding for serviceaccount1
  oc set subject clusterrolebinding admin --serviceaccount=namespace:serviceaccount1

  # Update a role binding for user1, user2, and group1
  oc set subject rolebinding admin --user=user1 --user=user2 --group=group1

  # Print the result (in YAML format) of updating role binding subjects locally, without hitting the server
  oc create rolebinding admin --role=admin --user=admin -o yaml --dry-run | oc set subject --local -f - --user=foo -o yaml

1.4.1.135. oc set triggers

更新一个或多个对象上的触发器

示例用法

  # Print the triggers on the deployment config 'myapp'
  oc set triggers dc/myapp

  # Set all triggers to manual
  oc set triggers dc/myapp --manual

  # Enable all automatic triggers
  oc set triggers dc/myapp --auto

  # Reset the GitHub webhook on a build to a new, generated secret
  oc set triggers bc/webapp --from-github
  oc set triggers bc/webapp --from-webhook

  # Remove all triggers
  oc set triggers bc/webapp --remove-all

  # Stop triggering on config change
  oc set triggers dc/myapp --from-config --remove

  # Add an image trigger to a build config
  oc set triggers bc/webapp --from-image=namespace1/image:latest

  # Add an image trigger to a stateful set on the main container
  oc set triggers statefulset/db --from-image=namespace1/image:latest -c main

1.4.1.136. oc set volumes

更新 pod 模板中的卷

示例用法

  # List volumes defined on all deployment configs in the current project
  oc set volume dc --all

  # Add a new empty dir volume to deployment config (dc) 'myapp' mounted under
  # /var/lib/myapp
  oc set volume dc/myapp --add --mount-path=/var/lib/myapp

  # Use an existing persistent volume claim (pvc) to overwrite an existing volume 'v1'
  oc set volume dc/myapp --add --name=v1 -t pvc --claim-name=pvc1 --overwrite

  # Remove volume 'v1' from deployment config 'myapp'
  oc set volume dc/myapp --remove --name=v1

  # Create a new persistent volume claim that overwrites an existing volume 'v1'
  oc set volume dc/myapp --add --name=v1 -t pvc --claim-size=1G --overwrite

  # Change the mount point for volume 'v1' to /data
  oc set volume dc/myapp --add --name=v1 -m /data --overwrite

  # Modify the deployment config by removing volume mount "v1" from container "c1"
  # (and by removing the volume "v1" if no other containers have volume mounts that reference it)
  oc set volume dc/myapp --remove --name=v1 --containers=c1

  # Add new volume based on a more complex volume source (AWS EBS, GCE PD,
  # Ceph, Gluster, NFS, ISCSI, ...)
  oc set volume dc/myapp --add -m /data --source=<json-string>

1.4.1.137. oc start-build

启动新构建

示例用法

  # Starts build from build config "hello-world"
  oc start-build hello-world

  # Starts build from a previous build "hello-world-1"
  oc start-build --from-build=hello-world-1

  # Use the contents of a directory as build input
  oc start-build hello-world --from-dir=src/

  # Send the contents of a Git repository to the server from tag 'v2'
  oc start-build hello-world --from-repo=../hello-world --commit=v2

  # Start a new build for build config "hello-world" and watch the logs until the build
  # completes or fails
  oc start-build hello-world --follow

  # Start a new build for build config "hello-world" and wait until the build completes. It
  # exits with a non-zero return code if the build fails
  oc start-build hello-world --wait

1.4.1.138. oc status

显示当前项目的概述

示例用法

  # See an overview of the current project
  oc status

  # Export the overview of the current project in an svg file
  oc status -o dot | dot -T svg -o project.svg

  # See an overview of the current project including details for any identified issues
  oc status --suggest

1.4.1.139. oc tag

将现有镜像标记到镜像流中

示例用法

  # Tag the current image for the image stream 'openshift/ruby' and tag '2.0' into the image stream 'yourproject/ruby with tag 'tip'
  oc tag openshift/ruby:2.0 yourproject/ruby:tip

  # Tag a specific image
  oc tag openshift/ruby@sha256:6b646fa6bf5e5e4c7fa41056c27910e679c03ebe7f93e361e6515a9da7e258cc yourproject/ruby:tip

  # Tag an external container image
  oc tag --source=docker openshift/origin-control-plane:latest yourproject/ruby:tip

  # Tag an external container image and request pullthrough for it
  oc tag --source=docker openshift/origin-control-plane:latest yourproject/ruby:tip --reference-policy=local

  # Remove the specified spec tag from an image stream
  oc tag openshift/origin-control-plane:latest -d

1.4.1.140. oc version

输出客户端和服务器版本信息

示例用法

  # Print the OpenShift client, kube-apiserver, and openshift-apiserver version information for the current context
  oc version

  # Print the OpenShift client, kube-apiserver, and openshift-apiserver version numbers for the current context
  oc version --short

  # Print the OpenShift client version information for the current context
  oc version --client

1.4.1.141. oc wait

实验性:在一个或多个资源上等待特定条件。

示例用法

  # Wait for the pod "busybox1" to contain the status condition of type "Ready".
  oc wait --for=condition=Ready pod/busybox1

  # The default value of status condition is true, you can set false.
  oc wait --for=condition=Ready=false pod/busybox1

  # Wait for the pod "busybox1" to be deleted, with a timeout of 60s, after having issued the "delete" command.
  oc delete pod/busybox1
  oc wait --for=delete pod/busybox1 --timeout=60s

1.4.1.142. oc whoami

返回有关当前会话的信息

示例用法

  # Display the currently authenticated user
  oc whoami

1.4.2. 其他资源

1.5. OpenShift CLI 管理员命令参考

本参考提供了 OpenShift CLI(oc)管理员命令的描述和示例命令。有关开发人员命令,请参阅 OpenShift CLI 开发人员命令参考

运行 oc adm help 以列出所有管理员命令或运行 oc <command> --help 获取特定命令的更多详情。

1.5.1. OpenShift CLI(oc)管理员命令

1.5.1.1. oc adm build-chain

输出构建的输入和依赖项

示例用法

  # Build the dependency tree for the 'latest' tag in <image-stream>
  oc adm build-chain <image-stream>

  # Build the dependency tree for the 'v2' tag in dot format and visualize it via the dot utility
  oc adm build-chain <image-stream>:v2 -o dot | dot -T svg -o deps.svg

  # Build the dependency tree across all namespaces for the specified image stream tag found in the 'test' namespace
  oc adm build-chain <image-stream> -n test --all

1.5.1.2. oc adm catalog mirror

镜像 operator-registry 目录

示例用法

  # Mirror an operator-registry image and its contents to a registry
  oc adm catalog mirror quay.io/my/image:latest myregistry.com

  # Mirror an operator-registry image and its contents to a particular namespace in a registry
  oc adm catalog mirror quay.io/my/image:latest myregistry.com/my-namespace

  # Mirror to an airgapped registry by first mirroring to files
  oc adm catalog mirror quay.io/my/image:latest file:///local/index
  oc adm catalog mirror file:///local/index/my/image:latest my-airgapped-registry.com

  # Configure a cluster to use a mirrored registry
  oc apply -f manifests/imageContentSourcePolicy.yaml

  # Edit the mirroring mappings and mirror with "oc image mirror" manually
  oc adm catalog mirror --manifests-only quay.io/my/image:latest myregistry.com
  oc image mirror -f manifests/mapping.txt

  # Delete all ImageContentSourcePolicies generated by oc adm catalog mirror
  oc delete imagecontentsourcepolicy -l operators.openshift.org/catalog=true

1.5.1.3. oc adm completion

输出指定 shell 的 shell 完成代码(bash 或 zsh)

示例用法

  # Installing bash completion on macOS using homebrew
  ## If running Bash 3.2 included with macOS
  brew install bash-completion
  ## or, if running Bash 4.1+
  brew install bash-completion@2
  ## If oc is installed via homebrew, this should start working immediately.
  ## If you've installed via other means, you may need add the completion to your completion directory
  oc completion bash > $(brew --prefix)/etc/bash_completion.d/oc


  # Installing bash completion on Linux
  ## If bash-completion is not installed on Linux, please install the 'bash-completion' package
  ## via your distribution's package manager.
  ## Load the oc completion code for bash into the current shell
  source <(oc completion bash)
  ## Write bash completion code to a file and source it from .bash_profile
  oc completion bash > ~/.kube/completion.bash.inc
  printf "
  # Kubectl shell completion
  source '$HOME/.kube/completion.bash.inc'
  " >> $HOME/.bash_profile
  source $HOME/.bash_profile

  # Load the oc completion code for zsh[1] into the current shell
  source <(oc completion zsh)
  # Set the oc completion code for zsh[1] to autoload on startup
  oc completion zsh > "${fpath[1]}/_oc"

1.5.1.4. oc adm config current-context

显示当前上下文

示例用法

  # Display the current-context
  oc config current-context

1.5.1.5. oc adm config delete-cluster

从 kubeconfig 删除指定的集群

示例用法

  # Delete the minikube cluster
  oc config delete-cluster minikube

1.5.1.6. oc adm config delete-context

从 kubeconfig 删除指定的上下文

示例用法

  # Delete the context for the minikube cluster
  oc config delete-context minikube

1.5.1.7. oc adm config delete-user

从 kubeconfig 删除指定用户

示例用法

  # Delete the minikube user
  oc config delete-user minikube

1.5.1.8. oc adm config get-clusters

显示 kubeconfig 中定义的集群

示例用法

  # List the clusters oc knows about
  oc config get-clusters

1.5.1.9. oc adm config get-contexts

描述一个或多个上下文

示例用法

  # List all the contexts in your kubeconfig file
  oc config get-contexts

  # Describe one context in your kubeconfig file.
  oc config get-contexts my-context

1.5.1.10. oc adm config get-users

显示 kubeconfig 中定义的用户

示例用法

  # List the users oc knows about
  oc config get-users

1.5.1.11. oc adm config rename-context

从 kubeconfig 文件中重命名上下文。

示例用法

  # Rename the context 'old-name' to 'new-name' in your kubeconfig file
  oc config rename-context old-name new-name

1.5.1.12. oc adm config set

在 kubeconfig 文件中设置单个值

示例用法

  # Set server field on the my-cluster cluster to https://1.2.3.4
  oc config set clusters.my-cluster.server https://1.2.3.4

  # Set certificate-authority-data field on the my-cluster cluster.
  oc config set clusters.my-cluster.certificate-authority-data $(echo "cert_data_here" | base64 -i -)

  # Set cluster field in the my-context context to my-cluster.
  oc config set contexts.my-context.cluster my-cluster

  # Set client-key-data field in the cluster-admin user using --set-raw-bytes option.
  oc config set users.cluster-admin.client-key-data cert_data_here --set-raw-bytes=true

1.5.1.13. oc adm config set-cluster

在 kubeconfig 中设置集群条目

示例用法

  # Set only the server field on the e2e cluster entry without touching other values.
  oc config set-cluster e2e --server=https://1.2.3.4

  # Embed certificate authority data for the e2e cluster entry
  oc config set-cluster e2e --embed-certs --certificate-authority=~/.kube/e2e/kubernetes.ca.crt

  # Disable cert checking for the dev cluster entry
  oc config set-cluster e2e --insecure-skip-tls-verify=true

  # Set custom TLS server name to use for validation for the e2e cluster entry
  oc config set-cluster e2e --tls-server-name=my-cluster-name

1.5.1.14. oc adm config set-context

在 kubeconfig 中设置上下文条目

示例用法

  # Set the user field on the gce context entry without touching other values
  oc config set-context gce --user=cluster-admin

1.5.1.15. oc adm config set-credentials

在 kubeconfig 中设置用户条目

示例用法

  # Set only the "client-key" field on the "cluster-admin"
  # entry, without touching other values:
  oc config set-credentials cluster-admin --client-key=~/.kube/admin.key

  # Set basic auth for the "cluster-admin" entry
  oc config set-credentials cluster-admin --username=admin --password=uXFGweU9l35qcif

  # Embed client certificate data in the "cluster-admin" entry
  oc config set-credentials cluster-admin --client-certificate=~/.kube/admin.crt --embed-certs=true

  # Enable the Google Compute Platform auth provider for the "cluster-admin" entry
  oc config set-credentials cluster-admin --auth-provider=gcp

  # Enable the OpenID Connect auth provider for the "cluster-admin" entry with additional args
  oc config set-credentials cluster-admin --auth-provider=oidc --auth-provider-arg=client-id=foo --auth-provider-arg=client-secret=bar

  # Remove the "client-secret" config value for the OpenID Connect auth provider for the "cluster-admin" entry
  oc config set-credentials cluster-admin --auth-provider=oidc --auth-provider-arg=client-secret-

  # Enable new exec auth plugin for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-command=/path/to/the/executable --exec-api-version=client.authentication.k8s.io/v1beta1

  # Define new exec auth plugin args for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-arg=arg1 --exec-arg=arg2

  # Create or update exec auth plugin environment variables for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-env=key1=val1 --exec-env=key2=val2

  # Remove exec auth plugin environment variables for the "cluster-admin" entry
  oc config set-credentials cluster-admin --exec-env=var-to-remove-

1.5.1.16. oc adm config unset

在 kubeconfig 文件中取消设置单个值

示例用法

  # Unset the current-context.
  oc config unset current-context

  # Unset namespace in foo context.
  oc config unset contexts.foo.namespace

1.5.1.17. oc adm config use-context

在 kubeconfig 文件中设置当前上下文

示例用法

  # Use the context for the minikube cluster
  oc config use-context minikube

1.5.1.18. oc adm config view

显示合并的 kubeconfig 设置或指定的 kubeconfig 文件

示例用法

  # Show merged kubeconfig settings.
  oc config view

  # Show merged kubeconfig settings and raw certificate data.
  oc config view --raw

  # Get the password for the e2e user
  oc config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}'

1.5.1.19. oc adm cordon

将节点标记为不可调度

示例用法

  # Mark node "foo" as unschedulable.
  oc adm cordon foo

1.5.1.20. oc adm create-bootstrap-project-template

创建 bootstrap 项目模板

示例用法

  # Output a bootstrap project template in YAML format to stdout
  oc adm create-bootstrap-project-template -o yaml

1.5.1.21. oc adm create-error-template

创建错误页面模板

示例用法

  # Output a template for the error page to stdout
  oc adm create-error-template

1.5.1.22. oc adm create-login-template

创建登录模板

示例用法

  # Output a template for the login page to stdout
  oc adm create-login-template

1.5.1.23. oc adm create-provider-selection-template

创建供应商选择模板

示例用法

  # Output a template for the provider selection page to stdout
  oc adm create-provider-selection-template

1.5.1.24. oc adm drain

排空节点以准备进行维护

示例用法

  # Drain node "foo", even if there are pods not managed by a ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet on it.
  $ oc adm drain foo --force

  # As above, but abort if there are pods not managed by a ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet, and use a grace period of 15 minutes.
  $ oc adm drain foo --grace-period=900

1.5.1.25. oc adm groups add-users

将用户添加到组

示例用法

  # Add user1 and user2 to my-group
  oc adm groups add-users my-group user1 user2

1.5.1.26. oc adm groups new

创建一个新组

示例用法

  # Add a group with no users
  oc adm groups new my-group

  # Add a group with two users
  oc adm groups new my-group user1 user2

  # Add a group with one user and shorter output
  oc adm groups new my-group user1 -o name

1.5.1.27. oc adm groups prune

从外部提供程序中删除引用缺失记录的旧 OpenShift 组

示例用法

  # Prune all orphaned groups
  oc adm groups prune --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Prune all orphaned groups except the ones from the blacklist file
  oc adm groups prune --blacklist=/path/to/blacklist.txt --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Prune all orphaned groups from a list of specific groups specified in a whitelist file
  oc adm groups prune --whitelist=/path/to/whitelist.txt --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Prune all orphaned groups from a list of specific groups specified in a whitelist
  oc adm groups prune groups/group_name groups/other_name --sync-config=/path/to/ldap-sync-config.yaml --confirm

1.5.1.28. oc adm groups remove-users

从组中删除用户

示例用法

  # Remove user1 and user2 from my-group
  oc adm groups remove-users my-group user1 user2

1.5.1.29. oc adm groups sync

将 OpenShift 组与来自外部提供程序的记录同步

示例用法

  # Sync all groups with an LDAP server
  oc adm groups sync --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Sync all groups except the ones from the blacklist file with an LDAP server
  oc adm groups sync --blacklist=/path/to/blacklist.txt --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Sync specific groups specified in a whitelist file with an LDAP server
  oc adm groups sync --whitelist=/path/to/whitelist.txt --sync-config=/path/to/sync-config.yaml --confirm

  # Sync all OpenShift groups that have been synced previously with an LDAP server
  oc adm groups sync --type=openshift --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Sync specific OpenShift groups if they have been synced previously with an LDAP server
  oc adm groups sync groups/group1 groups/group2 groups/group3 --sync-config=/path/to/sync-config.yaml --confirm

1.5.1.30. oc adm inspect

为给定资源收集调试数据

示例用法

  # Collect debugging data for the "openshift-apiserver" clusteroperator
  oc adm inspect clusteroperator/openshift-apiserver

  # Collect debugging data for the "openshift-apiserver" and "kube-apiserver" clusteroperators
  oc adm inspect clusteroperator/openshift-apiserver clusteroperator/kube-apiserver

  # Collect debugging data for all clusteroperators
  oc adm inspect clusteroperator

  # Collect debugging data for all clusteroperators and clusterversions
  oc adm inspect clusteroperators,clusterversions

1.5.1.31. oc adm migrate template-instances

更新模板实例以指向最新的 group-version-kinds

示例用法

  # Perform a dry-run of updating all objects
  oc adm migrate template-instances

  # To actually perform the update, the confirm flag must be appended
  oc adm migrate template-instances --confirm

1.5.1.32. oc adm must-gather

启动用于收集调试信息的 pod 的新实例

示例用法

  # Gather information using the default plug-in image and command, writing into ./must-gather.local.<rand>
  oc adm must-gather

  # Gather information with a specific local folder to copy to
  oc adm must-gather --dest-dir=/local/directory

  # Gather audit information
  oc adm must-gather -- /usr/bin/gather_audit_logs

  # Gather information using multiple plug-in images
  oc adm must-gather --image=quay.io/kubevirt/must-gather --image=quay.io/openshift/origin-must-gather

  # Gather information using a specific image stream plug-in
  oc adm must-gather --image-stream=openshift/must-gather:latest

  # Gather information using a specific image, command, and pod-dir
  oc adm must-gather --image=my/image:tag --source-dir=/pod/directory -- myspecial-command.sh

1.5.1.33. oc adm new-project

创建新项目

示例用法

  # Create a new project using a node selector
  oc adm new-project myproject --node-selector='type=user-node,region=east'

1.5.1.34. oc adm node-logs

显示和过滤节点日志

示例用法

  # Show kubelet logs from all masters
  oc adm node-logs --role master -u kubelet

  # See what logs are available in masters in /var/logs
  oc adm node-logs --role master --path=/

  # Display cron log file from all masters
  oc adm node-logs --role master --path=cron

1.5.1.35. oc adm pod-network isolate-projects

隔离项目网络

示例用法

  # Provide isolation for project p1
  oc adm pod-network isolate-projects <p1>

  # Allow all projects with label name=top-secret to have their own isolated project network
  oc adm pod-network isolate-projects --selector='name=top-secret'

1.5.1.36. oc adm pod-network join-projects

加入项目网络

示例用法

  # Allow project p2 to use project p1 network
  oc adm pod-network join-projects --to=<p1> <p2>

  # Allow all projects with label name=top-secret to use project p1 network
  oc adm pod-network join-projects --to=<p1> --selector='name=top-secret'

1.5.1.37. oc adm pod-network make-projects-global

使项目网络为全局有效

示例用法

  # Allow project p1 to access all pods in the cluster and vice versa
  oc adm pod-network make-projects-global <p1>

  # Allow all projects with label name=share to access all pods in the cluster and vice versa
  oc adm pod-network make-projects-global --selector='name=share'

1.5.1.38. oc adm policy add-role-to-user

为当前项目的用户或服务帐户添加角色

示例用法

  # Add the 'view' role to user1 for the current project
  oc policy add-role-to-user view user1

  # Add the 'edit' role to serviceaccount1 for the current project
  oc policy add-role-to-user edit -z serviceaccount1

1.5.1.39. oc adm policy add-scc-to-group

为组添加安全性上下文约束

示例用法

  # Add the 'restricted' security context constraint to group1 and group2
  oc adm policy add-scc-to-group restricted group1 group2

1.5.1.40. oc adm policy add-scc-to-user

为用户或服务帐户添加安全性上下文约束

示例用法

  # Add the 'restricted' security context constraint to user1 and user2
  oc adm policy add-scc-to-user restricted user1 user2

  # Add the 'privileged' security context constraint to serviceaccount1 in the current namespace
  oc adm policy add-scc-to-user privileged -z serviceaccount1

1.5.1.41. oc adm policy scc-review

检查哪个服务帐户可以创建 pod

示例用法

  # Check whether service accounts sa1 and sa2 can admit a pod with a template pod spec specified in my_resource.yaml
  # Service Account specified in myresource.yaml file is ignored
  oc policy scc-review -z sa1,sa2 -f my_resource.yaml

  # Check whether service accounts system:serviceaccount:bob:default can admit a pod with a template pod spec specified in my_resource.yaml
  oc policy scc-review -z system:serviceaccount:bob:default -f my_resource.yaml

  # Check whether the service account specified in my_resource_with_sa.yaml can admit the pod
  oc policy scc-review -f my_resource_with_sa.yaml

  # Check whether the default service account can admit the pod; default is taken since no service account is defined in myresource_with_no_sa.yaml
  oc policy scc-review -f myresource_with_no_sa.yaml

1.5.1.42. oc adm policy scc-subject-review

检查用户或服务帐户是否可以创建 pod

示例用法

  # Check whether user bob can create a pod specified in myresource.yaml
  oc policy scc-subject-review -u bob -f myresource.yaml

  # Check whether user bob who belongs to projectAdmin group can create a pod specified in myresource.yaml
  oc policy scc-subject-review -u bob -g projectAdmin -f myresource.yaml

  # Check whether a service account specified in the pod template spec in myresourcewithsa.yaml can create the pod
  oc policy scc-subject-review -f myresourcewithsa.yaml

1.5.1.43. oc adm prune builds

删除旧的完成和失败的构建

示例用法

  # Dry run deleting older completed and failed builds and also including
  # all builds whose associated build config no longer exists
  oc adm prune builds --orphans

  # To actually perform the prune operation, the confirm flag must be appended
  oc adm prune builds --orphans --confirm

1.5.1.44. oc adm prune deployments

删除旧的完成和失败的部署配置

示例用法

  # Dry run deleting all but the last complete deployment for every deployment config
  oc adm prune deployments --keep-complete=1

  # To actually perform the prune operation, the confirm flag must be appended
  oc adm prune deployments --keep-complete=1 --confirm

1.5.1.45. oc adm prune groups

从外部提供程序中删除引用缺失记录的旧 OpenShift 组

示例用法

  # Prune all orphaned groups
  oc adm prune groups --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Prune all orphaned groups except the ones from the blacklist file
  oc adm prune groups --blacklist=/path/to/blacklist.txt --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Prune all orphaned groups from a list of specific groups specified in a whitelist file
  oc adm prune groups --whitelist=/path/to/whitelist.txt --sync-config=/path/to/ldap-sync-config.yaml --confirm

  # Prune all orphaned groups from a list of specific groups specified in a whitelist
  oc adm prune groups groups/group_name groups/other_name --sync-config=/path/to/ldap-sync-config.yaml --confirm

1.5.1.46. oc adm prune images

删除未引用的镜像

示例用法

  # See what the prune command would delete if only images and their referrers were more than an hour old
  # and obsoleted by 3 newer revisions under the same tag were considered
  oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m

  # To actually perform the prune operation, the confirm flag must be appended
  oc adm prune images --keep-tag-revisions=3 --keep-younger-than=60m --confirm

  # See what the prune command would delete if we are interested in removing images
  # exceeding currently set limit ranges ('openshift.io/Image')
  oc adm prune images --prune-over-size-limit

  # To actually perform the prune operation, the confirm flag must be appended
  oc adm prune images --prune-over-size-limit --confirm

  # Force the insecure http protocol with the particular registry host name
  oc adm prune images --registry-url=http://registry.example.org --confirm

  # Force a secure connection with a custom certificate authority to the particular registry host name
  oc adm prune images --registry-url=registry.example.org --certificate-authority=/path/to/custom/ca.crt --confirm

1.5.1.47. oc adm release extract

将更新有效负载的内容提取到磁盘

示例用法

  # Use git to check out the source code for the current cluster release to DIR
  oc adm release extract --git=DIR

  # Extract cloud credential requests for AWS
  oc adm release extract --credentials-requests --cloud=aws

1.5.1.48. oc adm release info

显示发行版本的信息

示例用法

  # Show information about the cluster's current release
  oc adm release info

  # Show the source code that comprises a release
  oc adm release info 4.2.2 --commit-urls

  # Show the source code difference between two releases
  oc adm release info 4.2.0 4.2.2 --commits

  # Show where the images referenced by the release are located
  oc adm release info quay.io/openshift-release-dev/ocp-release:4.2.2 --pullspecs

1.5.1.49. oc adm release mirror

将发行版本 mirror 到不同的镜像 registry 位置

示例用法

  # Perform a dry run showing what would be mirrored, including the mirror objects
  oc adm release mirror 4.3.0 --to myregistry.local/openshift/release \
  --release-image-signature-to-dir /tmp/releases --dry-run

  # Mirror a release into the current directory
  oc adm release mirror 4.3.0 --to file://openshift/release \
  --release-image-signature-to-dir /tmp/releases

  # Mirror a release to another directory in the default location
  oc adm release mirror 4.3.0 --to-dir /tmp/releases

  # Upload a release from the current directory to another server
  oc adm release mirror --from file://openshift/release --to myregistry.com/openshift/release \
  --release-image-signature-to-dir /tmp/releases

  # Mirror the 4.3.0 release to repository registry.example.com and apply signatures to connected cluster
  oc adm release mirror --from=quay.io/openshift-release-dev/ocp-release:4.3.0-x86_64 \
  --to=registry.example.com/your/repository --apply-release-image-signature

1.5.1.50. oc adm release new

创建新的 OpenShift 发行版本

示例用法

  # Create a release from the latest origin images and push to a DockerHub repo
  oc adm release new --from-image-stream=4.1 -n origin --to-image docker.io/mycompany/myrepo:latest

  # Create a new release with updated metadata from a previous release
  oc adm release new --from-release registry.svc.ci.openshift.org/origin/release:v4.1 --name 4.1.1 \
  --previous 4.1.0 --metadata ... --to-image docker.io/mycompany/myrepo:latest

  # Create a new release and override a single image
  oc adm release new --from-release registry.svc.ci.openshift.org/origin/release:v4.1 \
  cli=docker.io/mycompany/cli:latest --to-image docker.io/mycompany/myrepo:latest

  # Run a verification pass to ensure the release can be reproduced
  oc adm release new --from-release registry.svc.ci.openshift.org/origin/release:v4.1

1.5.1.51. oc adm taint

更新一个或多个节点上的污点

示例用法

  # Update node 'foo' with a taint with key 'dedicated' and value 'special-user' and effect 'NoSchedule'.
  # If a taint with that key and effect already exists, its value is replaced as specified.
  oc adm taint nodes foo dedicated=special-user:NoSchedule

  # Remove from node 'foo' the taint with key 'dedicated' and effect 'NoSchedule' if one exists.
  oc adm taint nodes foo dedicated:NoSchedule-

  # Remove from node 'foo' all the taints with key 'dedicated'
  oc adm taint nodes foo dedicated-

  # Add a taint with key 'dedicated' on nodes having label mylabel=X
  oc adm taint node -l myLabel=X  dedicated=foo:PreferNoSchedule

  # Add to node 'foo' a taint with key 'bar' and no value
  oc adm taint nodes foo bar:NoSchedule

1.5.1.52. oc adm top images

显示镜像的用量统计

示例用法

  # Show usage statistics for images
  oc adm top images

1.5.1.53. oc adm top imagestreams

显示镜像流的用量统计

示例用法

  # Show usage statistics for image streams
  oc adm top imagestreams

1.5.1.54. oc adm top node

显示节点的资源(CPU/内存)使用情况

示例用法

  # Show metrics for all nodes
  oc adm top node

  # Show metrics for a given node
  oc adm top node NODE_NAME

1.5.1.55. oc adm top pod

显示 pod 的资源(CPU/内存)使用情况

示例用法

  # Show metrics for all pods in the default namespace
  oc adm top pod

  # Show metrics for all pods in the given namespace
  oc adm top pod --namespace=NAMESPACE

  # Show metrics for a given pod and its containers
  oc adm top pod POD_NAME --containers

  # Show metrics for the pods defined by label name=myLabel
  oc adm top pod -l name=myLabel

1.5.1.56. oc adm uncordon

将节点标记为可调度

示例用法

  # Mark node "foo" as schedulable.
  $ oc adm uncordon foo

1.5.1.57. oc adm verify-image-signature

验证镜像签名中包含的镜像身份

示例用法

  # Verify the image signature and identity using the local GPG keychain
  oc adm verify-image-signature sha256:c841e9b64e4579bd56c794bdd7c36e1c257110fd2404bebbb8b613e4935228c4 \
  --expected-identity=registry.local:5000/foo/bar:v1

  # Verify the image signature and identity using the local GPG keychain and save the status
  oc adm verify-image-signature sha256:c841e9b64e4579bd56c794bdd7c36e1c257110fd2404bebbb8b613e4935228c4 \
  --expected-identity=registry.local:5000/foo/bar:v1 --save

  # Verify the image signature and identity via exposed registry route
  oc adm verify-image-signature sha256:c841e9b64e4579bd56c794bdd7c36e1c257110fd2404bebbb8b613e4935228c4 \
  --expected-identity=registry.local:5000/foo/bar:v1 \
  --registry-url=docker-registry.foo.com

  # Remove all signature verifications from the image
  oc adm verify-image-signature sha256:c841e9b64e4579bd56c794bdd7c36e1c257110fd2404bebbb8b613e4935228c4 --remove-all

1.5.2. 其他资源

1.6. oc 和 kubectl 命令的使用方法

Kubernetes 命令行界面(CLI)kubectl 可以用来对 Kubernetes 集群运行命令。由于 OpenShift Container Platform 是经过认证的 Kubernetes 发行版本,因此您可以使用 OpenShift Container Platform 附带的受支持的 kubectl 二进制文件,或者使用 oc 二进制文件来获得扩展的功能。

1.6.1. oc 二进制文件

oc 二进制文件提供与 kubectl 二进制文件相同的功能,但它经过扩展,可原生支持额外的 OpenShift Container Platform 功能,包括:

  • 对 OpenShift Container Platform 资源的完整支持

    DeploymentConfigBuildConfigRouteImageStreamImageStreamTag 对象等资源特定于 OpenShift Container Platform 发行版本,并基于标准 Kubernetes 原语构建。

  • 身份验证

    oc 二进制文件提供了一个内置 login 命令,此命令可进行身份验证,并让您处理 OpenShift Container Platform 项目,这会将 Kubernetes 命名空间映射到经过身份验证的用户。如需更多信息,请参阅了解身份验证

  • 附加命令

    例如,借助附加命令 oc new-app 可以更轻松地使用现有源代码或预构建镜像来启动新的应用程序。同样,附加命令 oc new-project 让您可以更轻松地启动一个项目并切换到该项目作为您的默认项目。

1.6.2. kubectl 二进制文件

提供 kubectl 二进制文件的目的是为来自标准 Kubernetes 环境的新 OpenShift Container Platform 用户或者希望使用 kubectl CLI 的用户支持现有工作流和脚本。kubectl 的现有用户可以继续使用二进制文件与 Kubernetes 原语交互,而不需要对 OpenShift Container Platform 集群进行任何更改。

您可以按照安装 OpenShift CLI 的步骤安装受支持的 kubectl 二进制文件。如果您下载二进制文件,或者在使用 RPM 安装 CLI 时安装,则 kubectl 二进制文件会包括在存档中。

如需更多信息,请参阅 kubectl 文档

第 2 章 开发人员 CLI (odo)

2.1. {odo-title} 发行注记

2.1.1. odo 的主要变化和功能增强

  • odo 现在支持 Devfile v2。
  • odo create -s2i 现在将 S2I 组件转换为 devfile 组件。在运行 odo create --s2i <component-type> odo 时,现在会根据指定组件类型的 S2I 镜像创建转换的 Devfile 组件。

    请注意,这个特性引入了多个可能具有破坏性的更改,请参阅已知问题以了解更多信息。

  • 现在,基于 Operator 的服务仅在运行 odo push 后在集群中创建,而不是在 odo service 后创建。
  • 现在,您可以使用 --container 标志指定在运行 odo storage create 命令时附加存储的容器。请参阅在特定容器中添加存储以了解详细信息。
  • 如果多个 registry 中的组件使用了相同的名称,odo catalog component describe 现在可以返回正确的 JSON。
  • 现在,在集群中直接实现更改的命令会显示一条信息,告知用户不需要使用 odo push
  • 在从 devfile 创建组件时,如果没有指定名称,odo create 现在会使用默认组件名称。
  • odo 现在有 Telemetry。请参阅 Telemetry 部分,了解如何修改 Telemetry consent 的首选项。
  • 使用 odo service,您现在可以在 devfile 中添加或删除自定义资源定义和 ServiceInstance 信息。

2.1.2. 获取支持

对于文档

如果您在文档中发现错误或者有改进文档的建议,请在 Bugzilla 中提交问题。选择 OpenShift Container Platform 产品类型和 Documentation 组件类型。

对于产品

如果您发现了错误,遇到问题或者有改进 odo 功能的建议,请在 Bugzilla 中提交问题。选择 OpenShift Developer Tools and Services 作为产品类型,odo 作为组件。

请在问题描述中提供尽可能多的细节。

2.1.3. 已知问题

  • Bug 1760574 已删除的命名空间在 odo project get 命令中列出。
  • Bug 1760586 odo delete 命令在项目被删除及一个组件名称被设置后,会出现一个死循环。
  • Bug 1760588 odo service create 命令在 Cygwin 中运行时会崩溃。
  • Bug 1760590 在 Git BASH for Windows 中,odo login -u developer 命令在请求时没有隐藏输入的密码。
  • Bug 1783188 在断开连接的集群中,odo component create 命令会抛出一个错误 …​tag not found… ​尽管组件列在目录列表中。
  • Bug 1761440 在一个项目中不可能创建同一类型的两个服务。
  • Bug 1821643 odo push 在 .NET 组件标签 2.1+ 上无法工作。

    临时解决方案: 运行以下命令来指定您的 .NET 项目文件:

    $ odo config set --env DOTNET_STARTUP_PROJECT=<path_to_your_project>
  • odo create --s2i 后运行 odo url create,命令会失败。odo 现在会直接创建一个 URL,而无需询问。
  • odo create 无法创建 Wildfly 和 dotnet S2I 组件。
  • odo env set DebugPort 无法与转换的 devfile 组件一起使用。临时解决方案: 使用 odo config set --env DEBUG_PORT
  • odo delete --wait 不会为 devfile 组件等待资源被终止。

2.2. 了解 odo

odo 是一个在 OpenShift Container Platform 和 Kubernetes 上创建应用程序的 CLI 工具。通过 odo,您可以在集群中编写、构建和调试应用程序,而无需对集群本身进行管理。odo 会自动创建部署配置、构建配置、服务路由和其他 OpenShift Container Platform 或 Kubernetes 元素。

现有工具如 oc 注重于操作,需要对 Kubernetes 和 OpenShift Container Platform 概念有深入了解。odo 会处理与 Kubernetes 和 OpenShift Container Platform 相关的复杂概念,从而使开发人员可以把主要精力专注于最重要的内容:代码。

2.2.1. 主要特性

odo 的设计是简单而简洁的,其主要特性如下:

  • 简单的语法,围绕开发人员熟悉的概念(比如项目、应用程序和组件)进行设计。
  • 完全基于客户端。部署不需要 OpenShift Container Platform 以外的服务器。
  • 对 Node.js 和 Java 组件的官方支持。
  • 与各种语言和框架兼容,比如 Ruby 、Perl 、PHP 和 Python 部分兼容。
  • 它会检测本地代码的更改,并自动将其部署到集群中,为验证更改提供即时反馈。
  • 列出集群中的所有可用组件和服务。

2.2.2. 核心概念

Project(项目)
项目是一个用来对源代码、测试和库进行管理的独立空间。
Application(应用程序)
应用程序是为最终用户设计的程序。应用程序由多个微服务或组件组成,它们单独用来构建整个应用程序。应用程序示例:视频游戏、媒体播放器、网页浏览器。
组件
组件就是一组 Kubernetes 资源,用于托管代码或数据。每个组件可以单独运行和部署。组件示例:Node.js、Perl、PHP、Python、Ruby。
Service
服务是您的组件链接到或依赖的软件。服务示例:MariaDB、Jenkins、MySQL。在 odo 中,服务从 OpenShift Service Catalog 置备,且必须在集群中启用。

2.2.2.1. 官方支持的语言和相应的容器镜像

表 2.1. 支持的语言、容器镜像、软件包管理器和平台

语言容器镜像软件包管理器平台

Node.js

rhscl/nodejs-10-rhel7

NPM

amd64、s390x、ppc64le

 

rhscl/nodejs-12-rhel7

NPM

amd64、s390x、ppc64le

Java

redhat-openjdk-18/openjdk18-openshift

Maven,Gradle

amd64、s390x、ppc64le

 

openjdk/openjdk-11-rhel8

Maven,Gradle

amd64、s390x、ppc64le

 

openjdk/openjdk-11-rhel7

Maven,Gradle

amd64、s390x、ppc64le

2.2.2.1.1. 列出可用的容器镜像
注意

可用的容器镜像列表从集群的内部容器 registry 以及与集群关联的外部 registry 提供。

要列出集群的可用组件和相关容器镜像,请执行以下操作:

  1. 使用 odo 登陆到集群:

    $ odo login -u developer -p developer
  2. 要列出可用的 odo 支持和不支持的组件以及相应的容器镜像,请执行以下操作:

    $ odo catalog list components

    输出示例

    Odo Devfile Components:
    NAME                 DESCRIPTION                            REGISTRY
    java-maven           Upstream Maven and OpenJDK 11          DefaultDevfileRegistry
    java-openliberty     Open Liberty microservice in Java      DefaultDevfileRegistry
    java-quarkus         Upstream Quarkus with Java+GraalVM     DefaultDevfileRegistry
    java-springboot      Spring Boot® using Java                DefaultDevfileRegistry
    nodejs               Stack with NodeJS 12                   DefaultDevfileRegistry
    
    Odo OpenShift Components:
    NAME        PROJECT       TAGS                                                                           SUPPORTED
    java        openshift     11,8,latest                                                                    YES
    dotnet      openshift     2.1,3.1,latest                                                                 NO
    golang      openshift     1.13.4-ubi7,1.13.4-ubi8,latest                                                 NO
    httpd       openshift     2.4-el7,2.4-el8,latest                                                         NO
    nginx       openshift     1.14-el7,1.14-el8,1.16-el7,1.16-el8,latest                                     NO
    nodejs      openshift     10-ubi7,10-ubi8,12-ubi7,12-ubi8,latest                                         NO
    perl        openshift     5.26-el7,5.26-ubi8,5.30-el7,latest                                             NO
    php         openshift     7.2-ubi7,7.2-ubi8,7.3-ubi7,7.3-ubi8,latest                                     NO
    python      openshift     2.7-ubi7,2.7-ubi8,3.6-ubi7,3.6-ubi8,3.8-ubi7,3.8-ubi8,latest                   NO
    ruby        openshift     2.5-ubi7,2.5-ubi8,2.6-ubi7,2.6-ubi8,2.7-ubi7,latest                            NO
    wildfly     openshift     10.0,10.1,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,8.1,9.0,latest     NO

    TAGS 列代表可用镜像版本,例如:10 代表 rhoar-nodejs/nodejs-10 容器镜像。要了解更多有关 CLI 命令的信息,请参阅 odo CLI 参考

2.2.2.2. odo 中的 Telemetry

odo 会收集有关如何使用 odo 的信息:操作系统、内存、CPU 大小、内核数、odo 版本、错误、成功/失败以及命令完成所需时间。

您可以使用 odo preference 修改您的 Telemetry 许可:

  • odo preference set ConsentTelemetry true 会许可使用 Telemetry。
  • odo preference unset ConsentTelemetry 会禁用 Telemetry。
  • odo preference view 来验证当前的首选项。

2.3. 安装 odo

下面的部分论述了如何使用 CLI 或 Visual Studio Code(VS Code)IDE 在不同的平台中安装 odo

注意

目前,odo 不支持在限制的网络环境中安装。

在 OpenShift Container Platform web 控制台中,点右上角的 ? 图标并选 Command Line Tools

2.3.1. 在 Linux 中安装 odo

2.3.1.1. 二进制安装

流程

  1. 获取二进制文件:

    # curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-linux-amd64 -o /usr/local/bin/odo
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.1.2. tarball 安装

流程

  1. 获取 tarball:

    # sh -c 'curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-linux-amd64.tar.gz | gzip -d > /usr/local/bin/odo'
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.1.3. 在 Red Hat Enterprise Linux(RHEL)中使用 yum 安装

流程

  1. 使用 Red Hat Subscription Manager 注册:

    # subscription-manager register
  2. 获取最新的订阅数据:

    # subscription-manager refresh
  3. 列出可用的订阅:

    # subscription-manager list --available --matches '*OpenShift Developer Tools and Services*'
  4. 在上一命令的输出中,找到 OpenShift Container Platform 订阅的 Pool ID 字段,并把订阅附加到注册的系统:

    # subscription-manager attach --pool=<pool_id>
  5. 启用 odo 所需的存储库:

    # subscription-manager repos --enable="ocp-tools-4.8-for-rhel-8-x86_64-rpms"
  6. 安装 odo 软件包:

    # yum install odo
  7. 验证您的系统中现在可用的 odo

    $ odo version

2.3.2. 在 IBM Power 的 Linux 上安装 odo

2.3.2.1. 二进制安装

流程

  1. 获取二进制文件:

    # curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-linux-ppc64le -o /usr/local/bin/odo
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.2.2. tarball 安装

流程

  1. 获取 tarball:

    # sh -c 'curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-linux-ppc64le.tar.gz | gzip -d > /usr/local/bin/odo'
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.3. 在 IBM Z 和 LinuxONE 的 Linux 中安装 odo

2.3.3.1. 二进制安装

流程

  1. 获取二进制文件:

    # curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-linux-s390x -o /usr/local/bin/odo
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.3.2. tarball 安装

流程

  1. 获取 tarball:

    # sh -c 'curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-linux-s390x.tar.gz | gzip -d > /usr/local/bin/odo'
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.4. 在 Windows 中安装 odo

2.3.4.1. 二进制安装

  1. 下载最新的 odo.exe 文件。
  2. odo.exe 所在位置添加到 GOPATH/bin 目录中。
为 Windows 7/8 设置 PATH 变量

以下示例演示了如何设置路径变量。您的二进制文件可以位于任何位置,在本例中使用 C:\go-bin

  1. C:\go-bin创建一个文件夹。
  2. 右键点击 Start 并点击 Control Panel
  3. 选择 系统和安全性 ,然后点击 系统
  4. 在左侧的菜单中选择高级系统设置并点击底部的环境变量按钮。
  5. 变量部分选择路径并点编辑
  6. 新建并输入C:\go-bin ,或者点击 浏览 并选择目录,然后点击 确定
为 Windows 10 设置 PATH 变量

使用搜索编辑 环境变量

  1. 点击 搜索 并输入 env 或者 environment
  2. 选择为您的帐户编辑环境变量
  3. 变量部分选择路径并点编辑
  4. 新建并输入C:\go-bin ,或者点击 浏览 并选择目录,然后点击 确定

2.3.5. 在 macOS 中安装 odo

2.3.5.1. 二进制安装

流程

  1. 获取二进制文件:

    # curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-darwin-amd64 -o /usr/local/bin/odo
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.5.2. tarball 安装

流程

  1. 获取 tarball:

    # sh -c 'curl -L https://mirror.openshift.com/pub/openshift-v4/clients/odo/latest/odo-darwin-amd64.tar.gz | gzip -d > /usr/local/bin/odo'
  2. 更改该文件的权限:

    # chmod +x /usr/local/bin/odo

2.3.6. 在 VS Code 上安装 odo

OpenShift VS Code 扩展 使用 odooc 二进制文件来与 OpenShift Container Platform 集群交互。要使用这些功能,在 VS Code 中安装 OpenShift VS Code 扩展。

先决条件

  • 您已安装了 VS Code。

流程

  1. 打开 VS Code.
  2. 使用 Ctrl+P 启动 VS Code Quick Open。
  3. 使用以下命令:

    $ ext install redhat.vscode-openshift-connector

2.4. 使用 odo 创建和部署应用程序

2.4.1. 处理项目

项目将源代码、测试和库保存在一个单独的单元中。

2.4.1.1. 创建一个项目

创建一个项目来在一个独立的空间内保存源代码、测试并对库进行管理。

流程

  1. 登陆到一个OpenShift Container Platform集群。

    $ odo login -u developer -p developer
  2. 创建一个项目:

    $ odo project create myproject

    输出示例

     ✓  Project 'myproject' is ready for use
     ✓  New project created and now using project : myproject

2.4.2. 使用 odo 创建单组件应用程序

使用 odo,您可以在集群中从创建和部署应用程序。

先决条件

  • 已安装了 odo
  • 有一个正在运行的集群。您可以使用 CodeReady Containers (CRC) 来快速部署一个本地的集群。

2.4.2.1. 创建一个项目

创建一个项目来在一个独立的空间内保存源代码、测试并对库进行管理。

流程

  1. 登陆到一个OpenShift Container Platform集群。

    $ odo login -u developer -p developer
  2. 创建一个项目:

    $ odo project create myproject

    输出示例

     ✓  Project 'myproject' is ready for use
     ✓  New project created and now using project : myproject

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

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

流程

  1. 为您的组件创建一个新目录:

    $ mkdir my_components && cd my_components
  2. 下载示例 Node.js 应用程序:

    $ git clone https://github.com/openshift/nodejs-ex
  3. 将当前目录变为您的应用程序的目录:

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

    $ odo create nodejs
    注意

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

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

    $ odo push

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

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

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

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

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

    $ curl <url>

2.4.2.3. 修改应用程序代码

您可以修改应用程序代码,并将更改应用于 OpenShift Container Platform 上的应用程序。

  1. 使用文本编辑器编辑 Node.js 目录中的一个布局文件。
  2. 更新您的组件:

    $ odo push
  3. 刷新浏览器中的应用程序查看更改。

2.4.2.4. 在应用程序组件中添加存储

使用 odo storage 命令为应用程序添加持久性数据。必须持久化的数据示例包括数据库文件、依赖项和构建工件,如 .m2 Maven 目录。

流程

  1. 在组件中添加存储:

    $ odo storage create <storage_name> --path=<path_to_the_directory> --size=<size>
  2. 将存储推送到集群:

    $ odo push
  3. 通过列出组件中的所有存储来验证存储现在附加到您的组件中:

    $ odo storage list

    输出示例

    The component 'nodejs' has the following storage attached:
    NAME           SIZE     PATH      STATE
    mystorage      1Gi      /data     Pushed

  4. 从您的组件中删除存储:

    $ odo storage delete <storage_name>
  5. 列出所有存储以验证存储状态是否本地删除:

    $ odo storage list

    输出示例

    The component 'nodejs' has the following storage attached:
    NAME           SIZE     PATH      STATE
    mystorage      1Gi      /data     Locally Deleted

  6. 将更改推送到集群:

    $ odo push

2.4.2.5. 添加自定义构建者来指定构建镜像

在 OpenShift Container Platform 中,您可以添加自定义镜像来缩小创建自定义镜像间的差距。

以下示例显示 redhat-openjdk-18 镜像已被成功导入并使用:

先决条件

  • 安装了 OpenShift CLI (oc) 。

流程

  1. 将镜像导入 OpenShift Container Platform:

    $ oc import-image openjdk18 \
    --from=registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift \
    --confirm
  2. 标记(tag)镜像使其可以被 odo 访问:

    $ oc annotate istag/openjdk18:latest tags=builder
  3. 使用 odo 部署镜像:

    $ odo create openjdk18 --git \
    https://github.com/openshift-evangelists/Wild-West-Backend

2.4.2.6. 使用 OpenShift Service Catalog 将应用程序连接到多个服务

OpenShift Service Catalog 是 Kubernetes 的 Open Service Broker API (OSB API) 的一个实现。您可以使用它将部署在 OpenShift Container Platform 中的应用程序连接到各种服务。

先决条件

  • 有一个正在运行的 OpenShift Container Platform 集群。
  • 在集群中安装并启用该 service catalog。

流程

  • 要列出服务,请使用:

    $ odo catalog list services
  • 要使用 service catalog 相关的操作:

    $ odo service <verb> <service_name>

2.4.2.7. 删除应用程序

使用 odo app delete 命令删除应用程序。

流程

  1. 列出当前项目中的应用程序:

    $ odo app list

    输出示例

        The project '<project_name>' has the following applications:
        NAME
        app

  2. 列出与应用程序关联的组件。这些组件将随应用程序一起删除:

    $ odo component list

    输出示例

        APP     NAME                      TYPE       SOURCE        STATE
        app     nodejs-nodejs-ex-elyf     nodejs     file://./     Pushed

  3. 删除应用程序:

    $ odo app delete <application_name>

    输出示例

        ? Are you sure you want to delete the application: <application_name> from project: <project_name>

  4. 使用 Y 确认删除。您可以使用 -f 标记来阻止确认提示。

2.4.3. 使用 odo 创建多组件应用程序

通过使用 odo,可以创建多组件应用程序,修改该应用程序,并以方便和自动的方式链接其组件。

这个例子描述了如何部署多组件应用程序 - 一个射击游戏。应用程序由一个前端 Node.js 组件和一个后端 Java 组件组成。

先决条件

  • 已安装了 odo
  • 有一个正在运行的集群。开发人员可以使用 CodeReady Containers (CRC) 来快速部署一个本地的集群。
  • 已安装 Maven。

2.4.3.1. 创建一个项目

创建一个项目来在一个独立的空间内保存源代码、测试并对库进行管理。

流程

  1. 登陆到一个OpenShift Container Platform集群。

    $ odo login -u developer -p developer
  2. 创建一个项目:

    $ odo project create myproject

    输出示例

     ✓  Project 'myproject' is ready for use
     ✓  New project created and now using project : myproject

2.4.3.2. 部署后端组件

要创建一个 Java 组件,请导入 Java 构建器镜像(builder image),下载 Java 应用程序并使用 odo将源代码推送到您的集群中。

流程

  1. openjdk18 导入集群:

    $ oc import-image openjdk18 \
    --from=registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift --confirm
  2. 将镜像标记为 builder,使它可以被 odo 访问:

    $ oc annotate istag/openjdk18:latest tags=builder
  3. 运行 odo catalog list components 查看创建的镜像:

    $ odo catalog list components

    输出示例

    Odo Devfile Components:
    NAME                 DESCRIPTION                            REGISTRY
    java-maven           Upstream Maven and OpenJDK 11          DefaultDevfileRegistry
    java-openliberty     Open Liberty microservice in Java      DefaultDevfileRegistry
    java-quarkus         Upstream Quarkus with Java+GraalVM     DefaultDevfileRegistry
    java-springboot      Spring Boot® using Java                DefaultDevfileRegistry
    nodejs               Stack with NodeJS 12                   DefaultDevfileRegistry
    
    Odo OpenShift Components:
    NAME        PROJECT       TAGS                                                                           SUPPORTED
    java        openshift     11,8,latest                                                                    YES
    dotnet      openshift     2.1,3.1,latest                                                                 NO
    golang      openshift     1.13.4-ubi7,1.13.4-ubi8,latest                                                 NO
    httpd       openshift     2.4-el7,2.4-el8,latest                                                         NO
    nginx       openshift     1.14-el7,1.14-el8,1.16-el7,1.16-el8,latest                                     NO
    nodejs      openshift     10-ubi7,10-ubi8,12-ubi7,12-ubi8,latest                                         NO
    perl        openshift     5.26-el7,5.26-ubi8,5.30-el7,latest                                             NO
    php         openshift     7.2-ubi7,7.2-ubi8,7.3-ubi7,7.3-ubi8,latest                                     NO
    python      openshift     2.7-ubi7,2.7-ubi8,3.6-ubi7,3.6-ubi8,3.8-ubi7,3.8-ubi8,latest                   NO
    ruby        openshift     2.5-ubi7,2.5-ubi8,2.6-ubi7,2.6-ubi8,2.7-ubi7,latest                            NO
    wildfly     openshift     10.0,10.1,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,8.1,9.0,latest     NO

  4. 为您的组件创建一个新目录:

    $ mkdir my_components && cd my_components
  5. 下载后端应用程序示例:

    $ git clone https://github.com/openshift-evangelists/Wild-West-Backend backend
  6. 进入后端源目录:

    $ cd backend
  7. 检查目录中有正确的文件:

    $ ls

    输出示例

    debug.sh  pom.xml  src

  8. 使用 Maven 构建后端源文件以创建一个 JAR 文件:

    $ mvn package

    输出示例

    ...
    [INFO] --------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] --------------------------------------
    [INFO] Total time: 2.635 s
    [INFO] Finished at: 2019-09-30T16:11:11-04:00
    [INFO] Final Memory: 30M/91M
    [INFO] --------------------------------------

  9. 创建名为 backend的 Java 组件类型组件配置:

    $ odo create --s2i openjdk18 backend --binary target/wildwest-1.0.jar

    输出示例

     ✓  Validating component [1ms]
     Please use `odo push` command to create the component with source deployed

    现在,配置文件 config.yaml 位于后端组件的本地目录中,其中包含用于部署的组件信息。

  10. 使用以下方法检查 config.yaml 文件中后端组件的配置设置:

    $ odo config view

    输出示例

    COMPONENT SETTINGS
    ------------------------------------------------
    PARAMETER         CURRENT_VALUE
    Type              openjdk18
    Application       app
    Project           myproject
    SourceType        binary
    Ref
    SourceLocation    target/wildwest-1.0.jar
    Ports             8080/TCP,8443/TCP,8778/TCP
    Name              backend
    MinMemory
    MaxMemory
    DebugPort
    Ignore
    MinCPU
    MaxCPU

  11. 将组件推送到 OpenShift Container Platform 集群。

    $ odo push

    输出示例

    Validation
     ✓  Checking component [6ms]
    
    Configuration changes
     ✓  Initializing component
     ✓  Creating component [124ms]
    
    Pushing to component backend of type binary
     ✓  Checking files for pushing [1ms]
     ✓  Waiting for component to start [48s]
     ✓  Syncing files to the component [811ms]
     ✓  Building component [3s]

    使用 odo push,OpenShift Container Platform 创建一个容器来托管后端组件,将容器部署到运行在 OpenShift Container Platform 集群上的 pod 中,并启动 backend 组件。

  12. 验证:

    • odo 中操作的状态:

      $ odo log -f

      输出示例

      2019-09-30 20:14:19.738  INFO 444 --- [           main] c.o.wildwest.WildWestApplication         : Starting WildWestApplication v1.0 onbackend-app-1-9tnhc with PID 444 (/deployments/wildwest-1.0.jar started by jboss in /deployments)

    • 后端组件的状态:

      $ odo list

      输出示例

      APP     NAME        TYPE          SOURCE                             STATE
      app     backend     openjdk18     file://target/wildwest-1.0.jar     Pushed

2.4.3.3. 部署前端组件

要创建并部署前端组件,请下载 Node.js 应用程序并使用 odo将源代码推送到集群中。

流程

  1. 下载前端应用程序示例:

    $ git clone https://github.com/openshift/nodejs-ex frontend
  2. 将当前目录改为前端目录:

    $ cd frontend
  3. 列出目录的内容,以查看前端是一个 Node.js 应用程序。

    $ ls

    输出示例

    README.md       openshift       server.js       views
    helm            package.json    tests

    注意

    前端组件使用解释语言 (Node.js) 编写,不需要构建它。

  4. 创建名为 frontend的 Node.js 组件类型组件配置:

    $ odo create --s2i nodejs frontend

    输出示例

     ✓  Validating component [5ms]
    Please use `odo push` command to create the component with source deployed

  5. 将组件推送到正在运行的容器中。

    $ odo push

    输出示例

    Validation
     ✓  Checking component [8ms]
    
    Configuration changes
     ✓  Initializing component
     ✓  Creating component [83ms]
    
    Pushing to component frontend of type local
     ✓  Checking files for pushing [2ms]
     ✓  Waiting for component to start [45s]
     ✓  Syncing files to the component [3s]
     ✓  Building component [18s]
     ✓  Changes successfully pushed to component

2.4.3.4. 连接两个组件

集群中运行的组件需要连接才能进行交互。OpenShift Container Platform 提供了链接机制以发布一个程序到其客户端的通信绑定。

流程

  1. 列出在集群中运行的所有组件:

    $ odo list

    输出示例

    OpenShift Components:
    APP     NAME         PROJECT     TYPE          SOURCETYPE     STATE
    app     backend      testpro     openjdk18     binary         Pushed
    app     frontend     testpro     nodejs        local          Pushed

  2. 将当前的前端组件链接到后端:

    $ odo link backend --port 8080

    输出示例

     ✓  Component backend has been successfully linked from the component frontend
    
    Following environment variables were added to frontend component:
    - COMPONENT_BACKEND_HOST
    - COMPONENT_BACKEND_PORT

    后端组件的配置信息被添加到前端组件中,前端组件重新启动。

2.4.3.5. 公开组件

流程

  1. 进入 frontend 目录:

    $ cd frontend
  2. 为应用程序创建一个外部 URL:

    $ odo url create frontend --port 8080

    输出示例

     ✓  URL frontend created for component: frontend
    
    To create URL on the OpenShift  cluster, use `odo push`

  3. 应用更改:

    $ odo push

    输出示例

    Validation
     ✓  Checking component [21ms]
    
    Configuration changes
     ✓  Retrieving component data [35ms]
     ✓  Applying configuration [29ms]
    
    Applying URL changes
     ✓  URL frontend: http://frontend-app-myproject.192.168.42.79.nip.io created
    
    Pushing to component frontend of type local
     ✓  Checking file changes for pushing [1ms]
     ✓  No file changes detected, skipping build. Use the '-f' flag to force the build.

  4. 在一个浏览器中使用 URL 来查看应用程序。
注意

如果一个应用程序需要一个有效的服务账户来访问 OpenShift Container Platform 命名空间并删除活跃的 pod 时,后端组件的 odo log 中可能会出现以下错误:

Message: Forbidden!Configured service account doesn’t have access.Service account may have been revoked

要解决这个错误,请服务帐户角色添加权限:

$ oc policy add-role-to-group view system:serviceaccounts -n <project>
$ oc policy add-role-to-group edit system:serviceaccounts -n <project>

不要在生产环境集群中使用它。

2.4.3.6. 修改正在运行的应用程序

流程

  1. 将本地目录改为前端目录:

    $ cd frontend
  2. 使用以下方法监控文件系统中的更改:

    $ odo watch
  3. 编辑 index.html 文件,为游戏更改显示的名称。

    注意

    在 odo 可以识别更改前可能会有一些延迟。

    odo 将更改推送到前端组件,并将其状态输出到终端:

    File /root/frontend/index.html changed
    File  changed
    Pushing files...
     ✓  Waiting for component to start
     ✓  Copying files to component
     ✓  Building component
  4. 在浏览器中刷新应用程序页面。现在会显示新名称。

2.4.3.7. 删除应用程序

使用 odo app delete 命令删除应用程序。

流程

  1. 列出当前项目中的应用程序:

    $ odo app list

    输出示例

        The project '<project_name>' has the following applications:
        NAME
        app

  2. 列出与应用程序关联的组件。这些组件将随应用程序一起删除:

    $ odo component list

    输出示例

        APP     NAME                      TYPE       SOURCE        STATE
        app     nodejs-nodejs-ex-elyf     nodejs     file://./     Pushed

  3. 删除应用程序:

    $ odo app delete <application_name>

    输出示例

        ? Are you sure you want to delete the application: <application_name> from project: <project_name>

  4. 使用 Y 确认删除。您可以使用 -f 标记来阻止确认提示。

2.4.4. 创建带有数据库的应用程序

这个示例描述了如何部署和连接数据库到前端应用程序。

先决条件

  • 已安装了 odo
  • 已安装oc 客户端。
  • 有一个正在运行的集群。开发人员可以使用 CodeReady Containers (CRC) 来快速部署一个本地的集群。
  • 在集群中安装并启用该 Service Catalog。

    注意

    OpenShift Container Platform 4 及以后的版本弃用了 Service Catalog。

2.4.4.1. 创建一个项目

创建一个项目来在一个独立的空间内保存源代码、测试并对库进行管理。

流程

  1. 登陆到一个OpenShift Container Platform集群。

    $ odo login -u developer -p developer
  2. 创建一个项目:

    $ odo project create myproject

    输出示例

     ✓  Project 'myproject' is ready for use
     ✓  New project created and now using project : myproject

2.4.4.2. 部署前端组件

要创建并部署前端组件,请下载 Node.js 应用程序并使用 odo将源代码推送到集群中。

流程

  1. 下载前端应用程序示例:

    $ git clone https://github.com/openshift/nodejs-ex frontend
  2. 将当前目录改为前端目录:

    $ cd frontend
  3. 列出目录的内容,以查看前端是一个 Node.js 应用程序。

    $ ls

    输出示例

    README.md       openshift       server.js       views
    helm            package.json    tests

    注意

    前端组件使用解释语言 (Node.js) 编写,不需要构建它。

  4. 创建名为 frontend的 Node.js 组件类型组件配置:

    $ odo create --s2i nodejs frontend

    输出示例

     ✓  Validating component [5ms]
    Please use `odo push` command to create the component with source deployed

  5. 创建一个 URL 来访问前台接口。

    $ odo url create myurl

    输出示例

     ✓  URL myurl created for component: nodejs-nodejs-ex-pmdp

  6. 将组件推送到 OpenShift Container Platform 集群。

    $ odo push

    输出示例

    Validation
     ✓  Checking component [7ms]
    
     Configuration changes
     ✓  Initializing component
     ✓  Creating component [134ms]
    
     Applying URL changes
     ✓  URL myurl: http://myurl-app-myproject.192.168.42.79.nip.io created
    
     Pushing to component nodejs-nodejs-ex-mhbb of type local
     ✓  Checking files for pushing [657850ns]
     ✓  Waiting for component to start [6s]
     ✓  Syncing files to the component [408ms]
     ✓  Building component [7s]
     ✓  Changes successfully pushed to component

2.4.4.3. 以互动模式部署数据库

odo 提供了一个简化部署的命令行互动模式。

流程

  • 运行互动模式并回答提示:

    $ odo service create

    输出示例

    ? Which kind of service do you wish to create database
    ? Which database service class should we use mongodb-persistent
    ? Enter a value for string property DATABASE_SERVICE_NAME (Database Service Name): mongodb
    ? Enter a value for string property MEMORY_LIMIT (Memory Limit): 512Mi
    ? Enter a value for string property MONGODB_DATABASE (MongoDB Database Name): sampledb
    ? Enter a value for string property MONGODB_VERSION (Version of MongoDB Image): 3.2
    ? Enter a value for string property VOLUME_CAPACITY (Volume Capacity): 1Gi
    ? Provide values for non-required properties No
    ? How should we name your service  mongodb-persistent
    ? Output the non-interactive version of the selected options No
    ? Wait for the service to be ready No
     ✓  Creating service [32ms]
     ✓  Service 'mongodb-persistent' was created
    Progress of the provisioning will not be reported and might take a long time.
    You can see the current status by executing 'odo service list'

注意

您的密码或用户名将作为环境变量传递给前端的应用程序。

2.4.4.4. 手动部署数据库

  1. 列出可用服务:

    $ odo catalog list services

    输出示例

    NAME                         PLANS
    django-psql-persistent       default
    jenkins-ephemeral            default
    jenkins-pipeline-example     default
    mariadb-persistent           default
    mongodb-persistent           default
    mysql-persistent             default
    nodejs-mongo-persistent      default
    postgresql-persistent        default
    rails-pgsql-persistent       default

  2. 选择 mongodb-persistent 服务类型,并查看所需参数:

    $ odo catalog describe service mongodb-persistent

    输出示例

      ***********************        | *****************************************************
      Name                           | default
      -----------------              | -----------------
      Display Name                   |
      -----------------              | -----------------
      Short Description              | Default plan
      -----------------              | -----------------
      Required Params without a      |
      default value                  |
      -----------------              | -----------------
      Required Params with a default | DATABASE_SERVICE_NAME
      value                          | (default: 'mongodb'),
                                     | MEMORY_LIMIT (default:
                                     | '512Mi'), MONGODB_VERSION
                                     | (default: '3.2'),
                                     | MONGODB_DATABASE (default:
                                     | 'sampledb'), VOLUME_CAPACITY
                                     | (default: '1Gi')
      -----------------              | -----------------
      Optional Params                | MONGODB_ADMIN_PASSWORD,
                                     | NAMESPACE, MONGODB_PASSWORD,
                                     | MONGODB_USER

  3. 指定所需参数,并等待数据库部署:

    $ odo service create mongodb-persistent --plan default --wait -p DATABASE_SERVICE_NAME=mongodb -p MEMORY_LIMIT=512Mi -p MONGODB_DATABASE=sampledb -p VOLUME_CAPACITY=1Gi

2.4.4.5. 将数据库连接到前端应用程序

  1. 将数据库连接到前端服务中:

    $ odo link mongodb-persistent

    输出示例

     ✓  Service mongodb-persistent has been successfully linked from the component nodejs-nodejs-ex-mhbb
    
    Following environment variables were added to nodejs-nodejs-ex-mhbb component:
    - database_name
    - password
    - uri
    - username
    - admin_password

  2. 查看 pod 中的应用程序和数据库的环境变量:

    1. 获取 pod 名称:

      $ oc get pods

      输出示例

      NAME                                READY     STATUS    RESTARTS   AGE
      mongodb-1-gsznc                     1/1       Running   0          28m
      nodejs-nodejs-ex-mhbb-app-4-vkn9l   1/1       Running   0          1m

    2. 连接到 pod:

      $ oc rsh nodejs-nodejs-ex-mhbb-app-4-vkn9l
    3. 检查环境变量:

      sh-4.2$ env

      输出示例

      uri=mongodb://172.30.126.3:27017
      password=dHIOpYneSkX3rTLn
      database_name=sampledb
      username=user43U
      admin_password=NCn41tqmx7RIqmfv

  3. 在浏览器中打开 URL ,并在右下角记录数据库配置:

    $ odo url list

    输出示例

    Request information
    Page view count: 24
    
    DB Connection Info:
    Type:	MongoDB
    URL:	mongodb://172.30.126.3:27017/sampledb

2.4.5. 创建带有数据库的 Java 应用程序

这个示例描述了如何使用 devfile 部署 Java 应用程序并将其连接到数据库服务。

先决条件

  • 一个正在运行的集群。
  • 已安装了 odo
  • 在集群中安装了 Service Binding Operator。了解如何安装 Operator,联络您的集群管理员,或参阅从 OperatorHub 安装 Operator
  • 在集群中安装了 Dev4Devs PostgreSQL Operator Operator。了解如何安装 Operator,联络您的集群管理员,或参阅从 OperatorHub 安装 Operator

2.4.5.1. 创建一个项目

创建一个项目来在一个独立的空间内保存源代码、测试并对库进行管理。

流程

  1. 登陆到一个OpenShift Container Platform集群。

    $ odo login -u developer -p developer
  2. 创建一个项目:

    $ odo project create myproject

    输出示例

     ✓  Project 'myproject' is ready for use
     ✓  New project created and now using project : myproject

2.4.5.2. 创建 Java MicroServices JPA 应用程序

使用 odo,您可以创建和管理一个 Java MicroServices JPA 应用程序示例。

流程

  1. 克隆示例应用程序:

    $ git clone -b jpa-sample https://github.com/redhat-developer/application-stack-samples.git
  2. 进入到应用程序目录:

    $ cd ./application-stack-samples/jpa
  3. 初始化项目:

    $ odo create java-openliberty java-application
  4. 将应用程序推送到集群:

    $ odo push

    现在,应用程序已被部署到集群中。

  5. 通过将 OpenShift Container Platform 日志流传输到终端来查看集群的状态:

    $ odo log

    请注意,测试失败并有 UnknownDatabaseHostException 错误。这是因为您的应用程序还没有数据库:

    [INFO] [err] java.net.UnknownHostException: ${DATABASE_CLUSTERIP}
    [INFO] [err]    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:220)
    [INFO] [err]    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    [INFO] [err]    at java.base/java.net.Socket.connect(Socket.java:609)
    [INFO] [err]    at org.postgresql.core.PGStream.<init>(PGStream.java:68)
    [INFO] [err]    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:144)
    [INFO] [err]    ... 86 more
    [ERROR] Tests run: 2, Failures: 1, Errors: 1, Skipped: 0, Time elapsed: 0.706 s <<< FAILURE! - in org.example.app.it.DatabaseIT
    [ERROR] testGetAllPeople  Time elapsed: 0.33 s  <<< FAILURE!
    org.opentest4j.AssertionFailedError: Expected at least 2 people to be registered, but there were only: [] ==> expected: <true> but was: <false>
            at org.example.app.it.DatabaseIT.testGetAllPeople(DatabaseIT.java:57)
    
    [ERROR] testGetPerson  Time elapsed: 0.047 s  <<< ERROR!
    java.lang.NullPointerException
            at org.example.app.it.DatabaseIT.testGetPerson(DatabaseIT.java:41)
    
    [INFO]
    [INFO] Results:
    [INFO]
    [ERROR] Failures:
    [ERROR]   DatabaseIT.testGetAllPeople:57 Expected at least 2 people to be registered, but there were only: [] ==> expected: <true> but was: <false>
    [ERROR] Errors:
    [ERROR]   DatabaseIT.testGetPerson:41 NullPointer
    [INFO]
    [ERROR] Tests run: 2, Failures: 1, Errors: 1, Skipped: 0
    [INFO]
    [ERROR] Integration tests failed: There are test failures.
  6. 创建入口 URL 以访问应用程序:

    $ odo url create --port 8080
  7. 将更改推送到集群:

    $ odo push
  8. 显示创建的 URL:

    $ odo url list

    输出示例

    Found the following URLs for component mysboproj
    NAME               STATE      URL                                           PORT     SECURE     KIND
    java-application-8080     Pushed     http://java-application-8080.apps-crc.testing     8080      false      ingress

    现在,应用程序已部署到集群中,您可以使用创建的 URL 访问它。

  9. 使用 URL 导航到 CreatePerson.xhtml 数据条目页面,并使用表单输入用户名和年龄。点 Save

    请注意:由于应用程序还没有连接数据库,您将无法通过点 View Persons Record List 链接来查看数据。

2.4.5.3. 使用 odo创建数据库

要创建数据库,您必须有权访问数据库 Operator。本例中使用了 Dev4Devs PostgreSQL Operator。

流程

  1. 查看项目中的服务列表:

    $ odo catalog list services

    输出示例

    Operators available in the cluster
    NAME                                             CRDs
    postgresql-operator.v0.1.1                       Backup, Database

  2. 将服务的 YAML 存储到一个文件中:

    $ odo service create postgresql-operator.v0.1.1/Database --dry-run > db.yaml
  3. db.yaml 文件中的 metadata: 部分中添加以下值:

      name: sampledatabase
      annotations:
        service.binding/db.name: 'path={.spec.databaseName}'
        service.binding/db.password: 'path={.spec.databasePassword}'
        service.binding/db.user: 'path={.spec.databaseUser}'

    此配置可确保启动数据库服务时,将适当的注解添加到其中。注解可帮助 Service Binding Operator 将 databaseNamedatabasePassworddatabaseUser 的值注入应用程序中。

  4. 在 YAML 文件的 spec: 部分下更改以下值:

      databaseName: "sampledb"
      databasePassword: "samplepwd"
      databaseUser: "sampleuser"
  5. 从 YAML 文件创建数据库:

    $ odo service create --from-file db.yaml

    现在,项目中存在一个数据库实例。

2.4.5.4. 将 Java 应用程序连接到数据库

要将 Java 应用程序连接到数据库,使用 odo link 命令。

流程

  1. 显示服务列表:

    $ odo service list

    输出示例

    NAME                        AGE
    Database/sampledatabase     6m31s

  2. 将数据库连接到您的应用程序:

    $ odo link Database/sampledatabase
  3. 将更改推送到集群:

    $ odo push

    创建并推送链接后,会创建一个包含数据库连接数据的 secret。

  4. 检查组件中的从数据库服务注入的值:

    $ odo exec -- bash -c 'env | grep DATABASE'
    declare -x DATABASE_CLUSTERIP="10.106.182.173"
    declare -x DATABASE_DB_NAME="sampledb"
    declare -x DATABASE_DB_PASSWORD="samplepwd"
    declare -x DATABASE_DB_USER="sampleuser"
  5. 打开 Java 应用程序的 URL 并浏览到 CreatePerson.xhtml 数据输入页面。使用表单输入用户名和年龄。点 Save

    请注意:现在您可以通过点 View Persons Record List 链接来查看数据库中的数据。

    您还可以使用CLI 工具(如 psql 等)对数据库进行操作。

2.4.6. 在 odo 中使用 devfile

2.4.6.1. 关于 odo 中的 devfile

devfile 是一个可移植的文件,它描述了您的开发环境。使用 devfile,您可以定义一个可移植的开发环境而无需重新配置。

使用 devfile,您可以描述开发环境,如源代码、IDE 工具、应用程序运行时和预定义的命令。要了解更多关于 devfile 的信息,请参阅 devfile 文档

使用 odo,您可以从 devfiles 创建组件。当使用 devfile 创建组件时,odo 会将 devfile 转换为一个由 OpenShift Container Platform、Kubernetes 或 Docker 上运行的多个容器组成的工作区。odo 自动使用默认的 devfile registry,但用户可以添加自己的 registry。

2.4.6.2. 使用 devfile 创建 Java 应用程序

先决条件

  • 已安装了 odo
  • 必须知道您的 ingress 域集群名称。如果不知道,请联络您的集群管理员。例如, apps-crc.testingRed Hat CodeReady Containers 的集群域名。
注意

目前, odo 不支持使用 --git--binary 标志创建 devfile 组件。使用这些标记,您只能创建 S2I 组件。

2.4.6.2.1. 创建一个项目

创建一个项目来在一个独立的空间内保存源代码、测试并对库进行管理。

流程

  1. 登陆到一个OpenShift Container Platform集群。

    $ odo login -u developer -p developer
  2. 创建一个项目:

    $ odo project create myproject

    输出示例

     ✓  Project 'myproject' is ready for use
     ✓  New project created and now using project : myproject

2.4.6.2.2. 列出可用的 devfile 组件

使用 odo,可以显示集群中的所有可用组件。可用的组件取决于集群的配置。

流程

  1. 要列出集群中可用的 devfile 组件,请运行:

    $ odo catalog list components

    输出列出了可用的 odo 组件:

    Odo Devfile Components:
    NAME                 DESCRIPTION                            REGISTRY
    java-maven           Upstream Maven and OpenJDK 11          DefaultDevfileRegistry
    java-openliberty     Open Liberty microservice in Java      DefaultDevfileRegistry
    java-quarkus         Upstream Quarkus with Java+GraalVM     DefaultDevfileRegistry
    java-springboot      Spring Boot® using Java                DefaultDevfileRegistry
    nodejs               Stack with NodeJS 12                   DefaultDevfileRegistry
    
    Odo OpenShift Components:
    NAME        PROJECT       TAGS                                                                           SUPPORTED
    java        openshift     11,8,latest                                                                    YES
    dotnet      openshift     2.1,3.1,latest                                                                 NO
    golang      openshift     1.13.4-ubi7,1.13.4-ubi8,latest                                                 NO
    httpd       openshift     2.4-el7,2.4-el8,latest                                                         NO
    nginx       openshift     1.14-el7,1.14-el8,1.16-el7,1.16-el8,latest                                     NO
    nodejs      openshift     10-ubi7,10-ubi8,12-ubi7,12-ubi8,latest                                         NO
    perl        openshift     5.26-el7,5.26-ubi8,5.30-el7,latest                                             NO
    php         openshift     7.2-ubi7,7.2-ubi8,7.3-ubi7,7.3-ubi8,latest                                     NO
    python      openshift     2.7-ubi7,2.7-ubi8,3.6-ubi7,3.6-ubi8,3.8-ubi7,3.8-ubi8,latest                   NO
    ruby        openshift     2.5-ubi7,2.5-ubi8,2.6-ubi7,2.6-ubi8,2.7-ubi7,latest                            NO
    wildfly     openshift     10.0,10.1,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,8.1,9.0,latest     NO
2.4.6.2.3. 使用 devfile 部署 Java 应用程序

在这一部分,您将了解如何使用 devfile 部署使用 Maven 和 Java 8 JDK 的 Java 示例项目。

流程

  1. 创建一个目录来存储组件的源代码:

    $ mkdir <directory-name>
  2. 创建名为 myspring 的 Spring Boot 组件类型的组件配置并下载其示例项目:

    $ odo create java-springboot myspring --starter

    上面的命令会产生以下输出:

    Validation
    ✓  Checking devfile compatibility [195728ns]
    ✓  Creating a devfile component from registry: DefaultDevfileRegistry [170275ns]
    ✓  Validating devfile component [281940ns]
    
    Please use `odo push` command to create the component with source deployed

    odo create 命令从记录的 devfile registry 中下载相关的 devfile.yaml 文件。

  3. 列出目录的内容以确认下载了 devfile 和示例 Java 应用程序:

    $ ls

    上面的命令会产生以下输出:

    README.md    devfile.yaml    pom.xml        src
  4. 创建一个 URL 以访问部署的组件:

    $ odo url create --host apps-crc.testing

    上面的命令会产生以下输出:

    ✓  URL myspring-8080.apps-crc.testing created for component: myspring
    
    To apply the URL configuration changes, please use odo push
    注意

    创建 URL 时必须使用集群主机名。

  5. 将组件推送到集群:

    $ odo push

    上面的命令会产生以下输出:

    Validation
     ✓  Validating the devfile [81808ns]
    
    Creating Kubernetes resources for component myspring
     ✓  Waiting for component to start [5s]
    
    Applying URL changes
     ✓  URL myspring-8080: http://myspring-8080.apps-crc.testing created
    
    Syncing to component myspring
     ✓  Checking files for pushing [2ms]
     ✓  Syncing files to the component [1s]
    
    Executing devfile commands for component myspring
     ✓  Executing devbuild command "/artifacts/bin/build-container-full.sh" [1m]
     ✓  Executing devrun command "/artifacts/bin/start-server.sh" [2s]
    
    Pushing devfile component myspring
     ✓  Changes successfully pushed to component
  6. 列出组件的 URL 以验证组件已被成功推送:

    $ odo url list

    上面的命令会产生以下输出:

    Found the following URLs for component myspring
    NAME              URL                                       PORT     SECURE
    myspring-8080     http://myspring-8080.apps-crc.testing     8080     false
  7. 使用生成的 URL 查看部署的应用程序。

    $ curl http://myspring-8080.apps-crc.testing

2.4.6.3. 将 S2I 组件转换为 devfile 组件

使用 odo,您可以同时创建 Source-to-Image(S2I)和 devfile 组件。如果您有一个现有的 S2I 组件,可以使用 odo utils 命令将其转换为 devfile 组件。

流程

从 S2I 组件目录中运行所有命令。

  1. 运行 odo utils convert-to-devfile 命令,它会基于您的组件创建 devfile.yamlenv.yaml

    $ odo utils convert-to-devfile
  2. 将组件推送到集群:

    $ odo push
    注意

    如果 devfile 组件部署失败,请运行以下命令删除它: odo delete -a

  3. 验证 devfile 组件已成功部署:

    $ odo list
  4. 删除 S2I 组件:

    $ odo delete --s2i

2.4.7. 使用存储

持久性存储会在 odo 重启时保留数据。

2.4.7.1. 在应用程序组件中添加存储

使用 odo storage 命令为应用程序添加持久性数据。必须持久化的数据示例包括数据库文件、依赖项和构建工件,如 .m2 Maven 目录。

流程

  1. 在组件中添加存储:

    $ odo storage create <storage_name> --path=<path_to_the_directory> --size=<size>
  2. 将存储推送到集群:

    $ odo push
  3. 通过列出组件中的所有存储来验证存储现在附加到您的组件中:

    $ odo storage list

    输出示例

    The component 'nodejs' has the following storage attached:
    NAME           SIZE     PATH      STATE
    mystorage      1Gi      /data     Pushed

  4. 从您的组件中删除存储:

    $ odo storage delete <storage_name>
  5. 列出所有存储以验证存储状态是否本地删除:

    $ odo storage list

    输出示例

    The component 'nodejs' has the following storage attached:
    NAME           SIZE     PATH      STATE
    mystorage      1Gi      /data     Locally Deleted

  6. 将更改推送到集群:

    $ odo push

2.4.7.2. 在特定容器中添加存储

如果您的 devfile 有多个容器,您可以使用 --container 标志指定您要将存储附加到的容器。

流程

  1. 使用多个容器创建 devfile:

    components:
      - name: runtime 1
        container:
          image: registry.access.redhat.com/ubi8/nodejs-12:1-36
          memoryLimit: 1024Mi
          endpoints:
            - name: "3000-tcp"
              targetPort: 3000
          mountSources: true
      - name: funtime 2
        container:
          image: registry.access.redhat.com/ubi8/nodejs-12:1-36
          memoryLimit: 1024Mi
    1
    runtime 容器。
    2
    funtime 容器。
  2. runtime 容器创建存储:

    $ odo storage create store --path /data --size 1Gi --container runtime

    命令输出:

    ✓  Added storage store to nodejs-testing-xnfg
      Please use `odo push` command to make the storage accessible to the component

  3. 通过列出组件中的所有存储来验证存储现在附加到您的组件中:

    $ odo storage list

    输出示例

    The component 'nodejs-testing-xnfg' has the following storage attached:
      NAME      SIZE     PATH      CONTAINER     STATE
      store     1Gi      /data     runtime       Not Pushed

  4. 将更改推送到集群:

    $ odo push

2.4.7.3. 在临时存储和持久性存储间切换

您可以使用 odo preference 命令在项目中的临时存储和持久性存储间切换。odo preference 可以修改集群中的全局首选项。

启用持久性存储后,集群会在重启之间保存信息。

启用临时存储后,集群不会在重启之间保存信息。

默认启用临时存储。

流程

  1. 请参阅项目中当前设置的首选项:

    $ odo preference view

    输出示例

    PARAMETER             CURRENT_VALUE
    UpdateNotification
    NamePrefix
    Timeout
    BuildTimeout
    PushTimeout
    Experimental
    PushTarget
    Ephemeral             true

  2. 要取消设置临时存储并设置持久性存储:

    $ odo preference set Ephemeral false
  3. 再次设置临时存储:

    $ odo preference set Ephemeral true

    odo preference 命令更改您目前部署的所有组件的全局设置,以及您要将来部署的组件。

  4. 运行 odo push 使 odo 为您的组件创建指定的存储:

    $ odo push

2.4.8. 取消应用程序

您可以删除项目中应用程序和与应用程序关联的所有组件。

2.4.8.1. 删除应用程序

使用 odo app delete 命令删除应用程序。

流程

  1. 列出当前项目中的应用程序:

    $ odo app list

    输出示例

        The project '<project_name>' has the following applications:
        NAME
        app

  2. 列出与应用程序关联的组件。这些组件将随应用程序一起删除:

    $ odo component list

    输出示例

        APP     NAME                      TYPE       SOURCE        STATE
        app     nodejs-nodejs-ex-elyf     nodejs     file://./     Pushed

  3. 删除应用程序:

    $ odo app delete <application_name>

    输出示例

        ? Are you sure you want to delete the application: <application_name> from project: <project_name>

  4. 使用 Y 确认删除。您可以使用 -f 标记来阻止确认提示。

2.4.9. 在 odo 中调试应用程序

使用 odo,您可以附加一个 debugger 来远程调试应用程序。这个功能只支持 NodeJS 和 Java 组件。

默认情况下,使用 odo 创建的组件以 debug 模式运行。debugger 代理在组件上运行,并使用特定端口。要开始调试您的应用程序,必须启动端口转发功能,并在集成开发环境中 (IDE) 附加本地 debugger。

2.4.9.1. 调试应用程序

您可以使用 odo debug 命令在 odo 中调试应用程序。

流程

  1. 下载包含 devfile 中必要的 debugrun 步骤的示例应用程序:

    $ odo create nodejs --starter

    输出示例

    Validation
     ✓  Checking devfile existence [11498ns]
     ✓  Checking devfile compatibility [15714ns]
     ✓  Creating a devfile component from registry: DefaultDevfileRegistry [17565ns]
     ✓  Validating devfile component [113876ns]
    
    Starter Project
     ✓  Downloading starter project nodejs-starter from https://github.com/odo-devfiles/nodejs-ex.git [428ms]
    
    Please use `odo push` command to create the component with source deployed

  2. 使用 --debug 标志推送应用程序,在所有调试部署中都需要它:

    $ odo push --debug

    输出示例

    Validation
     ✓  Validating the devfile [29916ns]
    
    Creating Kubernetes resources for component nodejs
     ✓  Waiting for component to start [38ms]
    
    Applying URL changes
     ✓  URLs are synced with the cluster, no changes are required.
    
    Syncing to component nodejs
     ✓  Checking file changes for pushing [1ms]
     ✓  Syncing files to the component [778ms]
    
    Executing devfile commands for component nodejs
     ✓  Executing install command "npm install" [2s]
     ✓  Executing debug command "npm run debug" [1s]
    
    Pushing devfile component nodejs
     ✓  Changes successfully pushed to component

    注意

    您可以使用 --debug-command="custom-step" 标志来指定一个自定义调试命令。

  3. 端口转发到本地端口来访问调试接口:

    $ odo debug port-forward

    输出示例

    Started port forwarding at ports - 5858:5858

    注意

    您可以使用 --local-port 标志指定端口。

  4. 检查 debug 会话是否在一个单独的终端窗口中运行:

    $ odo debug info

    输出示例

    Debug is running for the component on the local port : 5858

  5. 附加在您选择的 IDE 中捆绑的 debugger。具体步骤根据 IDE 的不同而有所不同,例如:VSCode 调试接口

2.4.9.2. 配置调试参数

您可以使用 odo config 命令指定远程端口,并使用 odo debug 命令指定本地端口 。

流程

  • 要设置调试代理应运行的远程端口,请运行:

    $ odo config set DebugPort 9292
    注意

    您必须重新部署您的组件,才能在组件中反映此值。

  • 要在本地端口中启用转发端口功能,请运行:

    $ odo debug port-forward --local-port 9292
    注意

    本地端口值不具有持久性。您必须在每次需要更改端口时都提供该端口值。

2.4.10. 示例应用程序

odo 提供与 OpenShift Container Platform 组件类型的目录中列出的语言或运行时的部分兼容性。例如:

NAME        PROJECT       TAGS
dotnet      openshift     3.1,latest
httpd       openshift     2.4,latest
java        openshift     8,latest
nginx       openshift     1.10,1.12,1.8,latest
nodejs      openshift     0.10,4,6,8,latest
perl        openshift     5.16,5.20,5.24,latest
php         openshift     5.5,5.6,7.0,7.1,latest
python      openshift     2.7,3.3,3.4,3.5,3.6,latest
ruby        openshift     2.0,2.2,2.3,2.4,latest
wildfly     openshift     10.0,10.1,8.1,9.0,latest
注意

对于 odo,Java 和 Node.js 是官方支持的组件类型。运行 odo catalog list components 来验证官方支持的组件类型。

要通过 web 访问该组件,请使用 odo url create 创建一个 URL。

2.4.10.1. Git 软件仓库示例

2.4.10.1.1. httpd

这个示例在 CentOS 7 上使用 httpd 构建并提供静态内容。有关使用这个构建器镜像的更多信息,包括 OpenShift Container Platform 的注意事项,请查看 Apache HTTP 服务器容器镜像存储库

$ odo create httpd --git https://github.com/openshift/httpd-ex.git
2.4.10.1.2. java

这个示例在 CentOS 7 上构建并运行 fat JAR Java 应用程序。有关使用这个构建器镜像的更多信息,包括 OpenShift Container Platform 的注意事项,请参见 Java S2I Builder image

$ odo create java --git https://github.com/spring-projects/spring-petclinic.git
2.4.10.1.3. nodejs

在 CentOS 7 中构建并运行 Node.js 应用程序。有关使用这个构建器镜像的更多信息,包括 OpenShift Container Platform 的注意事项,请参见 Node.js 8 container image

$ odo create nodejs --git https://github.com/openshift/nodejs-ex.git
2.4.10.1.4. Perl

这个示例在 CentOS 7 中构建并运行 Perl 应用程序。有关使用这个构建器镜像的更多信息,包括 OpenShift Container Platform 的注意事项,请查看 Perl 5.26 容器镜像

$ odo create perl --git https://github.com/openshift/dancer-ex.git
2.4.10.1.5. php

这个示例在 CentOS 7 中构建并运行 PHP 应用程序。有关使用这个构建器镜像的更多信息,包括 OpenShift Container Platform 的注意事项,请参见 PHP 7.1 Docker image

$ odo create php --git https://github.com/openshift/cakephp-ex.git
2.4.10.1.6. Python

这个示例在 CentOS 7 中构建并运行 Python 应用程序。有关使用这个构建器镜像的更多信息,包括 OpenShift Container Platform 的注意事项,请查看 Python 3.6 容器镜像

$ odo create python --git https://github.com/openshift/django-ex.git
2.4.10.1.7. Ruby

这个示例在 CentOS 7 中构建并运行 Ruby 应用程序。有关使用这个构建器镜像的更多信息,包括 OpenShift Container Platform 的注意事项,请参见 Ruby 2.5 container image

$ odo create ruby --git https://github.com/openshift/ruby-ex.git

2.4.10.2. 二进制示例

2.4.10.2.1. java

Java 可以用来部署二进制工件,如下:

$ git clone https://github.com/spring-projects/spring-petclinic.git
$ cd spring-petclinic
$ mvn package
$ odo create java test3 --binary target/*.jar
$ odo push

2.5. 在受限环境中使用 odo

2.5.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.5.2. 将 odo init 镜像推送到受限集群的 registry 中

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

2.5.2.1. 先决条件

  • 在客户端操作系统上安装 oc
  • 在客户端操作系统中安装 odo
  • 访问已配置的内部 registry 或 registry 镜像(mirror)的受限集群。

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

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

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

流程

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

    $ echo <content_of_additional_ca> | base64 --decode > 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.5.2.2.2. 将 init 镜像推送到 MacOS 上的镜像 registry

流程

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

    $ echo <content_of_additional_ca> | base64 --decode > 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.5.2.2.3. 将 init 镜像推送到 Windows 上的镜像 registry

流程

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

    PS C:\> echo <content_of_additional_ca> | base64 --decode > 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.5.2.3. 将 odo init 镜像直接推送到内部 registry

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

2.5.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 --decode > 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.5.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 --decode > 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.5.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 --decode > 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.5.3. 在断开连接的集群中创建和部署组件

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

2.5.3.1. 先决条件

2.5.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.5.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.5.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>

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

2.5.4.1. 通过在断开连接的集群中使用 devfile 创建 NodeJS 应用程序

警告

此流程使用外部依赖项,如 nodejs-ex.git,这些应用程序不由红帽维护。这些依赖项无法根据文档进行维护,而且无法保证其功能。

先决条件

  • 您已创建并登录到断开连接的集群。
  • 您已在代理中添加了 raw.githubusercontent.comregistry.access.redhat.comregistry.npmjs.org URL。

流程

  1. 在 devfile 中定义 NodeJS 应用程序:

    devfile 示例

    schemaVersion: 2.0.0
    metadata:
    name: nodejs
    starterProjects:
    - name: nodejs-starter
      git:
        remotes:
          origin: "https://github.com/odo-devfiles/nodejs-ex.git"
    components:
    - name: runtime
      container:
        image: registry.access.redhat.com/ubi8/nodejs-12:1-36
        memoryLimit: 1024Mi
        endpoints:
          - name: "3000/tcp"
            targetPort: 3000
        env:
          - name: HTTP_PROXY
            value: http://<proxy-host>:<proxy-port>
          - name: HTTPS_PROXY
            value: http://<proxy-host>:<proxy-port>
        mountSources: true
    commands:
    - id: devbuild
      exec:
        component: runtime
        commandLine: npm install
        workingDir: ${PROJECTS_ROOT}
        group:
          kind: build
          isDefault: true
    - id: build
      exec:
        component: runtime
        commandLine: npm install
        workingDir: ${PROJECTS_ROOT}
        group:
          kind: build
    - id: devrun
      exec:
        component: runtime
        commandLine: npm start
        workingDir: ${PROJECTS_ROOT}
        group:
          kind: run
          isDefault: true
    - id: run
      exec:
        component: runtime
        commandLine: npm start
        workingDir: ${PROJECTS_ROOT}
        group:
          kind: run

  2. 创建应用程序并将更改推送到集群:

    $ odo create nodejs --devfile <path-to-your-devfile> --starter $$ odo push

    输出示例

    [...]
    Pushing devfile component nodejs
     ✓  Changes successfully pushed to component

  3. 创建一个 URL 以访问应用程序并将其推送到集群:

    $ odo url create url1 --port 3000 --host example.com --ingress && odo push

    输出示例

    Validation
     ✓  Validating the devfile [145374ns]
    
    Creating Kubernetes resources for component nodejs
     ✓  Waiting for component to start [14s]
    
    Applying URL changes
     ✓  URL url1: http://url1.abcdr.com/ created
    
    Syncing to component nodejs
     ✓  Checking file changes for pushing [2ms]
     ✓  Syncing files to the component [3s]
    
    Executing devfile commands for component nodejs
     ✓  Executing devbuild command "npm install" [4s]
     ✓  Executing devrun command "npm start" [3s]
    
    Pushing devfile component nodejs
     ✓  Changes successfully pushed to component

  4. 在应用程序中添加存储

    $ odo storage create <storage-name> --path /data --size 5Gi

    输出示例

    ✓  Added storage abcde to nodejs
    
    Please use `odo push` command to make the storage accessible to the component

  5. 将更改推送到集群:

    $ odo push

2.5.4.2. 通过在断开连接的集群中使用 devfile 创建 Java 应用程序

警告

这个过程使用外部依赖项,如 quay.io/eclipse/che-java11-maven:nightly 或示例应用程序 springboot-ex,它们不由红帽维护。这些依赖项无法根据文档进行维护,而且无法保证其功能。

先决条件

  • 您已创建并登录到断开连接的集群。
  • 您已在代理配置中添加了 quay.ioregistry.access.redhat.comapache.orgquayio-production-s3.s3.amazonaws.com URL。

流程

  1. 在 devfile 中定义 Java 应用程序:

    devfile 示例

    schemaVersion: 2.0.0
    metadata:
      name: java-maven
      version: 1.1.0
    starterProjects:
      - name: springbootproject
        git:
          remotes:
            origin: "https://github.com/odo-devfiles/springboot-ex.git"
    components:
      - name: tools
        container:
          image: quay.io/eclipse/che-java11-maven:nightly
          memoryLimit: 512Mi
          mountSources: true
          endpoints:
            - name: 'http-8080'
              targetPort: 8080
          volumeMounts:
            - name: m2
              path: /home/user/.m2
      - name: m2
        volume: {}
    commands:
      - id: mvn-package
        exec:
          component: tools
          commandLine: "mvn -Dmaven.repo.local=/home/user/.m2/repository -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port> -Dhttps.proxyHost=<proxy-host> -Dhttps.proxyPort=<proxy-port> package"
          group:
            kind: build
            isDefault: true
      - id: run
        exec:
          component: tools
          commandLine: "java -jar target/*.jar"
          group:
            kind: run
            isDefault: true
      - id: debug
        exec:
          component: tools
          commandLine: "java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=${DEBUG_PORT},suspend=n -jar target/*.jar"
          group:
            kind: debug
            isDefault: true

  2. 创建 Java 应用程序:

    $ odo create java-maven --devfile <path-to-your-devfile> --starter

    输出示例

    Validation
     ✓  Checking devfile existence [87716ns]
     ✓  Creating a devfile component from registry: DefaultDevfileRegistry [107247ns]
     ✓  Validating devfile component [396971ns]
    
     Starter Project
     ✓  Downloading starter project springbootproject from https://github.com/odo-devfiles/springboot-ex.git [2s]
    
    Please use `odo push` command to create the component with source deployed

  3. 将更改推送到集群:

    $ odo push

    输出示例

    I0224 14:43:18.802512   34741 util.go:727] HTTPGetRequest: https://raw.githubusercontent.com/openshift/odo/master/build/VERSION
    I0224 14:43:18.833631   34741 context.go:115] absolute devfile path: '/Users/pkumari/go/src/github.com/openshift/odo/testim/devfile.yaml'
    [...]
    Downloaded from central: https://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.2.1/plexus-utils-3.2.1.jar (262 kB at 813 kB/s)
    [INFO] Replacing main artifact with repackaged archive
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  19.638 s
    [INFO] Finished at: 2021-02-24T08:59:30Z
    [INFO] ------------------------------------------------------------------------
     ✓  Executing mvn-package command "mvn -Dmaven.repo.local=/home/user/.m2/repository -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port> -Dhttps.proxyHost=<proxy-host> -Dhttps.proxyPort=<proxy-port> package" [23s]
     •  Executing run command "java -jar target/*.jar"  ...
    I0224 14:29:30.557676   34426 exec.go:27] Executing command [/opt/odo/bin/supervisord ctl start devrun] for pod: java-maven-5b8f99fcdb-9dnk6 in container: tools
    devrun: started
     ✓  Executing run command "java -jar target/*.jar" [3s]
    
    Pushing devfile component java-maven
     ✓  Changes successfully pushed to component

  4. 显示日志以验证应用程序是否已启动:

    $ odo log

    输出示例

    time="2021-02-24T08:58:58Z" level=info msg="create process:devrun"
    time="2021-02-24T08:58:58Z" level=info msg="create process:debugrun"
    time="2021-02-24T08:59:32Z" level=debug msg="no auth required"
    time="2021-02-24T08:59:32Z" level=debug msg="succeed to find process:devrun"
    time="2021-02-24T08:59:32Z" level=info msg="try to start program" program=devrun
    time="2021-02-24T08:59:32Z" level=info msg="success to start program" program=devrun
    ODO_COMMAND_RUN is java -jar target/*.jar
    Executing command  java -jar target/*.jar
    [...]

  5. 为应用程序创建存储:

    $ odo storage create storage-name --path /data --size 5Gi

    输出示例

    ✓  Added storage storage-name to java-maven
    
    Please use `odo push` command to make the storage accessible to the component

  6. 将更改推送到集群:

    $ odo push

    输出。

    ✓  Waiting for component to start [310ms]
    
    Validation
     ✓  Validating the devfile [100798ns]
    
    Creating Kubernetes resources for component java-maven
     ✓  Waiting for component to start [30s]
     ✓  Waiting for component to start [303ms]
    
    Applying URL changes
     ✓  URLs are synced with the cluster, no changes are required.
    
    Syncing to component java-maven
     ✓  Checking file changes for pushing [5ms]
     ✓  Syncing files to the component [4s]
    
    Executing devfile commands for component java-maven
     ✓  Waiting for component to start [526ms]
     ✓  Executing mvn-package command "mvn -Dmaven.repo.local=/home/user/.m2/repository -Dhttp.proxyHost=<proxy-host> -Dhttp.proxyPort=<proxy-port> -Dhttps.proxyHost=<proxy-host> -Dhttps.proxyPort=<proxy-port> package" [10s]
     ✓  Executing run command "java -jar target/*.jar" [3s]
    
    Pushing devfile component java-maven
     ✓  Changes successfully pushed to component

2.6. 创建 Operator 管理的服务实例

Operators 是打包、部署和管理 Kubernetes 应用程序的一个方法。通过 odo,您可以从 Operator 提供的自定义资源定义(CRD)创建服务实例。然后,您可以在项目中使用这些实例,并将其链接到您的组件。

要从 Operator 创建服务,您必须确保 Operator 在它的 metadata 中定义了有效值才能启动请求的服务。odo 使用 Operator 的 metadata.annotations.alm-examples YAML 文件启动该服务。如果此 YAML 具有占位符值或示例值,服务将无法启动。您可以修改 YAML 文件,使用修改后的值启动服务。要了解如何修改 YAML 文件并启动服务,请参阅通过YAML 文件创建服务

2.6.1. 先决条件

  • 安装 oc CLI 并登录到集群。

    • 请注意,集群的配置决定了可用的服务。要访问 Operator 服务,集群管理员必须首先在集群上安装相应的 Operator。如需了解更多相关信息,请参阅 在集群中添加 Operator
  • 安装 odo CLI。

2.6.2. 创建一个项目

创建一个项目来在一个独立的空间内保存源代码、测试并对库进行管理。

流程

  1. 登陆到一个OpenShift Container Platform集群。

    $ odo login -u developer -p developer
  2. 创建一个项目:

    $ odo project create myproject

    输出示例

     ✓  Project 'myproject' is ready for use
     ✓  New project created and now using project : myproject

2.6.3. 列出来自于集群中安装的 Operator 的可用服务

使用 odo,可以显示集群中安装的 Operator 列表及其提供的服务。

  • 要列出当前项目中安装的 Operator,请运行:

    $ odo catalog list services

    命令列出 Operators 和 CRD。该命令的输出显示集群中安装的 Operator。例如:

    Operators available in the cluster
    NAME                          CRDs
    etcdoperator.v0.9.4           EtcdCluster, EtcdBackup, EtcdRestore
    mongodb-enterprise.v1.4.5     MongoDB, MongoDBUser, MongoDBOpsManager

    etcdoperator.v0.9.4 是 Operator,EtcdClusterEtcdBackupEtcdRestore 是 Operator 提供的 CRD。

2.6.4. 从 Operator 创建服务

如果 Operator 在 metadata 中定义了有效值来启动请求的服务,您可以通过 odo service create 来使用服务。

  1. 将服务的 YAML 作为本地驱动器上的文件输出:

    $ oc get csv/etcdoperator.v0.9.4 -o yaml
  2. 验证服务的值是否有效:

    apiVersion: etcd.database.coreos.com/v1beta2
    kind: EtcdCluster
    metadata:
      name: example
    spec:
      size: 3
      version: 3.2.13
  3. etcdoperator.v0.9.4 Operator 启动 EtcdCluster 服务:

    $ odo service create etcdoperator.v0.9.4 EtcdCluster
  4. 验证服务是否已启动:

    $ oc get EtcdCluster

2.6.5. 从 YAML 文件创建服务

如果服务或自定义资源(CR)的 YAML 定义无效或有占位符数据,您可以使用 --dry-run 标志获取 YAML 定义。指定正确的值后使用更正的 YAML 定义启动服务。通过打印和修改用于启动服务的 YAML, odo 可以在实际启动一个服务前输出由 Operator 提供的服务或 CR 的 YAML 定义。

  1. 要显示服务的 YAML,请运行:

    $ odo service create <operator-name> --dry-run

    例如,要打印由 etcdoperator.v0.9.4 Operator 提供的 EtcdCluster 的 YAML 定义,请运行:

    $ odo service create etcdoperator.v0.9.4 --dry-run

    YAML 保存为 etcd.yaml 文件。

  2. 修改 etcd.yaml 文件:

    apiVersion: etcd.database.coreos.com/v1beta2
    kind: EtcdCluster
    metadata:
      name: my-etcd-cluster 1
    spec:
      size: 1 2
      version: 3.2.13
    1
    将名称从 example 改为 my-etcd-cluster
    2
    将大小从 3 减小到 1
  3. 从 YAML 文件启动服务:

    $ odo service create --from-file etcd.yaml
  4. 验证 EtcdCluster 服务已使用一个 pod 启动,而不是预先配置的三个 pod:

    $ oc get pods | grep my-etcd-cluster

2.7. 管理环境变量

odoconfig 文件中存储特定于组件的配置和环境变量。您可以使用 odo config 命令为组件设置、取消设置和列出环境变量,而无需修改 config 文件。

2.7.1. 设置和取消设置环境变量

流程

  • 在组件中设置环境变量:

    $ odo config set --env <variable>=<value>
  • 在组件中取消设置环境变量:

    $ odo config unset --env <variable>
  • 列出组件中的所有环境变量:

    $ odo config view

2.8. 配置 odo CLI

2.8.1. 使用命令完成

注意

目前只有 bash 、zsh 和 shell 支持命令完成。

odo 提供基于用户输入的智能命令参数完成功能。要做到这一点,odo 需要与执行 shell 集成。

流程

  • 要自动安装命令完成:

    1. 运行:

      $ odo --complete
    2. 提示安装完成 hook 时按 y 键。
  • 要手动安装完成 hook,请在 shell 配置文件中添加 complete -o nospace -C <full_path_to_your_odo_binary> odo。在修改了 shell 配置文件后,重启 shell。
  • 禁用完成:

    1. 运行:

      $ odo --uncomplete
    2. 提示后按 y 卸载完成 hook。
注意

如果您重命名 odo 可执行文件或将其移动到其他目录中,请重新启用命令完成。

2.8.2. 忽略文件或特征

您可以通过修改应用程序根目录中的 .odoignore 文件来配置要忽略的文件或模式列表。这适用于 odo pushodo watch

如果 .odoignore 文件 存在,则会使用 .gitignore 文件来忽略特定的文件和文件夹。

要忽略 .git 文件、任意带有 .js 扩展名的文件,以及 tests 目录,在 .odoignore.gitignore 文件中添加以下内容:

.git
*.js
tests/

.odoignore 文件 允许任何 glob 表达式。

2.9. odo CLI 参考指南

2.9.1. 基本 odo CLI 命令

2.9.1.1. app

执行与 OpenShift Container Platform 项目相关的应用程序操作。

使用 app 的示例

  # Delete the application
  odo app delete myapp

  # Describe 'webapp' application,
  odo app describe webapp

  # List all applications in the current project
  odo app list

  # List all applications in the specified project
  odo app list --project myproject

2.9.1.2. catalog

执行与目录相关的操作。

使用 catalog 的示例

  # Get the supported components
  odo catalog list components

  # Get the supported services from service catalog
  odo catalog list services

  # Search for a component
  odo catalog search component python

  # Search for a service
  odo catalog search service mysql

  # Describe a service
  odo catalog describe service mysql-persistent

2.9.1.3. component

管理应用程序的组件。

使用 component 的示例

# Create a new component
odo component create

# Create a local configuration and create all objects on the cluster
odo component create --now

2.9.1.4. config

config 文件中修改与 odo 相关的设置。

使用 config 的示例

  # For viewing the current local configuration
  odo config view

  # Set a configuration value in the local configuration
  odo config set Type java
  odo config set Name test
  odo config set MinMemory 50M
  odo config set MaxMemory 500M
  odo config set Memory 250M
  odo config set Ignore false
  odo config set MinCPU 0.5
  odo config set MaxCPU 2
  odo config set CPU 1

  # Set an environment variable in the local configuration
  odo config set --env KAFKA_HOST=kafka --env KAFKA_PORT=6639

  # Create a local configuration and apply the changes to the cluster immediately
  odo config set --now

  # Unset a configuration value in the local config
  odo config unset Type
  odo config unset Name
  odo config unset MinMemory
  odo config unset MaxMemory
  odo config unset Memory
  odo config unset Ignore
  odo config unset MinCPU
  odo config unset MaxCPU
  odo config unset CPU

  # Unset an env variable in the local config
  odo config unset --env KAFKA_HOST --env KAFKA_PORT

Application(应用程序)

Application 是应用程序名称,组件需要作为此应用程序的一部分

CPU

组件可消耗的最少和最多 CPU

Ignore

进行 push 和 watch 时使用 .odoignore 文件

表 2.2. 可用的本地参数:

Application(应用程序)

组件需要成为其一部分的应用程序名称

CPU

组件可消耗的最少和最多 CPU

Ignore

进行 push 和 watch 时是否使用 .odoignore 文件

MaxCPU

组件可消耗的最多 CPU

MaxMemory

组件可消耗的最大内存

Memory

组件可消耗的最小和最大内存

MinCPU

组件可消耗的最小 CPU

MinMemory

组件提供的最小内存

名称

组件的名称

Ports

要在组件中打开的端口

Project(项目)

组件所属项目的名称

Ref

用于从 git 源创建组件的 git ref

SourceLocation

该路径表示二进制文件或者 git 源的位置

SourceType

组件源的类型 - git/binary/local

存储

组件的存储

类型

组件的类型

URL

访问该组件的 URL

2.9.1.5. create

创建描述在 OpenShift Container Platform 中部署的组件的配置。如果没有提供组件名称,它会被自动生成。

默认情况下,构建者镜像是从当前命名空间中使用的。如果要明确指定一个命名空间,使用:odo create namespace/name:version。如果没有指定版本,则默认为 latest

使用 odo catalog list 查看可以部署的完整组件类型列表。

使用 create 的示例

  # Create new Node.js component with the source in current directory.
  odo create nodejs

  # Create new Node.js component and push it to the cluster immediately.
  odo create nodejs --now

  # A specific image version may also be specified
  odo create nodejs:latest

  # Create new Node.js component named 'frontend' with the source in './frontend' directory
  odo create nodejs frontend --context ./frontend

  # Create a new Node.js component of version 6 from the 'openshift' namespace
  odo create openshift/nodejs:6 --context /nodejs-ex

  # Create new Wildfly component with binary named sample.war in './downloads' directory
  odo create wildfly wildfly --binary ./downloads/sample.war

  # Create new Node.js component with source from remote git repository
  odo create nodejs --git https://github.com/openshift/nodejs-ex.git

  # Create new Node.js git component while specifying a branch, tag or commit ref
  odo create nodejs --git https://github.com/openshift/nodejs-ex.git --ref master

  # Create new Node.js git component while specifying a tag
  odo create nodejs --git https://github.com/openshift/nodejs-ex.git --ref v1.0.1

  # Create new Node.js component with the source in current directory and ports 8080-tcp,8100-tcp and 9100-udp exposed
  odo create nodejs --port 8080,8100/tcp,9100/udp

  # Create new Node.js component with the source in current directory and env variables key=value and key1=value1 exposed
  odo create nodejs --env key=value,key1=value1

  # Create a new Python component with the source in a Git repository
  odo create python --git https://github.com/openshift/django-ex.git

  # Passing memory limits
  odo create nodejs --memory 150Mi
  odo create nodejs --min-memory 150Mi --max-memory 300 Mi

  # Passing cpu limits
  odo create nodejs --cpu 2
  odo create nodejs --min-cpu 200m --max-cpu 2

2.9.1.6. debug

调试组件。

使用 debug 的示例

# Displaying information about the state of debugging
odo debug info

# Starting the port forwarding for a component to debug the application
odo debug port-forward

# Setting a local port to port forward
odo debug port-forward --local-port 9292

2.9.1.7. delete

删除一个现有组件。

使用 delete 的示例

  # Delete component named 'frontend'.
  odo delete frontend
  odo delete frontend --all-apps

2.9.1.8. describe

描述指定组件。

使用 describe 的示例

  # Describe nodejs component
  odo describe nodejs

2.9.1.10. list

列出当前应用程序中的所有组件以及组件的状态。

组件的状态

Pushed
推送到集群的组件。
Not Pushed
不推送到集群的组件。
Unknown
odo 从集群中断开连接。

使用 list 的示例

  # List all components in the application
  odo list

  # List all the components in a given path
  odo list --path <path_to_your_component>

2.9.1.11. log

获取指定组件的日志。

使用 log 的示例

  # Get the logs for the nodejs component
  odo log nodejs

2.9.1.12. login

登录到集群。

使用 login 的示例

  # Log in interactively
  odo login

  # Log in to the given server with the given certificate authority file
  odo login localhost:8443 --certificate-authority=/path/to/cert.crt

  # Log in to the given server with the given credentials (basic auth)
  odo login localhost:8443 --username=myuser --password=mypass

  # Log in to the given server with the given credentials (token)
  odo login localhost:8443 --token=xxxxxxxxxxxxxxxxxxxxxxx

2.9.1.13. logout

登出当前 OpenShift Container Platform 会话。

使用 logout 的示例

  # Log out
  odo logout

2.9.1.14. preference

在全局首选项文件中修改与 odo 相关的配置设置。

使用 preference 的示例

  # For viewing the current preferences
  odo preference view

  # Set a preference value in the global preference
  odo preference set UpdateNotification false
  odo preference set NamePrefix "app"
  odo preference set Timeout 20

  # Enable experimental mode
  odo preference set experimental true

  # Unset a preference value in the global preference
  odo preference unset  UpdateNotification
  odo preference unset  NamePrefix
  odo preference unset  Timeout

  # Disable experimental mode
  odo preference set experimental false

  # Use persistent volumes in the cluster
  odo preference set ephemeral false

注意

默认情况下,全局首选项文件的路径为 ~/.odo/preferece.yaml,它被存储在环境变量 GLOBALODOCONFIG 中。您可以通过为环境变量设置一个新的值来指定一个新的自定义的首选项路径,例如: GLOBALODOCONFIG="new_path/preference.yaml"

表 2.3. 可用参数:

NamePrefix

默认前缀是当前目录的名称。使用这个值设置默认名称前缀。

Timeout

OpenShift Container Platform 服务器的连接检查超时时间(以秒为单位)。

UpdateNotification

控制是否显示更新通知。

2.9.1.15. project

执行项目操作。

使用 project 示例

  # Set the active project
  odo project set

  # Create a new project
  odo project create myproject

  # List all the projects
  odo project list

  # Delete a project
  odo project delete myproject

  # Get the active project
  odo project get

2.9.1.16. push

将源代码推送到组件中。

使用 push 的示例

  # Push source code to the current component
  odo push

  # Push data to the current component from the original source.
  odo push

  # Push source code in ~/mycode to component called my-component
  odo push my-component --context ~/mycode

  # Push source code and display event notifications in JSON format.
  odo push -o json

2.9.1.17. registry

创建和修改自定义 registry。

使用 registry 的示例

# Add a registry to the registry list
odo registry add <registry name> <registry URL>

# List a registry in the registry list
odo registry list

# Delete a registry from the registry list
odo registry delete <registry name>

# Update a registry in the registry list
odo registry update <registry name> <registry URL>

# List a component with a corresponding registry
odo catalog list components

# Create a component that is hosted by a specific registry
odo create <component type> --registry <registry name>

2.9.1.18. service

执行服务目录操作。

使用 service 的示例

  # Create new postgresql service from service catalog using dev plan and name my-postgresql-db.
  odo service create dh-postgresql-apb my-postgresql-db --plan dev -p postgresql_user=luke -p postgresql_password=secret

  # Delete the service named 'mysql-persistent'
  odo service delete mysql-persistent

  # List all services in the application
  odo service list

2.9.1.19. storage

执行存储操作。

使用 storage 的示例

  # Create storage of size 1Gb to a component
  odo storage create mystorage --path=/opt/app-root/src/storage/ --size=1Gi

  # Delete storage mystorage from the currently active component
  odo storage delete mystorage

  # List all storage attached or mounted to the current component and
  # all unattached or unmounted storage in the current application
  odo storage list

  # Set the `-o json` flag to get a JSON formatted output
  odo storage list -o json

2.9.1.21. update

更新组件的源代码路径

使用 update 的示例

  # Change the source code path of a currently active component to local (use the current directory as a source)
  odo update --local

  # Change the source code path of the frontend component to local with source in ./frontend directory
  odo update frontend --local ./frontend

  # Change the source code path of a currently active component to git
  odo update --git https://github.com/openshift/nodejs-ex.git

  # Change the source code path of the component named node-ex to git
  odo update node-ex --git https://github.com/openshift/nodejs-ex.git

  # Change the source code path of the component named wildfly to a binary named sample.war in ./downloads directory
  odo update wildfly --binary ./downloads/sample.war

2.9.1.22. url

向外界开放一个组件。

使用 url 的示例

  # Create a URL for the current component with a specific port
  odo url create --port 8080

  # Create a URL with a specific name and port
  odo url create example --port 8080

  # Create a URL with a specific name by automatic detection of port (only for components which expose only one service port)
  odo url create example

  # Create a URL with a specific name and port for component frontend
  odo url create example --port 8080 --component frontend

  # Delete a URL to a component
  odo url delete myurl

  # List the available URLs
  odo url list

  # Create a URL in the configuration and apply the changes to the cluster
  odo url create --now

  # Create an HTTPS URL
  odo url create --secure

使用这个命令生成的 URL 可以从集群外访问部署的组件。

2.9.1.23. utils

终端命令和修改 odo 配置的工具。

使用 utils 的示例

  # Bash terminal PS1 support
  source <(odo utils terminal bash)

  # Zsh terminal PS1 support
  source <(odo utils terminal zsh)

2.9.1.24. version

打印客户端版本信息。

使用 version 的示例

  # Print the client version of odo
  odo version

2.9.1.25. watch

odo 启动更改监控,并在出现更改时自动更新组件。

使用 watch 的示例

  # Watch for changes in directory for current component
  odo watch

  # Watch for changes in directory for component called frontend
  odo watch frontend

2.10. odo 架构

本节论述了 odo 架构以及 odo 如何在集群中管理资源。

2.10.1. 开发者设置

使用 odo,您可以在 OpenShift Container Platform 集群中从终端创建和部署应用程序。代码编辑器插件使用 odo,让用户可以从其 IDE 终端与 OpenShift Container Platform 集群交互。使用 odo 的插件示例:VS Code OpenShift Connector、OpenShift Connector for Intellij、Codewind for Eclipse Che。

odo 可在 Windows、macOS 和 Linux 操作系统上以及从任意终端运行。odo 为 bash 和 zsh 命令行 shell 提供自动完成功能。

odo 支持 Node.js 和 Java 组件。

2.10.2. OpenShift source-to-image

OpenShift Source-to-Image (S2I) 是一个开源项目,可帮助从源代码构建工件并将其注入容器镜像。S2I 通过构建源代码来生成可随时运行的镜像,无需 Dockerfile。odo 使用 S2I 构建器镜像来执行容器内的开发者源代码。

2.10.3. OpenShift 集群对象

2.10.3.1. Init 容器

Init 容器是应用程序容器启动前运行的专用容器,为应用程序容器的运行配置必要的环境。Init 容器可以包含应用程序镜像没有的文件,例如设置脚本。Init 容器始终需要运行完毕,如果任何 init 容器失败,应用程序容器就不会启动。

由 odo 创建的 pod 执行两个初始 (Init) 容器:

  • copy-supervisord Init 容器。
  • copy-files-to-volume Init 容器。
2.10.3.1.1. copy-supervisord

copy-supervisord Init 容器会将必要的文件复制到 emptyDir 卷中。主应用程序容器从 emptyDir 卷中使用这些文件。

复制到 emptyDir 卷中的文件:

  • 二进制文件:

    • go-init 是一个最小的 init 系统。它作为应用程序容器中的第一个进程 (PID 1) 运行。go-init 会启动运行开发者代码的 SupervisorD 守护进程。处理孤立进程需要用到 go-init。
    • SupervisorD 是一个进程控制系统。它监控配置的进程并确保它们正在运行。如果需要,它也会重启服务。对于 odo,SupervisorD 会执行并监控开发者代码。
  • 配置文件:

    • supervisor.conf 是 SupervisorD 守护进程启动时所必需的配置文件。
  • 脚本:

    • 在 OpenShift S2I 概念中,assemble-and-restart 用于构建和部署用户源代码。assemble-and-restart 脚本首先在应用程序容器中编译用户源代码,然后重启 SupervisorD 来使用户更改生效。
    • 在 OpenShift S2I 概念中,Run 用于执行所编译的源代码。run 脚本执行 assemble-and-restart 脚本创建的编译代码。
    • s2i-setup 是一个脚本,它可创建 assemble-and-restart 和 run 脚本成功执行所需的文件和目录。每次应用程序容器启动时都会执行此脚本。
  • 目录:

    • language-scripts:OpenShift S2I 允许使用自定义 assemblerun 脚本。language-scripts 目录中有几个特定语言的自定义脚本。自定义脚本提供额外的配置,以使 odo debug 正常工作。

emptyDir 卷挂载到 Init 容器和应用程序容器的 /opt/odo 挂载点。

2.10.3.1.2. copy-files-to-volume

copy-files-to-volume Init 容器将位于 S2I 构建器镜像中的 /opt/app-root 的文件复制到持久性卷中。然后该卷会挂载于应用程序容器中的同一位置 (/opt/app-root)。

如果 /opt/app-root 上没有持久性卷,则当持久性卷声明挂载到同一位置时,这个目录中的数据将会丢失。

PVC 挂载于 Init 容器中的 /mnt 挂载点。

2.10.3.2. 应用程序容器

应用程序容器是执行用户源代码的主要容器。

应用程序容器挂载了两个卷:

  • 挂载于 /opt/odoemptyDir
  • 挂载于 /opt/app-root 的持久性卷

go-init 作为应用程序容器内的第一个进程执行。然后,go-init 进程启动 SupervisorD 守护进程。

SupervisorD 执行并监控用户编译的源代码。如果用户进程崩溃,SupervisorD 会重新启动它。

2.10.3.3. 持久性卷和持久性卷声明

持久性卷声明(PVC)是在 Kubernetes 中置备持久性卷的卷类型。持久性卷的生命周期独立于 pod 生命周期。持久性卷上的数据会在 pod 重启后保留。

copy-files-to-volume Init 容器会将必要的文件复制到持久性卷中。主应用程序容器在运行时使用这些文件来执行。

持久性卷的命名规则是 <component_name>-s2idata。

Container挂载到的 PVC

copy-files-to-volume

/mnt

应用程序容器

/opt/app-root

2.10.3.4. emptyDir 卷

当 pod 分配给节点时,会创建一个 emptyDir 卷,只要该 pod 在节点上运行,该卷即会一直存在。如果容器被重启或移动,则 emptyDir 的内容会被删除,Init 容器会将数据重新恢复到 emptyDiremptyDir 最初为空。

copy-supervisord Init 容器会将必要的文件复制到 emptyDir 卷中。然后,主应用程序容器会在运行时使用这些文件来执行。

Container挂载到 emptyDir 的卷

copy-supervisord

/opt/odo

应用程序容器

/opt/odo

2.10.3.5. Service

服务是一个 Kubernetes 概念,它抽象地代表了与一组 pod 的通信方式。

odo 为每个应用程序 pod 创建一个服务,使其可访问以进行通信。

2.10.4. odo push 工作流

本节论述了 odo push 工作流。odo push 会使用所有必要的 OpenShift Container Platform 资源在 OpenShift Container Platform 集群中部署用户代码。

  1. 创建资源

    如果尚未创建,odo push 会创建以下 OpenShift Container Platform 资源:

    • DeploymentConfig 对象:

      • 执行两个 init 容器:copy-supervisordcopy-files-to-volume。init 容器将文件复制到 emptyDirPersistentVolume 类型的卷上。
      • 应用程序容器启动。应用程序容器中的第一个进程是 PID=1 的 go-init 进程。
      • go-init 进程启动 SupervisorD 守护进程。

        注意

        用户应用程序代码尚未复制到应用程序容器中,因此 SupervisorD 守护进程没有执行 run 脚本。

    • Service 对象
    • Secret 对象
    • PersistentVolumeClaim 对象
  2. 文件索引

    • 文件索引器会将源代码目录中的文件编成索引。索引器会以递归方式遍历源代码目录,并找到已创建、删除或重命名的文件。
    • 文件索引器在 .odo 目录下的 odo index 文件中维护索引信息。
    • 如果 odo index 文件不存在,这意味着文件索引程序是首次执行,并会创建新的 odo index JSON 文件。odo index JSON 文件包含文件映射 - 已遍历文件的相对文件路径以及已更改和已删除文件的绝对路径。
  3. 推送代码

    本地代码被复制到应用程序容器中,通常位于 /tmp/src 下。

  4. 执行 assemble-and-restart

    源代码成功复制后,会在运行的应用程序容器中执行 assemble-and-restart 脚本。

第 3 章 Helm CLI

3.1. Helm 3 入门

3.1.1. 了解 Helm

Helm 是一个软件包管理程序,它简化了应用程序和服务部署到 OpenShift Container Platform 集群的过程。

Helm 使用名为 charts 的打包格式。Helm chart 是描述 OpenShift Container Platform 资源的一个文件集合。

在集群中运行的一个 chart 实例被称为 release。当每次一个 chart 在集群中安装时,一个新的 release 会被创建。

在每次安装 chart,或一个版本被升级或回滚时,都会创建增量修订版本。

3.1.1.1. 主要特性

Helm 提供以下功能:

  • 搜索存储在 chart 存储库中的一个大型 chart 集合。
  • 修改现有 chart。
  • 使用 OpenShift Container Platform 或 Kubernetes 资源创建自己的 chart。
  • 将应用程序打包为 chart 并共享。

3.1.2. 安装 Helm

下面的部分论述了如何使用 CLI 在不同的平台中安装 Helm。

在 OpenShift Container Platform web 控制台中,点右上角的 ? 图标并选 Command Line Tools

先决条件

  • 已安装了 Go 版本 1.13 或更高版本。

3.1.2.1. 对于 Linux

  1. 下载 Helm 二进制文件并将其添加到您的路径中:

    # curl -L https://mirror.openshift.com/pub/openshift-v4/clients/helm/latest/helm-linux-amd64 -o /usr/local/bin/helm
  2. 使二进制文件可执行:

    # chmod +x /usr/local/bin/helm
  3. 检查已安装的版本:

    $ helm version

    输出示例

    version.BuildInfo{Version:"v3.0", GitCommit:"b31719aab7963acf4887a1c1e6d5e53378e34d93", GitTreeState:"clean", GoVersion:"go1.13.4"}

3.1.2.2. 对于 Windows 7/8

  1. 下载最新的 .exe 文件并放入您自己选择的目录 。
  2. 右键点击 Start 并点击 Control Panel
  3. 选择 系统和安全性 ,然后点击 系统
  4. 在左侧的菜单中选择高级系统设置并点击底部的环境变量按钮。
  5. 变量部分选择路径并点编辑
  6. 新建并输入到 .exe 文件的路径,或者点击 浏览 并选择目录,然后点 确定

3.1.2.3. 对于 Windows 10

  1. 下载最新的 .exe 文件并放入您自己选择的目录 。
  2. 点击 搜索 并输入 env 或者 environment
  3. 选择为您的帐户编辑环境变量
  4. 变量部分选择路径并点编辑
  5. 新建并输入到 exe 文件所在目录的路径,或者点击 浏览 并选择目录,然后点击确定

3.1.2.4. 对于 macOS:

  1. 下载 Helm 二进制文件并将其添加到您的路径中:

    # curl -L https://mirror.openshift.com/pub/openshift-v4/clients/helm/latest/helm-darwin-amd64 -o /usr/local/bin/helm
  2. 使二进制文件可执行:

    # chmod +x /usr/local/bin/helm
  3. 检查已安装的版本:

    $ helm version

    输出示例

    version.BuildInfo{Version:"v3.0", GitCommit:"b31719aab7963acf4887a1c1e6d5e53378e34d93", GitTreeState:"clean", GoVersion:"go1.13.4"}

3.1.3. 在 OpenShift Container Platform 集群中安装 Helm chart

先决条件

  • 您有一个正在运行的 OpenShift Container Platform 集群,并已登录该集群。
  • 您已安装 Helm。

流程

  1. 创建一个新项目

    $ oc new-project mysql
  2. 将一个 Helm chart 存储库添加到本地 Helm 客户端:

    $ helm repo add stable https://kubernetes-charts.storage.googleapis.com/

    输出示例

    "stable" has been added to your repositories

  3. 更新存储库:

    $ helm repo update
  4. 安装示例 MySQL chart:

    $ helm install example-mysql stable/mysql
  5. 验证 chart 是否已成功安装:

    $ helm list

    输出示例

    NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    example-mysql mysql 1 2019-12-05 15:06:51.379134163 -0500 EST deployed mysql-1.5.0 5.7.27

3.1.4. 在 OpenShift Container Platform 上创建自定义 Helm chart

流程

  1. 创建一个新项目

    $ oc new-project nodejs-ex-k
  2. 下载包含 OpenShift Container Platform 对象的示例 Node.js chart:

    $ git clone https://github.com/redhat-developer/redhat-helm-charts
  3. 进入包含 chart 示例的目录:

    $ cd redhat-helm-charts/alpha/nodejs-ex-k/
  4. 编辑 Chart.yaml 文件并添加 chart 描述:

    apiVersion: v2 1
    name: nodejs-ex-k 2
    description: A Helm chart for OpenShift 3
    icon: https://static.redhat.com/libs/redhat/brand-assets/latest/corp/logo.svg 4
    1
    Chart API 版本。对于至少需要 Helm 3 的 Helm Chart,它应该是 v2
    2
    chart 的名称。
    3
    chart 的描述。
    4
    用作图标的图形的 URL。
  5. 验证 chart 格式是否正确:

    $ helm lint

    输出示例

    [INFO] Chart.yaml: icon is recommended
    
    1 chart(s) linted, 0 chart(s) failed

  6. 前往上一个目录级别:

    $ cd ..
  7. 安装 chart:

    $ helm install nodejs-chart nodejs-ex-k
  8. 验证 chart 是否已成功安装:

    $ helm list

    输出示例

    NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    nodejs-chart nodejs-ex-k 1 2019-12-05 15:06:51.379134163 -0500 EST deployed nodejs-0.1.0  1.16.0

3.2. 配置自定义 Helm Chart 仓库

在 web 控制台的 Developer 视角中, Developer Catalog 显示集群中可用的 Helm chart。默认情况下,它会从 Red Hat Helm Chart 仓库中列出 Helm chart。如需 chart 列表,请参阅 Red Hat Helm index 文件

作为集群管理员,您可以添加多个 Helm Chart 仓库(默认仓库除外),并在 Developer Catalog 中显示这些仓库中的 Helm chart。

3.2.1. 添加自定义 Helm Chart 仓库

作为集群管理员,您可以将自定义 Helm Chart 存储库添加到集群中,并在 Developer Catalog 中启用从这些仓库中获得 Helm chart 的访问权限。

流程

  1. 要添加新的 Helm Chart 仓库,您必须将 Helm Chart 仓库自定义资源(CR)添加到集群中。

    Helm Chart 仓库 CR 示例

    apiVersion: helm.openshift.io/v1beta1
    kind: HelmChartRepository
    metadata:
      name: <name>
    spec:
     # optional name that might be used by console
     # name: <chart-display-name>
      connectionConfig:
        url: <helm-chart-repository-url>

    例如,要添加 Azure 示例 chart 存储库,请运行:

    $ cat <<EOF | oc apply -f -
    apiVersion: helm.openshift.io/v1beta1
    kind: HelmChartRepository
    metadata:
      name: azure-sample-repo
    spec:
      name: azure-sample-repo
      connectionConfig:
        url: https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
    EOF
  2. 导航到 web 控制台中的 Developer Catalog,以验证是否已显示 Helm chart 存储库中的 Helm chart。

    例如,使用 Chart 仓库 过滤器从仓库搜索 Helm chart。

    图 3.1. Chart 软件仓库过滤器

    ODC helm chart 仓库过滤器
    注意

    如果集群管理员删除了所有 chart 仓库,则无法在 +Add 视图、Developer Catalog 和左面的导航面板中查看 Helm 选项。

3.2.2. 创建凭证和 CA 证书以添加 Helm Chart 仓库

有些 Helm Chart 仓库需要凭证和自定义证书颁发机构(CA)证书才能与其连接。您可以使用 Web 控制台和 CLI 添加凭证和证书。

流程

配置凭证和证书,然后使用 CLI 添加 Helm Chart 仓库:

  1. openshift-config 命名空间中,使用 PEM 编码格式的自定义 CA 证书创建一个 configmap,并将它存储在配置映射中的 ca-bundle.crt 键下:

    $ oc create configmap helm-ca-cert \
    --from-file=ca-bundle.crt=/path/to/certs/ca.crt \
    -n openshift-config
  2. openshift-config 命名空间中,创建一个 Secret 对象来添加客户端 TLS 配置:

    $ oc create secret generic helm-tls-configs \
    --from-file=tls.crt=/path/to/certs/client.crt \
    --from-file=tls.key=/path/to/certs//client.key \
    -n openshift-config

    请注意:客户端证书和密钥必须采用 PEM 编码格式,并分别保存在 tls.crttls.key 密钥中。

  3. 按如下所示添加 Helm 仓库:

    $ cat <<EOF | oc apply -f -
    apiVersion: helm.openshift.io/v1beta1
    kind: HelmChartRepository
    metadata:
      name: <helm-repository>
    spec:
      name: <helm-repository>
      connectionConfig:
        url: <URL for the Helm repository>
        tlsConfig:
            name: helm-tls-configs
        ca:
    	name: helm-ca-cert
    EOF

    ConfigMapSecret 使用 tlsConfigca 字段在 HelmChartRepository CR 中消耗。这些证书用于连接 Helm 仓库 URL。

  4. 默认情况下,所有经过身份验证的用户都可以访问所有配置的 chart。但是,对于需要证书的 Chart 仓库,您必须为用户提供对 openshift-config 命名空间中 helm-ca-cert 配置映射和 helm-tls-configs secret 的读取访问权限,如下所示:

    $ cat <<EOF | kubectl apply -f -
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: openshift-config
      name: helm-chartrepos-tls-conf-viewer
    rules:
    - apiGroups: [""]
      resources: ["configmaps"]
      resourceNames: ["helm-ca-cert"]
      verbs: ["get"]
    - apiGroups: [""]
      resources: ["secrets"]
      resourceNames: ["helm-tls-configs"]
      verbs: ["get"]
    ---
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      namespace: openshift-config
      name: helm-chartrepos-tls-conf-viewer
    subjects:
      - kind: Group
        apiGroup: rbac.authorization.k8s.io
        name: 'system:authenticated'
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: helm-chartrepos-tls-conf-viewer
    EOF

3.2.3. 根据它们的认证级别过滤 Helm Chart

您可以在 Developer Catalog 中根据它们的认证级别过滤 Helm chart。

流程

  1. Developer 视角中,进入 +Add 视图并选择一个项目。
  2. Developer Catalog 标题中,选择 Helm Chart 选项来查看 Developer Catalog 中的所有 Helm chart。
  3. 使用 Helm chart 列表左侧的过滤器过滤所需的 chart:

    • 使用 Chart Repositories 过滤器过滤由 Red Hat Certification ChartsOpenShift Helm Charts 提供的 chart。
    • 使用 Source 过滤器过滤来自 合作伙伴、 社区红帽 的 chart。认证图表显示为( odc verified icon )图标。
注意

如果只有一个供应商类型,则 Source 过滤器不可见。

现在,您可以选择所需的 chart 并安装它。

3.3. 禁用 Helm hart 仓库

作为集群管理员,您可以删除集群中的 Helm Chart 仓库,以便在 Developer Catalog 中不再显示它们。

3.3.1. 在集群中禁用 Helm Chart 仓库

您可以通过在 HelmChartRepository 自定义资源中添加 disabled 属性来禁用目录中的 Helm Charts。

流程

  • 要通过 CLI 禁用 Helm Chart 仓库,将 disabled: true 标志添加到自定义资源中。例如,要删除 Azure 示例 chart 存储库,请运行:

    $ cat <<EOF | oc apply -f -
    apiVersion: helm.openshift.io/v1beta1
    kind: HelmChartRepository
    metadata:
      name: azure-sample-repo
    spec:
      connectionConfig:
       url:https://raw.githubusercontent.com/Azure-Samples/helm-charts/master/docs
      disabled: true
    EOF
  • 使用 Web 控制台禁用最近添加的 Helm Chart 仓库:

    1. 进入 自定义资源定义 并搜索 HelmChartRepository 自定义资源。
    2. 进入 实例,找到您要禁用的存储库,并点击其名称。
    3. 进入 YAML 选项卡,在 spec 部分添加 disabled: true 标志,点 Save

      示例

      spec:
        connectionConfig:
          url: <url-of-the-repositoru-to-be-disabled>
        disabled: true

      现在,这个仓库已被禁用,并不会出现在目录中。

第 4 章 用于 OpenShift Serverless 的 Knative CLI(kn)

Knative kn CLI 在 OpenShift Container Platform 上启用了与 Knative 组件的简单交互。

您可以通过安装 OpenShift Serverless 在 OpenShift Container Platform 上启用 Knative。如需更多信息,请参阅开始使用 OpenShift Serverless

注意

OpenShift Serverless 不能使用 kn CLI 安装。集群管理员必须安装 OpenShift Serverless Operator 并设置 Knative 组件,如 OpenShift Container Platform 的 Serverless 应用程序文档中所述。

4.1. 主要特性

kn CLI 旨在使无服务器计算任务简单而简洁。kn CLI 的主要功能包括:

  • 从命令行部署无服务器应用程序。
  • 管理 Knative Serving 的功能,如服务、修订和流量分割。
  • 创建和管理 Knative Eventing 组件,如事件源和触发器。
  • 创建 sink 绑定来连接现有的 Kubernetes 应用程序和 Knative 服务。
  • 使用灵活的插件架构扩展 kn CLI,类似于 kubectl CLI。
  • 为 Knative 服务配置 autoscaling 参数。
  • 脚本化使用,如等待一个操作的结果,或部署自定义推出和回滚策略。

4.2. 安装 Knative CLI

请参阅安装 Knative CLI

第 5 章 Pipelines CLI (tkn)

5.1. 安装 tkn

通过一个终端,使用 tkn CLI 管理 Red Hat OpenShift Pipelines。下面的部分论述了如何在不同的平台中安装 tkn

在 OpenShift Container Platform web 控制台中,点右上角的 ? 图标并选 Command Line Tools

5.1.1. 在 Linux 上安装 Red Hat OpenShift Pipelines CLI(tkn)

对于 Linux 系统,您可以直接将 CLI 下载为 tar.gz 存档。

流程

  1. 下载相关的 CLI。

  2. 解包存档:

    $ tar xvzf <file>
  3. tkn 二进制代码放到 PATH 中的一个目录下。
  4. 运行以下命令可以查看 PATH 的值:

    $ echo $PATH

5.1.2. 使用 RPM 在 Linux 上安装 Red Hat OpenShift Pipelines CLI(tkn)

对于 Red Hat Enterprise Linux(RHEL)版本 8,您可以使用 RPM 安装 Red Hat OpenShift Pipelines CLI(tkn)。

先决条件

  • 您的红帽帐户必须具有有效的 OpenShift Container Platform 订阅。
  • 您在本地系统中有 root 或者 sudo 权限。

流程

  1. 使用 Red Hat Subscription Manager 注册:

    # subscription-manager register
  2. 获取最新的订阅数据:

    # subscription-manager refresh
  3. 列出可用的订阅:

    # subscription-manager list --available --matches '*pipelines*'
  4. 在上一命令的输出中,找到 OpenShift Container Platform 订阅的池 ID,并把订阅附加到注册的系统:

    # subscription-manager attach --pool=<pool_id>
  5. 启用 Red Hat OpenShift Pipelines 所需的仓库:

    • Linux (x86_64, amd64)

      # subscription-manager repos --enable="pipelines-1.5-for-rhel-8-x86_64-rpms"
    • Linux on IBM Z and LinuxONE (s390x)

      # subscription-manager repos --enable="pipelines-1.5-for-rhel-8-s390x-rpms"
    • Linux on IBM Power Systems (ppc64le)

      # subscription-manager repos --enable="pipelines-1.5-for-rhel-8-ppc64le-rpms"
  6. 安装 openshift-pipelines-client 软件包:

    # yum install openshift-pipelines-client

安装 CLI 后,就可以使用tkn命令:

$ tkn version

5.1.3. 在 Windows 上安装 Red Hat OpenShift Pipelines CLI(tkn)

对于 Windows,tkn CLI 以一个 zip 文件的形式提供。

流程

  1. 下载 CLI
  2. 使用 ZIP 程序解压存档。
  3. tkn.exe 文件的位置添加到 PATH 环境变量中。
  4. 要查看您的 PATH,请打开命令窗口并运行以下命令:

    C:\> path

5.1.4. 在 macOS 上安装 Red Hat OpenShift Pipelines CLI(tkn)

对于 macOS,tkn CLI 以一个 tar.gz 文件的形式提供。

流程

  1. 下载 CLI
  2. 解包和解压存档。
  3. tkn 二进制文件迁移至 PATH 上的目录中。
  4. 要查看 PATH,打开终端窗口并运行:

    $ echo $PATH

5.2. 配置 OpenShift Pipelines tkn CLI

配置 Red Hat OpenShift Pipelines tkn CLI 以启用 tab 自动完成功能。

5.2.1. 启用 tab 自动完成功能

在安装tkn CLI,可以启用 tab 自动完成功能,以便在按 Tab 键时自动完成tkn命令或显示建议选项。

先决条件

  • 已安装tkn CLI。
  • 需要在本地系统中安装了 bash-completion

流程

以下过程为 Bash 启用 tab 自动完成功能。

  1. 将 Bash 完成代码保存到一个文件中:

    $ tkn completion bash > tkn_bash_completion
  2. 将文件复制到 /etc/bash_completion.d/

    $ sudo cp tkn_bash_completion /etc/bash_completion.d/

    您也可以将文件保存到一个本地目录,并从您的.bashrc文件中 source 这个文件。

开新终端时 tab 自动完成功能将被启用。

5.3. OpenShift Pipelines tkn 参考

本节列出了基本的 tkn CLI 命令。

5.3.1. 基本语法

tkn [command or options] [arguments…​]

5.3.2. 全局选项

--help, -h

5.3.3. 工具命令

5.3.3.1. tkn

tkn CLI 的主命令。

示例: 显示所有选项

$ tkn

5.3.3.2. completion [shell]

输出 shell 完成代码,必须经过评估方可提供互动完成。支持的 shell 是 bashzsh

示例:bash shell 完成代码

$ tkn completion bash

5.3.3.3. version

输出 tkn CLI 的版本信息。

示例: 检查 tkn 版本

$ tkn version

5.3.4. Pipelines 管理命令

5.3.4.1. pipeline

管理管道。

示例: 显示帮助信息

$ tkn pipeline --help

5.3.4.2. pipeline delete

删除 Pipeline

示例: 从命名空间中删除 mypipeline Pipeline

$ tkn pipeline delete mypipeline -n myspace

5.3.4.3. pipeline describe

描述管道。

示例: 描述 mypipeline Pipeline

$ tkn pipeline describe mypipeline

5.3.4.4. pipeline list

列出管道。

示例: 显示 Pipelines 列表

$ tkn pipeline list

5.3.4.5. pipeline logs

显示特定 Pipeline 的 Pipeline 日志。

示例:mypipeline Pipeline 的 Stream live 日志

$ tkn pipeline logs -f mypipeline

5.3.4.6. pipeline start

运行 Pipeline。

示例: 启动 mypipeline Pipeline

$ tkn pipeline start mypipeline

5.3.5. PipelineRun 命令

5.3.5.1. pipelinerun

管理 PipelineRuns。

示例: 显示帮助信息

$ tkn pipelinerun -h

5.3.5.2. pipelinerun cancel

取消 PipelineRun。

示例:从命名空间中取消 mypipelinerun PipelineRun

$ tkn pipelinerun cancel mypipelinerun -n myspace

5.3.5.3. pipelinerun delete

删除 PipelineRun。

示例: 从命名空间中删除 PipelineRuns

$ tkn pipelinerun delete mypipelinerun1 mypipelinerun2 -n myspace

5.3.5.4. pipelinerun describe

描述 PipelineRun。

示例:描述命名空间中的 mypipelinerun PipelineRun

$ tkn pipelinerun describe mypipelinerun -n myspace

5.3.5.5. pipelinerun list

列出 PipelineRuns。

示例: 显示命名空间中的 PipelineRuns 列表

$ tkn pipelinerun list -n myspace

5.3.5.6. pipelinerun logs

显示一个 PipelineRun 的日志。

示例:显示 mypipelinerun PipelineRun 的日志,包括命名空间中的所有任务和步骤

$ tkn pipelinerun logs mypipelinerun -a -n myspace

5.3.6. 任务管理命令

5.3.6.1. task

管理任务。

示例: 显示帮助信息

$ tkn task -h

5.3.6.2. task delete

删除一个任务。

示例:从命令空间中删除 mytask1mytask2 任务

$ tkn task delete mytask1 mytask2 -n myspace

5.3.6.3. task describe

描述一个任务。

示例:描述一个命名空间中的 mytask 任务

$ tkn task describe mytask -n myspace

5.3.6.4. task list

列出任务。

示例: 列出命名空间中的所有任务

$ tkn task list -n myspace

5.3.6.5. task logs

显示任务日志。

示例:显示 mytask 任务的 mytaskrun TaskRun 的日志

$ tkn task logs mytask mytaskrun -n myspace

5.3.6.6. task start

启动一个任务。

示例: 在命名空间中启动 mytask 任务

$ tkn task start mytask -s <ServiceAccountName> -n myspace

5.3.7. TaskRun 命令

5.3.7.1. taskrun

管理 TaskRuns。

示例: 显示帮助信息

$ tkn taskrun -h

5.3.7.2. taskrun cancel

取消 TaskRun。

示例:从一个命名空间中取消 mytaskrun TaskRun

$ tkn taskrun cancel mytaskrun -n myspace

5.3.7.3. taskrun delete

删除一个 TaskRun。

示例:从一个命名空间中删除 mytaskrun1mytaskrun2 TaskRuns

$ tkn taskrun delete mytaskrun1 mytaskrun2 -n myspace

5.3.7.4. taskrun describe

描述 TaskRun。

示例:描述命名空间中的 mytaskrun TaskRun

$ tkn taskrun describe mytaskrun -n myspace

5.3.7.5. taskrun list

列出 TaskRuns。

示例: 列出命名空间中的所有 TaskRuns

$ tkn taskrun list -n myspace

5.3.7.6. taskrun logs

显示 TaskRun 日志。

示例: 显示命名空间中 mytaskrun TaskRun 的实时日志

$ tkn taskrun logs -f mytaskrun -n myspace

5.3.8. 条件管理命令

5.3.8.1. 条件

管理条件(Condition)。

示例: 显示帮助信息

$ tkn condition --help

5.3.8.2. 删除条件

删除一个条件。

示例:从命名空间中删除 mycondition1 Condition

$ tkn condition delete mycondition1 -n myspace

5.3.8.3. condition describe

描述条件。

示例:在命名空间中描述 mycondition1 Condition

$ tkn condition describe mycondition1 -n myspace

5.3.8.4. condition list

列出条件。

示例: 列出命名空间中的条件

$ tkn condition list -n myspace

5.3.9. Pipeline 资源管理命令

5.3.9.1. resource

管理管道资源。

示例: 显示帮助信息

$ tkn resource -h

5.3.9.2. resource create

创建一个 Pipeline 资源。

示例: 在命名空间中创建一个 Pipeline 资源

$ tkn resource create -n myspace

这是一个交互式命令,它要求输入资源名称、资源类型以及基于资源类型的值。

5.3.9.3. resource delete

删除 Pipeline 资源。

示例:从命名空间中删除 myresource Pipeline 资源

$ tkn resource delete myresource -n myspace

5.3.9.4. resource describe

描述管道资源。

示例:描述 myresource Pipeline 资源

$ tkn resource describe myresource -n myspace

5.3.9.5. resource list

列出管道资源。

示例: 列出命名空间中的所有管道资源

$ tkn resource list -n myspace

5.3.10. ClusterTask 管理命令

5.3.10.1. clustertask

管理 ClusterTasks。

示例: 显示帮助信息

$ tkn clustertask --help

5.3.10.2. clustertask delete

删除集群中的 ClusterTask 资源。

示例: 删除 mytask1mytask2 ClusterTasks

$ tkn clustertask delete mytask1 mytask2

5.3.10.3. clustertask describe

描述 ClusterTask。

示例: 描述 mytask ClusterTask

$ tkn clustertask describe mytask1

5.3.10.4. clustertask list

列出 ClusterTasks。

示例: 列出 ClusterTasks

$ tkn clustertask list

5.3.10.5. clustertask start

启动 ClusterTasks。

示例: 启动 mytask ClusterTask

$ tkn clustertask start mytask

5.3.11. 触发器管理命令

5.3.11.1. eventlistener

管理 EventListeners。

示例: 显示帮助信息

$ tkn eventlistener -h

5.3.11.2. eventlistener delete

删除一个 EventListener。

示例:删除命令空间中的 mylistener1mylistener2 EventListeners

$ tkn eventlistener delete mylistener1 mylistener2 -n myspace

5.3.11.3. eventlistener describe

描述 EventListener。

示例:描述命名空间中的 mylistener EventListener

$ tkn eventlistener describe mylistener -n myspace

5.3.11.4. eventlistener list

列出 EventListeners。

示例: 列出命名空间中的所有 EventListeners

$ tkn eventlistener list -n myspace

5.3.11.5. eventListener 日志

显示 EventListener 的日志。

示例: 在一个命名空间中显示 mylistener EventListener 的日志

$ tkn eventlistener logs mylistener -n myspace

5.3.11.6. triggerbinding

管理 TriggerBindings。

示例: 显示 TriggerBindings 帮助信息

$ tkn triggerbinding -h

5.3.11.7. triggerbinding delete

删除 TriggerBinding。

示例:删除一个命名空间中的 mybinding1mybinding2 TriggerBindings

$ tkn triggerbinding delete mybinding1 mybinding2 -n myspace

5.3.11.8. triggerbinding describe

描述 TriggerBinding。

示例:描述命名空间中的 mybinding TriggerBinding

$ tkn triggerbinding describe mybinding -n myspace

5.3.11.9. triggerbinding list

列出 TriggerBindings。

示例: 列出命名空间中的所有 TriggerBindings

$ tkn triggerbinding list -n myspace

5.3.11.10. triggertemplate

管理 TriggerTemplates。

示例: 显示 TriggerTemplate 帮助

$ tkn triggertemplate -h

5.3.11.11. triggertemplate delete

删除 TriggerTemplate。

示例:删除命名空间中的 mytemplate1mytemplate2 TriggerTemplates

$ tkn triggertemplate delete mytemplate1 mytemplate2 -n `myspace`

5.3.11.12. triggertemplate describe

描述 TriggerTemplate。

示例: 描述命名空间中的 mytemplate TriggerTemplate

$ tkn triggertemplate describe mytemplate -n `myspace`

5.3.11.13. triggertemplate list

列出 TriggerTemplates。

示例: 列出命名空间中的所有 TriggerTemplates

$ tkn triggertemplate list -n myspace

5.3.11.14. clustertriggerbinding

管理 ClusterTriggerBindings。

示例: 显示 ClusterTriggerBindings 帮助信息

$ tkn clustertriggerbinding -h

5.3.11.15. clustertriggerbinding delete

删除 ClusterTriggerBinding。

示例: 删除 myclusterbinding1myclusterbinding2 ClusterTriggerBindings

$ tkn clustertriggerbinding delete myclusterbinding1 myclusterbinding2

5.3.11.16. clustertriggerbinding describe

描述 ClusterTriggerBinding。

示例: 描述 myclusterbinding ClusterTriggerBinding

$ tkn clustertriggerbinding describe myclusterbinding

5.3.11.17. clustertriggerbinding list

列出 ClusterTriggerBindings。

示例: 列出所有 ClusterTriggerBindings

$ tkn clustertriggerbinding list

5.3.12. hub 互动命令

与 Tekton Hub 交互,以获取任务和管道等资源。

5.3.12.1. hub

与 hub 交互。

示例: 显示帮助信息

$ tkn hub -h

示例:与 hub API 服务器交互

$ tkn hub --api-server https://api.hub.tekton.dev

注意

对于每个示例,若要获取对应的子命令和标记,请运行 tkn hub <command> --help

5.3.12.2. hub downgrade

对一个安装的资源进行降级。

示例:将 mynamespace 命名空间中的 mytask 任务降级到它的较旧版本

$ tkn hub downgrade task mytask --to version -n mynamespace

5.3.12.3. hub get

按名称、类型、目录和版本获取资源清单。

示例:从 tekton 目录中获取 myresource 管道或任务的特定版本的清单

$ tkn hub get [pipeline | task] myresource --from tekton --version version

5.3.12.4. hub info

按名称、类型、目录和版本显示资源的信息。

示例:显示 tekton 目录中有关 mytask 任务的特定版本的信息

$ tkn hub info task mytask --from tekton --version version

5.3.12.5. hub install

按类型、名称和版本从目录安装资源。

示例:从 mynamespace 命名空间中的 tekton 目录安装 mytask 任务的特定版本

$ tkn hub install task mytask --from tekton --version version -n mynamespace

5.3.12.6. hub reinstall

按类型和名称重新安装资源。

示例:从 mynamespace 命名空间中的 tekton 目录重新安装 mytask 任务的特定版本

$ tkn hub reinstall task mytask --from tekton --version version -n mynamespace

5.3.12.8. hub upgrade

升级已安装的资源。

示例:将 mynamespace 命名空间中安装的 mytask 任务升级到新版本

$ tkn hub upgrade task mytask --to version -n mynamespace

第 6 章 opm CLI

6.1. 关于 opm

opm CLI 工具由 Operator Framework 提供,用于 Operator 捆绑格式。您可以通过一个名为 index 的捆绑包列表创建和维护 Operator 目录,类似于软件存储库。其结果是一个名为 index image(索引镜像) 的容器镜像,它可以存储在容器的 registry 中,然后安装到集群中。

索引包含一个指向 Operator 清单内容的指针数据库,可通过在运行容器镜像时提供的已包含 API 进行查询。在 OpenShift Container Platform 中,Operator Lifecycle Manager(OLM)可通过在 CatalogSource 中引用索引镜像来使它作为目录一个(catalog),它会定期轮询镜像,以对集群上安装的 Operator 进行更新。

其他资源

6.2. 安装 opm

您可以在您的 Linux、macOS 或者 Windows 工作站上安装 opm CLI 工具。

先决条件

  • 对于 Linux,您必须提供以下软件包:

    • podman 1.9.3+(推荐版本 2.0+)
    • glibc 版本 2.28+

流程

  1. 导航到 OpenShift 镜像站点并下载与您的操作系统匹配的 tarball 的最新版本。
  2. 解包存档。

    • 对于 Linux 或者 macOS:

      $ tar xvf <file>
    • 对于 Windows,使用 ZIP 程序解压存档。
  3. 将文件放在 PATH 中的任何位置。

    • 对于 Linux 或者 macOS:

      1. 检查 PATH:

        $ echo $PATH
      2. 移动文件。例如:

        $ sudo mv ./opm /usr/local/bin/
    • 对于 Windows:

      1. 检查 PATH:

        C:\> path
      2. 移动文件:

        C:\> move opm.exe <directory>

验证

  • 安装 opm CLI 后,验证是否可用:

    $ opm version

    输出示例

    Version: version.Version{OpmVersion:"v1.15.4-2-g6183dbb3", GitCommit:"6183dbb3567397e759f25752011834f86f47a3ea", BuildDate:"2021-02-13T04:16:08Z", GoOs:"linux", GoArch:"amd64"}

6.3. 其他资源

第 7 章 Operator SDK

7.1. 安装 Operator SDK CLI

Operator SDK 提供了一个命令行界面(CLI)工具,Operator 开发人员可使用它来构建、测试和部署 Operator。您可以在工作站上安装 Operator SDK CLI,以便准备开始编写自己的 Operator。

如需有关 Operator SDK 的完整文档,请参阅 Operators

注意

OpenShift Container Platform 4.8 及更新的版本支持 Operator SDK v1.8.0。

7.1.1. 安装 Operator SDK CLI

您可以在 Linux 上安装 OpenShift SDK CLI 工具。

先决条件

  • Go v1.16+
  • docker v17.03+、podman v1.9.3+ 或 buildah v1.7+

流程

  1. 导航到 OpenShift 镜像站点
  2. 4.8.4 目录中,下载适用于 Linux 的 tarball 的最新版本。
  3. 解包存档:

    $ tar xvf operator-sdk-v1.8.0-ocp-linux-x86_64.tar.gz
  4. 使文件可执行:

    $ chmod +x operator-sdk
  5. 将提取的 operator-sdk 二进制文件移到 PATH 中的一个目录中。

    提示

    检查 PATH

    $ echo $PATH
    $ sudo mv ./operator-sdk /usr/local/bin/operator-sdk

验证

  • 安装 Operator SDK CLI 后,验证它是否可用:

    $ operator-sdk version

    输出示例

    operator-sdk version: "v1.8.0-ocp", ...

7.2. Operator SDK CLI 参考

Operator SDK 命令行界面(CLI)是一个开发组件,旨在更轻松地编写 Operator。

operator SDK CLI 语法

$ operator-sdk <command> [<subcommand>] [<argument>] [<flags>]

具有集群管理员访问权限的 operator 作者(如 OpenShift Container Platform)可以使用 Operator SDK CLI 根据 Go、Ansible 或 Helm 开发自己的 Operator。Kubebuilder 作为基于 Go 的 Operator 的构建解决方案嵌入到 Operator SDK 中,这意味着现有的 Kubebuilder 项目可以象 Operator SDK 一样使用并继续工作。

如需有关 Operator SDK 的完整文档,请参阅 Operators

7.2.1. bundle

operator-sdk bundle 命令管理 Operator 捆绑包元数据。

7.2.1.1. validate

bundle validate 子命令会验证 Operator 捆绑包。

表 7.1. bundle validate 标记

标记描述

-h--help

bundle validate 子命令的帮助输出。

--index-builder(字符串)

拉取和解包捆绑包镜像的工具。仅在验证捆绑包镜像时使用。可用选项是 docker(默认值)、podmannone

--list-optional

列出所有可用的可选验证器。设置后,不会运行验证器。

--select-optional(字符串)

选择要运行的可选验证器的标签选择器。当使用 --list-optional 标志运行时,会列出可用的可选验证器。

7.2.2. cleanup

operator-sdk cleanup 命令会销毁并删除为通过 run 命令部署的 Operator 创建的资源。

表 7.2. cleanup 标记

标记描述

-h--help

run bundle 子命令的帮助输出。

--kubeconfig (string)

用于 CLI 请求的 kubeconfig 文件的路径。

n--namespace(字符串)

如果存在,代表在其中运行 CLI 请求的命名空间。

--timeout <duration>

失败前,等待命令完成的时间。默认值为 2m0s

7.2.3. completion

operator-sdk completion 命令生成 shell completion,以便更迅速、更轻松地发出 CLI 命令。

表 7.3. completion 子命令

子命令描述

bash

生成 bash completion。

zsh

生成 zsh completion。

表 7.4. completion 标记

标记描述

-h, --help

使用方法帮助输出。

例如:

$ operator-sdk completion bash

输出示例

# bash completion for operator-sdk                         -*- shell-script -*-
...
# ex: ts=4 sw=4 et filetype=sh

7.2.4. create

operator-sdk create 命令用于创建或 scaffold Kubernetes API。

7.2.4.1. api

create api 子命令构建 Kubernetes API。子命令必须在 init 命令初始化的项目中运行。

表 7.5. create api 标记

标记描述

-h--help

run bundle 子命令的帮助输出。

7.2.5. generate

operator-sdk generate 命令调用特定的生成器来生成代码或清单。

7.2.5.1. bundle

generate bundle 子命令为您的 Operator 项目生成一组捆绑包清单、元数据和 bundle.Dockerfile 文件。

注意

通常,您首先运行 generate kustomize manifests 子命令来生成由 generate bundle 子命令使用的输入 Kustomize 基础。但是,您可以使用初始项目中的 make bundle 命令按顺序自动运行这些命令。

表 7.6. generate bundle 标记

标记描述

--channels(字符串)

捆绑包所属频道的以逗号分隔的列表。默认值为 alpha

--crds-dir(字符串)

CustomResoureDefinition 清单的根目录。

--default-channel(字符串)

捆绑包的默认频道。

--deploy-dir(字符串)

Operator 清单的根目录,如部署和 RBAC。这个目录与传递给 --input-dir 标记的目录不同。

-h--help

generate bundle 的帮助信息

--input-dir(字符串)

从中读取现有捆绑包的目录。这个目录是捆绑包 manifests 目录的父目录,它与 --deploy-dir 目录不同。

--kustomize-dir(字符串)

包含 Kustomize 基础的目录以及用于捆绑包清单的 kustomization.yaml 文件。默认路径为 config/manifests

--manifests

生成捆绑包清单。

--metadata

生成捆绑包元数据和 Dockerfile。

--output-dir(字符串)

将捆绑包写入的目录。

--overwrite

如果捆绑包元数据和 Dockerfile 存在,则覆盖它们。默认值为 true

--package(字符串)

捆绑包的软件包名称。

-q--quiet

在静默模式下运行。

--stdout

将捆绑包清单写入标准输出。

--version(字符串)

生成的捆绑包中的 Operator 语义版本。仅在创建新捆绑包或升级 Operator 时设置。

其他资源

7.2.5.2. kustomize

generate kustomize 子命令包含为 Operator 生成 Kustomize 数据的子命令。

7.2.5.2.1. 清单

generate kustomize manifests 子命令生成或重新生成 Kustomize 基础以及 config/manifests 目录中的 kustomization.yaml 文件,用于其他 Operator SDK 命令构建捆绑包清单。在默认情况下,这个命令会以互动方式询问 UI 元数据,即清单基础的重要组件,除非基础已存在或设置了 --interactive=false 标志。

表 7.7. generate kustomize manifests 标记

标记描述

--apis-dir(字符串)

API 类型定义的根目录。

-h--help

generate kustomize manifests 的帮助信息。

--input-dir(字符串)

包含现有 Kustomize 文件的目录。

--interactive

当设置为 false 时,如果没有 Kustomize 基础,则会出现交互式命令提示符来接受自定义元数据。

--output-dir(字符串)

写入 Kustomize 文件的目录。

--package(字符串)

软件包名称。

-q--quiet

在静默模式下运行。

7.2.6. init

operator-sdk init 命令初始化 Operator 项目,并为给定插件生成或 scaffolds 默认项目目录布局。

这个命令会写入以下文件:

  • boilerplate 许可证文件
  • 带有域和库的PROJECT 文件
  • 构建项目的Makefile
  • go.mod 文件带有项目依赖项
  • 用于自定义清单的 kustomization.yaml 文件
  • 用于为管理器清单自定义镜像的补丁文件
  • 启用 Prometheus 指标的补丁文件
  • 运行的 main.go 文件

表 7.8. init 标记

标记描述

--help, -h

init 命令的帮助输出。

--plugins(字符串)

插件的名称和可选版本,用于初始化项目。可用插件包括 ansible.sdk.operatorframework.io/v1go.kubebuilder.io/v2go.kubebuilder.io/v3helm.sdk.operatorframework.io/v1

--project-version

项目版本。可用值为 23-alpha(默认值)。

7.2.7. run

operator-sdk run 命令提供可在各种环境中启动 Operator 的选项。

7.2.7.1. bundle

run bundle 子命令使用 Operator Lifecycle Manager(OLM)以捆绑包格式部署 Operator。

表 7.9. run bundle 标记

标记描述

--index-image(字符串)

在其中注入捆绑包的索引镜像。默认镜像为 quay.io/operator-framework/upstream-opm-builder:latest

--install-mode <install_mode_value>

安装 Operator 的集群服务版本(CSV)支持的模式,如 AllNamespacesSingleNamespace

--timeout <duration>

安装超时。默认值为 2m0s

--kubeconfig (string)

用于 CLI 请求的 kubeconfig 文件的路径。

n--namespace(字符串)

如果存在,代表在其中运行 CLI 请求的命名空间。

-h--help

run bundle 子命令的帮助输出。

其他资源

7.2.7.2. bundle-upgrade

run bundle-upgrade 子命令升级之前使用 Operator Lifecycle Manager(OLM)以捆绑包格式安装的 Operator。

表 7.10. run bundle-upgrade 标记

标记描述

--timeout <duration>

升级超时。默认值为 2m0s

--kubeconfig (string)

用于 CLI 请求的 kubeconfig 文件的路径。

n--namespace(字符串)

如果存在,代表在其中运行 CLI 请求的命名空间。

-h--help

run bundle 子命令的帮助输出。

7.2.8. scorecard

operator-sdk scorecard 命令运行 scorecard 工具来验证 Operator 捆绑包并提供改进建议。该命令使用一个参数,可以是捆绑包镜像,也可以是包含清单和元数据的目录。如果参数包含镜像标签,则镜像必须远程存在。

表 7.11. scorecard 标记

标记描述

-c, --config(字符串)

scorecard 配置文件的路径。默认路径为 bundle/tests/scorecard/config.yaml

-h--help

scorecard 命令的帮助输出。

--kubeconfig (string)

kubeconfig 文件的路径。

-L--list

列出哪些测试可以运行。

-n、--namespace(字符串)

运行测试镜像的命名空间。

-o, --output(字符串)

结果的输出格式。可用值为 text (默认值)和 json

-l--selector(字符串)

标识选择器以确定要运行哪个测试。

-s--service-account(字符串)

用于测试的服务帐户。默认值为 default

-x--skip-cleanup

运行测试后禁用资源清理。

-w--wait-time <duration>

等待测试完成的时间,如 35s。默认值为 30s

其他资源