004.OpenShift命令及故障排查

木二發表於2020-06-20

一 CLI訪問OpenShift資源

1.1 資源操作

OCP將OpenShift叢集中的為由主節點管理的物件統稱為資源,如:node、service、pod、project、deployment、user。
即使針對的是不同的資源,OpenShift命令列工具也提供了一種統一的、一致的方法來更新、修改、刪除和查詢這些資源。
oc命令列工具提供了在軟體開發專案的整個交付生命週期中修改和管理資源的常見操作。

1.2 安裝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。

1.3 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表示以監視模式執行

1.4 oc 其他命令

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資源型別

2.1 常見資源

OpenShift容器平臺中的應用程式由不同型別的資源組成,主要常見的型別有:
  • Container:如何在可移植Linux環境中執行一個或多個程式的定義。容器從一個映像啟動,並且通常與同一機器上的其他容器隔離。
  • Image:一個分層的Linux檔案系統,包含應用程式程式碼、依賴關係和函式庫等。image由一個名稱標識,該名稱可以是當前叢集的本地名稱,也可以指向遠端Docker倉庫。
  • Pod:部署在節點上並共享唯一IP地址和卷(持久儲存)的一個或多個容器,Pods還為每個容器定義安全性和執行時策略。
  • Label:標籤是鍵值對,可以分配給系統中的任何資源進行分組和選擇。通常資源使用標籤來標識其他資源集。
  • Volume:預設情況下容器不是永續性的,即容器的內容在重新啟動時被清除。volume是掛載在pod及其容器上的檔案系統,它們可能由許多本地或網路的儲存提供。最簡單的卷型別是EmptyDir,它是一臺機器上的臨時目錄。
  • Node:node是叢集中用來執行容器的節點,node通常由管理員管理,而不是由終端使用者管理。
  • Service:service是表示一組pod的邏輯名稱,service被分配一個IP地址和一個DNS名稱,可以通過埠或route向叢集外部公開。名為SERVICE_HOST的環境變數會自動注入到其他pod中。
  • Route:route是一個DNS條目,建立它是為了指向一個service,以便可以從叢集外部訪問它。可以配置一個或多個路由器來處理這些route,通常通過HAProxy負載均衡器。
  • Replication Controller:Replication Controller基於匹配一組label的Templates維護特定數量的pod。如果刪除了pod,控制器將建立該pod的新副本。Replication Controller最常用來表示基於image的應用程式部分的單個部署。
  • Deployment Configuration:deployment configuration定義pod的模板,並在屬性更改時管理部署新映像或配置更改。單個deployment configuration通常類似於單個微服務。deployment configuration可以支援許多不同的部署模式,包括完全重啟、可定製的滾動更新以及生命週期前後的順序。每個deployment都表示為一個replication controller。
  • Build Configuration:build configuration包含如何將原始碼和基本image構建為新image的描述。Build可以是基於原始碼的,可以為常見語言(如Java、PHP、Ruby或Python)或基於docker的(從Dockerfile建立構建)使用構建器映像。每個build configuration都有webhook,可以通過對其基本映像的更改自動觸發。
  • Build:構建從原始碼、其他影像、Dockerfiles或二進位制輸入建立新image。Build在容器中執行,具有與普通pod相同的限制。Build通常會導致將image推入Docker倉庫中,但也可以選擇執行post-build測試而不push到image倉庫。
  • Image Streams and Image Stream Tags:IS使用標記名稱對相關is進行分組。它類似於原始碼倉庫中的分支。每個is可以有一個或多個標記(預設標記稱為“latest”),這些標記可能指向外部Docker倉庫、同一is中的其他標記,或者被控制為直接指向已知image。此外,可以通過整合的Docker倉庫直接將image push到docker倉庫。
  • Secret:secret資源可以儲存文字或二進位制secrets,以便注入至pod。預設情況下,在/var/run/secrets/kubernetes.io/serviceaccount上,每個容器都有一個secret,其中包含訪問API有限特權的令牌。可以建立新的secret並將它們掛載到自己的pod中,也可以引用構建中的secret(用於連線遠端伺服器),或者使用它們將遠端image匯入到is中。
  • Project:所有上述資源(node除外)都存在於專案中。專案具有成員列表及其role(如view、edit或admin),以及執行的pod上的一組安全控制,並限制專案可以使用多少資源,資源名稱在專案中是惟一的。
使用oc types命令快速檢視可用的概念和型別。

2.2 建立應用

簡單的應用程式、複雜的多層應用程式和微服務應用程式都可以使用資源定義檔案來描述。
這個檔案包含許多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從外部訪問。
resources created by the oc new-app command_v1
提示:通過使用帶有原始碼的oc new-app,將建立一個build configuration,而bc又從原始碼建立一個新的應用程式。但是,如果命令中沒有使用原始碼,則不會建立gc。該命令始終為應用程式建立dc和svc。

三 oc使用練習

3.1 前置準備

