OCP将OpenShift集群中的为由主节点管理的对象统称为资源,如:node、service、pod、project、deployment、user。
即使针对的是不同的资源,OpenShift命令行工具也提供了一种统一的、一致的方法来更新、修改、删除和查询这些资源。
oc命令行工具提供了在软件开发项目的整个交付生命周期中修改和管理资源的常见操作。
在OpenShift安装过程中,oc命令行工具安装在所有master和node节点上,还可以在不属于OpenShift集群的机器。
安装后,可以使用用户名和密码对任何主节点通过身份验证后执行相关命令。
根据使用的平台,安装oc命令行工具有以下几种方式:
yum安装:在RHEL平台上,可通过以下命令安装oc客户端命令。
[user@host ~]$ sudo yum install atomic-openshift-clients
其它 Linux 发行版本和操作系统,需在拥有 OpenShift 订阅后,在 Red Hat Customer Portal 中下载。
提示:oc安装完成后自动补全需要退出一次才可生效,或者source /etc/bash_completion.d/oc。
[student@workstation ~]$ oc --help #显示帮助信息
[student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com #登录到OpenShift集群
提示:从client成功通过身份验证之后,OpenShift将授权令牌保存在用户的主文件夹中。此令牌用于后续请求,从而无需重新输入凭据或完整的主URL。
1 [root@master ~]# oc whoami
2 system:admin #master的root用户为集群的最高权限的用户
3 [student@workstation ~]$ oc whoami #查看当前用户
4 developer
5 [student@workstation ~]$ oc new-project working #创建project
6 [student@workstation ~]$ oc status #查看项目状态
7 In project working on server https://master.lab.example.com:443
8 You have no services, deployment configs, or build configs.
9 Run 'oc new-app' to create an application.
10 [student@workstation ~]$ oc delete project working #删除project
11 [student@workstation ~]$ oc logout #退出该集群。
12 [student@workstation ~]$ oc get pods #查看pod
13 NAME READY STATUS RESTARTS AGE
14 hello-openshift-1-6ls8z 1/1 Running 0 4h
15 [student@workstation ~]$ oc get all #查看所有主要组件信息
16 [student@workstation ~]$ oc get pods -w #-w表示以监视模式运行
oc describe:如果oc get提供的摘要不够,可以使用oc describe命令检索关于资源的更详细信息。
[student@workstation ~]$ oc describe pod hello-openshift-1-6ls8z
oc export:使用oc export命令导出资源的定义。典型的用例包括创建备份,或者用于修改定义。默认情况下,export命令以YAML格式输出对象表示,但是可以通过提供-o选项来更改。
oc create:使用oc create命令从资源定义创建资源。通常,这与用于编辑定义的oc export命令相匹配。
oc delete RESOURCE_TYPE name:使用oc delete命令从OpenShift集群中删除资源。
注意:部分资源直接删除后会重新创建,如基于rc的pod,需要对OpenShift体系资源展示形式有一个基本的了解。
oc exec:使用oc exec命令在容器中执行命令,可以使用此命令作为脚本的一部分运行交互式和非交互式批处理命令。
oc rsh POD:oc rsh pod命令打开到容器的远程shell会话,要远程登录到容器shell并执行命令,请运行以下命令。
[student@workstation ~]$ oc rsh <pod>
注意:oc rsh需要pod中存在相应的shell,如bash。
OpenShift容器平台中的应用程序由不同类型的资源组成,主要常见的类型有:
使用oc types命令快速查看可用的概念和类型。
简单的应用程序、复杂的多层应用程序和微服务应用程序都可以使用资源定义文件来描述。
这个文件包含许多pod定义、连接这些pod的服务定义、用于水平伸缩应用程序pod的rc或dc、用于持久存储应用程序数据的持久卷,以及OpenShift可以管理的任何其他需要的内容。
oc new-app命令可以使用-o json或-o yaml选项分别创建以json或yaml格式的定义文件的资源。可以使用oc create -f <filename>命令调用定义文件,并将其用于创建应用程序,或者与其他资源定义文件合并以创建复合应用程序。
oc new-app命令可以以许多不同的方式创建在OpenShift上运行的pod应用程序。它可以使用source-to-image (S2I)流程从现有docker映像、Dockerfiles或原始源代码创建pod。
运行oc new-app -h命令,了解在OpenShift上创建新应用程序的所有不同选项。最常见的选项如下:
运行以下命令创建应用程序。OpenShift根据Docker配置文件的ADD_REGISTRY选项定义的仓库 pull image。
$ oc new-app mysql MYSQL_USER=user MYSQL_PASSWORD=pass MYSQL_DATABASE=testdb -l
db=mysql
根据私有仓库中的image创建应用程序。
$ oc new-app --docker-image=myregistry.com/mycompany/myapp --name=myapp
根据存储在Git库中的源代码创建应用程序。
$ oc new-app https://github.com/openshift/ruby-hello-world --name=ruby-hello
创建基于存储在Git库中的源代码并引用IS的应用程序。
$ oc new-app https://mygitrepo/php-hello -i php:7.0 --name=php-hello
从Docker配置文件的ADD_REGISTRY指令定义的可用仓库之一创建一个基于mysql映像的应用程序。l db=mysql选项定义了一个值为mysql的db标签。
$ oc new-app mysql MYSQL_USER=user \
MYSQL_PASSWORD=pass \
MYSQL_DATABASE=testdb \
-l db=mysql
下图显示了oc new-app命令在参数为容器image时创建的Kubernetes和OpenShift资源。该命令创建dc、is和svc,可以通过端口或route从外部访问。
提示:通过使用带有源代码的oc new-app,将创建一个build configuration,而bc又从源代码创建一个新的应用程序。但是,如果命令中没有使用源代码,则不会创建gc。该命令始终为应用程序创建dc和svc。
准备完整的OpenShift集群,参考《003.OpenShift网络》2.1。
[student@workstation ~]$ lab manage-oc setup
1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
2 [student@workstation ~]$ oc project default
3 Already on project "default" on server "https://master.lab.example.com:443".
4 [student@workstation ~]$ oc project default
5 Already on project "default" on server "https://master.lab.example.com:443".
6 [student@workstation ~]$ oc get nodes
7 NAME STATUS ROLES AGE VERSION
8 master.lab.example.com Ready master 23h v1.9.1+a0ce1bc657
9 node1.lab.example.com Ready compute 23h v1.9.1+a0ce1bc657
10 node2.lab.example.com Ready compute 23h v1.9.1+a0ce1bc657
11 [student@workstation ~]$ oc describe node master.lab.example.com #查看master节点详情
12 [student@workstation ~]$ oc describe node node1.lab.example.com
13 [student@workstation ~]$ oc describe node node2.lab.example.com
14 [student@workstation ~]$ oc get pods -o wide
15 NAME READY STATUS RESTARTS AGE IP NODE
16 docker-registry-1-8v7sh 1/1 Running 4 23h 10.129.0.30 node2.lab.example.com
17 docker-registry-1-rrmhm 1/1 Running 2 23h 10.128.0.12 node1.lab.example.com
18 registry-console-1-xzxxp 1/1 Running 4 23h 10.129.0.31 node2.lab.example.com
19 router-1-fwttd 1/1 Running 4 23h 172.25.250.12 node2.lab.example.com
20 router-1-xdw84 1/1 Running 2 23h 172.25.250.11 node1.lab.example.com
21 [student@workstation ~]$ oc describe pod docker-registry-1-8v7sh #查看pod详情
[student@workstation ~]$ oc exec docker-registry-1-8v7sh hostname #执行pod中命令
docker-registry-1-8v7sh
[student@workstation ~]$ oc exec router-1-fwttd ls /
[student@workstation ~]$ oc exec docker-registry-1-8v7sh cat /etc/resolv.conf
提示:只要pod中存在的命令,都可以通过oc exec直接执行。
[student@workstation ~]$ oc rsh docker-registry-1-8v7sh #进入pod的shell
sh-4.2$ ls /
[student@workstation ~]$ oc status -v #现实详细的状态
[student@workstation ~]$ oc get events #查看集群生命周期事件
[student@workstation ~]$ oc get all #获取所有资源信息
[student@workstation ~]$ oc export pod docker-registry-1-8v7sh
提示:oc export命令通常用于导出现有资源,并将它们转换为配置文件(YAML或JSON),以便备份或在集群的其他地方重新创建资源。
[student@workstation ~]$ oc export svc,dc docker-registry --as-template=docker-registry
#通过将--as-template选项传递给oc export命令,将多个资源作为OpenShift模板同时导出。
[student@workstation ~]$ oc export svc,dc docker-registry > docker-registry.yaml #也可以使用重定向导出
[student@workstation ~]$ oc export --help #查看帮助
使用RPM安装的OCP,那么master和node的ocp相关服务将作为Red Hat Enterprise Linux服务运行。从master和node使用标准的sosreport实用程序,收集关于环境的信息,以及docker和openshift相关的信息。
[root@master ~]# sosreport -k docker.all=on -k docker.logs=on
sosreport命令创建一个包含所有相关信息的压缩归档文件,并将其保存在/var/tmp目录中。
另一个有用的诊断工具是oc adm diagnostics命令,能够在OpenShift集群上运行多个诊断检查,包括network、日志、内部仓库、master节点和node节点的服务检查等等。oc adm diagnostics --help命令,获取帮助。
oc客户端命令是用来检测和排除OpenShift集群中的问题的主要工具。它有许多选项,能够检测、诊断和修复由集群管理的主机和节点、服务和资源的问题。若已授权所需的权限,可以直接编辑集群中大多数托管资源的配置。
事件允许OpenShift记录集群中生命周期事件的信息,以统一的方式查看关于OpenShift组件的信息。oc get events命令提供OpenShift namespace的事件信息,可实现以下事件的捕获:
事件通常用于故障排除,从而获得关于集群中的故障和问题的高级信息,然后使用日志文件和其他oc子命令进一步定位。
示例:使用以下命令获得特定项目中的事件列表。
[student@workstation ~]$ oc get events -n <project>
也可以通过Web控制台进行事件的查看events。
oc logs命令查看build、deployment或pod的日志输出,。
示例1:使用oc命令查看pod的日志。
[student@workstation ~]$ oc logs pod
示例2:使用oc命令查看build的日志。
[student@workstation ~]$ oc logs bc/build-name
使用oc logs命令和-f选项实时跟踪日志输出。例如,这对于连续监视build的进度和检查错误非常有用。
也可以通过Web控制台进行事件的查看log。
oc rsync命令将内容复制到正在运行的pod中的目录或从目录复制内容。如果一个pod有多个容器,可以使用-c选项指定容器ID。否则,它默认为pod中的第一个容器。通常用于从容器传输日志文件和配置文件。
示例1:将pod目录中的内容复制到本地目录。
[student@workstation ~]$ oc rsync <pod>:<pod_dir> <local_dir> -c <container>
示例2:将内容从本地目录复制到pod的目录中。
[student@workstation ~]$ oc rsync <local_dir> <pod>:<pod_dir> -c <container>
使用oc port-forward命令将一个或多个本地端口转发到pod。这允许在本地监听特定或随机端口,并将数据转发到pod中的特定端口。
示例1:本地监听3306并转发到pod的3306.
[student@workstation ~]$ oc port-forward <pod> 3306:3306
对于设置了资源限制和配额的项目,不适当的资源配置将导致部署失败。使用oc get events和oc describe命令来排查失败的原因。
例如试图创建超过项目中pod数量配额限制的pod数量,那么在运行oc get events命令时会提示:
Warning FailedCreate {hello-1-deploy} Error creating: pods "hello-1" is forbidden:
exceeded quota: project-quota, requested: cpu=250m, used: cpu=750m, limited: cpu=900m
使用oc logs命令查看S2I构建失败。例如,要查看名为hello的构建配置的日志:
[student@workstation ~]$ oc logs bc/hello
例如可以通过在build configuration策略中指定BUILD_LOGLEVEL环境变量来调整build日志的详细程度。
1 {
2 "sourceStrategy": {
3 ...
4 "env": [
5 {
6 "name": "BUILD_LOGLEVEL",
7 "value": "5"
8 }
9 ]
10 }
11 }
通常是由不正确的deployment configuration造成、部署期间引用的错误或缺少image或Docker配置不当造成。
使用oc get events和oc describe命令排查,通过使用oc edit dc/<deploymentconfig>编辑deployment configuration来修复错误。
master和node上不正确的docker配置可能会在部署期间导致许多错误。
通常检查ADD_REGISTRY、INSECURE_REGISTRY和BLOCK_REGISTRY设置。使用systemctl status, oc logs, oc get events和oc describe命令对问题进行排查。
可以通添加/etc/sysconfig/docker配置文件中的--log-level参数来更改docker服务日志级别。
示例:将日志级别设置为debug。
OPTIONS='--insecure-registry=172.30.0.0/16 --selinux-enabled --log-level=debug'
运行systemctl status命令,对atomicopenshift-master、atom-openshift-node、etcd和docker服务中的问题进行排查。使用journalctl -u <unit-name>命令查看与前面列出的服务相关的系统日志。
可以通过在各自的配置文件中编辑--loglevel变量,然后重新启动关联的服务,来增加来自atom-openshift-node、atomicopenshift-master-controllers和atom-openshift-master-api服务的详细日志记录。
示例:设置OpenShift主控制器log level为debug级别,修改/etc/sysconfig/atomic-openshift-master-controllers文件。
OPTIONS=--loglevel=4 --listen=https://0.0.0.0:8444
延伸:
Red Hat OpenShift容器平台有五个级别的日志详细程度,无论日志配置如何,日志中都会出现带有致命、错误、警告和某些信息严重程度的消息。
OpenShift master调度pod在node上运行,通常由于node本身没有处于就绪状态,也由于资源限制和配额,pod无法运行。
使用oc get nodes命令验证节点的状态。在调度失败期间,pod将处于挂起状态,可以使用oc get pods -o wide命令进行检查,该命令还显示了计划在哪个节点上运行pod。使用oc get events和oc describe pod命令检查调度失败的详细信息。
示例1:如下所示pod调度失败,原因是CPU不足。
{default-scheduler } Warning FailedScheduling pod (FIXEDhello-phb4j) failed to
fit in any node
fit failure on node (hello-wx0s): Insufficient cpu
fit failure on node (hello-tgfm): Insufficient cpu
fit failure on node (hello-qwds): Insufficient cpu
示例2:如下所示pod调度失败,原因是节点没有处于就绪状态,可通过oc describe排查。
{default-scheduler } Warning FailedScheduling pod (hello-phb4j): no nodes
available to schedule pods
准备完整的OpenShift集群,参考《003.OpenShift网络》2.1。
[student@workstation ~]$ lab common-troubleshoot setup
[student@workstation ~]$ oc new-project common-troubleshoot
[student@workstation ~]$ oc new-app --name=hello -i php:5.4 \ #从源代码创建应用
> http://services.lab.example.com/php-helloworld
[student@workstation ~]$ oc describe is php -n openshift
结论:由上可知,仓库中不存在所需镜像。
[student@workstation ~]$ oc new-app --name=hello -i php:7.0 http://services.lab.example.com/php-helloworld
[student@workstation ~]$ oc get pod -o wide #再次查看发现一只出于pending
NAME READY STATUS RESTARTS AGE IP NODE
hello-1-build 0/1 Pending 0 40s <none> <none>
1 [student@workstation ~]$ oc log hello-1-build #查看log
2 W0720 20:22:16.455008 18942 cmd.go:358] log is DEPRECATED and will be removed in a future version. Use logs instead.
3 [student@workstation ~]$ oc get events #查看事件
4 LAST SEEN FIRST SEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE
5 56s 4m 15 hello-1-build.15b31cbd8da8ff1e Pod Warning FailedScheduling default-scheduler 0/3 nodes are available: 1 MatchNodeSelector, 2 NodeNotReady.
6 [student@workstation ~]$ oc describe pod hello-1-build #查看详情
7 ……
8 Warning FailedScheduling 31s (x22 over 5m) default-scheduler 0/3 nodes are available: 1 MatchNodeSelector, 2 NodeNotReady.
9 结论:由上可知,没有node可供调度此pod。
10 [root@master ~]# oc get nodes #在master节点进一步排查node情况
11 NAME STATUS ROLES AGE VERSION
12 master.lab.example.com Ready master 1d v1.9.1+a0ce1bc657
13 node1.lab.example.com NotReady compute 1d v1.9.1+a0ce1bc657
14 node2.lab.example.com NotReady compute 1d v1.9.1+a0ce1bc657
15 结论:由上可知,node状态异常,都未出于ready状态。
[root@node1 ~]# systemctl status atomic-openshift-node.service
[root@node2 ~]# systemctl status atomic-openshift-node.service
[root@node1 ~]# systemctl status docker
[root@node2 ~]# systemctl status docker
结论:由上可知,node节点的docker异常。
[root@node1 ~]# systemctl start docker
[root@node2 ~]# systemctl start docker
[root@master ~]# oc get nodes #再次查看node状态
NAME STATUS ROLES AGE VERSION
master.lab.example.com Ready master 1d v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 1d v1.9.1+a0ce1bc657
node2.lab.example.com Ready compute 1d v1.9.1+a0ce1bc657
[student@workstation ~]$ oc get pods #确认pod是否正常调度至node
NAME READY STATUS RESTARTS AGE
hello-1-build 1/1 Running 0 22m
[student@workstation ~]$ oc describe is #查看is详情
结论:由上可知,IS也将image推送至内部仓库。
准备完整的OpenShift集群,参考《003.OpenShift网络》2.1。
[student@workstation ~]$ lab execute-review setup
[student@workstation ~]$ cd /home/student/DO280/labs/execute-review/
[student@workstation execute-review]$ git clone http://services.lab.example.com/node-hello
[student@workstation execute-review]$ cd node-hello/
[student@workstation node-hello]$ docker build -t node-hello:latest .
[student@workstation node-hello]$ docker images #查看image
REPOSITORY TAG IMAGE ID CREATED SIZE
node-hello latest ff48daa00d8e 12 seconds ago 495 MB
registry.lab.example.com/rhscl/nodejs-6-rhel7 latest fba56b5381b7 22 months ago 489 MB
[student@workstation node-hello]$ docker tag ff48daa00d8e \
> registry.lab.example.com/node-hello:latest
[student@workstation node-hello]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node-hello latest ff48daa00d8e About a minute ago 495 MB
registry.lab.example.com/node-hello latest ff48daa00d8e About a minute ago 495 MB
registry.lab.example.com/rhscl/nodejs-6-rhel7 latest fba56b5381b7 22 months ago 489 MB
7.6 push image
[student@workstation node-hello]$ docker push registry.lab.example.com/node-hello:latest
[student@workstation ~]$ oc login -u developer -p redhat \
> https://master.lab.example.com
[student@workstation ~]$ oc projects
[student@workstation ~]$ oc project execute-review
[student@workstation ~]$ oc new-app registry.lab.example.com/node-hello --name hello
[student@workstation ~]$ oc get all #查看全部资源
[student@workstation ~]$ oc logs hello-1-2jkkj #查看日志
Error from server (BadRequest): container "hello" in pod "hello-1-2jkkj" is waiting to start: trying and failing to pull image
[student@workstation ~]$ oc describe pod hello-1-2jkkj #查看详情
[student@workstation ~]$ oc get events --sort-by='.metadata.creationTimestamp' #查看事件
结论:由上可知,为image pull失败。
[student@workstation ~]$ oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
hello-1-2jkkj 0/1 ImagePullBackOff 0 8m 10.128.0.45 node1.lab.example.com
hello-1-deploy 1/1 Running 0 8m 10.129.0.72 node2.lab.example.com
[root@node1 ~]# docker pull registry.lab.example.com/node-hello #手动拉去也失败
Using default tag: latest
Trying to pull repository registry.lab.example.com/node-hello ...
All endpoints blocked.
结论:由上可知,所有endpoint都被阻塞了。这种类型的错误通常发生在OpenShift中,原因是不正确的部署配置或无效docker配置。
[root@node1 ~]# vi /etc/sysconfig/docker
将BLOCK_REGISTRY='--block-registry registry.access.redhat.com --block-registry docker.io --block-registry registry.
lab.example.com'
修改为
BLOCK_REGISTRY='--block-registry registry.access.redhat.com --block-registry docker.io'
[root@node1 ~]# systemctl restart docker
提示:node2也需要如上操作。
[student@workstation ~]$ oc rollout latest hello
[student@workstation ~]$ oc get pods #确认
NAME READY STATUS RESTARTS AGE
hello-1-deploy 0/1 Error 0 22m
hello-2-75x9t 1/1 Running 0 47s
[student@workstation ~]$ oc logs hello-2-75x9t #查看log
nodejs server running on http://0.0.0.0:3000
[student@workstation ~]$ oc expose svc hello --hostname=hello.apps.lab.example.com
route "hello" exposed
[student@workstation ~]$ curl http://hello.apps.lab.example.com
Hi! I am running on host -> hello-2-75x9t
[student@workstation ~]$ lab execute-review grade #脚本验证试验