準備完整的OpenShift叢集,參考《003.OpenShift網路》2.1。

3.2 本練習準備

[student@workstation ~]$ lab manage-oc setup

3.3 驗證OpenShift

  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詳情

3.4 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 /

3.5 oc其他操作

[student@workstation ~]$ oc status -v #現實詳細的狀態
clipboard
[student@workstation ~]$ oc get events #檢視叢集生命週期事件
[student@workstation ~]$ oc get all #獲取所有資源資訊

3.6 匯出資源

[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 #檢視幫助

四 oc常見故障排除

4.1 常見環境資訊

使用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命令,獲取幫助。

4.2 常見診斷命令

oc客戶端命令是用來檢測和排除OpenShift叢集中的問題的主要工具。它有許多選項,能夠檢測、診斷和修復由叢集管理的主機和節點、服務和資源的問題。若已授權所需的許可權,可以直接編輯叢集中大多數託管資源的配置。
  • oc get events
事件允許OpenShift記錄叢集中生命週期事件的資訊,以統一的方式檢視關於OpenShift元件的資訊。oc get events命令提供OpenShift namespace的事件資訊,可實現以下事件的捕獲:
    • Pod建立和刪除
    • pod排程的節點
    • master和node節點的狀態
事件通常用於故障排除,從而獲得關於叢集中的故障和問題的高階資訊,然後使用日誌檔案和其他oc子命令進一步定位。
示例:使用以下命令獲得特定專案中的事件列表。
[student@workstation ~]$ oc get events -n <project>
也可以通過Web控制檯進行事件的檢視events。
  • oc log
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
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
使用oc port-forward命令將一個或多個本地埠轉發到pod。這允許在本地監聽特定或隨機埠,並將資料轉發到pod中的特定埠。
示例1:本地監聽3306並轉發到pod的3306.
[student@workstation ~]$ oc port-forward <pod> 3306:3306

五 TS常見故障

5.1 資源限制和配額問題

對於設定了資源限制和配額的專案,不適當的資源配置將導致部署失敗。使用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

5.2 S2I build失敗

使用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 }

5.3 ErrImagePull和imgpullback錯誤

通常是由不正確的deployment configuration造成、部署期間引用的錯誤或缺少image或Docker配置不當造成。
使用oc get events和oc describe命令排查,通過使用oc edit dc/<deploymentconfig>編輯deployment configuration來修復錯誤。

5.4 docker配置異常

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'

5.5 master和node節點失敗

執行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容器平臺有五個級別的日誌詳細程度,無論日誌配置如何,日誌中都會出現帶有致命、錯誤、警告和某些資訊嚴重程度的訊息。
  • 0:只有錯誤和警告
  • 2:正常資訊(預設)
  • 4:debug級資訊
  • 6:api級debug資訊(請求/響應)
  • 8:帶有完整請求體的API debug資訊

5.6 排程pod失敗

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

六 常見問題排查

6.1 前置準備

準備完整的OpenShift叢集,參考《003.OpenShift網路》2.1。

6.2 本練習準備

[student@workstation ~]$ lab common-troubleshoot setup

6.3 建立應用

[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
clipboard

6.4 檢視詳情

[student@workstation ~]$ oc describe is php -n openshift
clipboard
clipboard
結論:由上可知,倉庫中不存在所需映象。

6.5 修正錯誤

[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>

6.6 檢視詳情

  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狀態。

6.7 檢查服務

[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
clipboard
結論:由上可知,node節點的docker異常。

6.8 啟動服務

[root@node1 ~]# systemctl start docker
[root@node2 ~]# systemctl start docker

6.9 確認驗證

[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詳情
clipboard
結論:由上可知,IS也將image推送至內部倉庫。

七 oc命令綜合實驗

7.1 前置準備

準備完整的OpenShift叢集,參考《003.OpenShift網路》2.1。

7.2 本練習準備

[student@workstation ~]$ lab execute-review setup

7.3 git專案至本地

[student@workstation ~]$ cd /home/student/DO280/labs/execute-review/
[student@workstation execute-review]$ git clone http://services.lab.example.com/node-hello

7.4 docker構建image

[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

7.5 修改docker tag

[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

7.7 建立project

[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 #檢視全部資源
clipboard

7.8 排查ImagePullBackOff

[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失敗。

7.9 手動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配置。

7.10 修正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也需要如上操作。

7.11 更新pod

[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

7.12 確認驗證

[student@workstation ~]$ oc logs hello-2-75x9t #檢視log
nodejs server running on http://0.0.0.0:3000

7.13 暴露服務

[student@workstation ~]$ oc expose svc hello --hostname=hello.apps.lab.example.com
route "hello" exposed

7.14 測試服務

[student@workstation ~]$ curl http://hello.apps.lab.example.com
Hi! I am running on host -> hello-2-75x9t
[student@workstation ~]$ lab execute-review grade #指令碼驗證試驗

相關文章