#目的
IBM Cloud Sattelite環境を作成後その上でROKS(Openshift on IBM Cloud)を作成、サンプルアプリケーションの稼働確認までを確認してみます。
#事前準備
PrivateNetowrkのみに接続したサーバーにSatellite環境をセットアップします。最低4vCPU,16GBメモリ,100GBディスクのRHEL7サーバーが6台必要になります。
詳細な前提条件は下記に記載あります。
ホスト要件
Firewall設定
Satelliteのセットアップに入る前に、サーバーで少なくても外部ネットワークでの名前解決ができる、必要なサイトにアクセスできる等の確認はしておいた方がいいでしょう
ping 8.8.8.8
nslookup google.com
nslookup google.com 8.8.8.8
curl https://google.com
curl https://containers.cloud.ibm.com/v1/healthz
curl https://us.icr.io
*PublicNetwork接続されたサーバーでも以下の操作でセットアップできます。
#Satelliteのセットアップ
IBM Cloudカタログ
IBM Cloud カタログからSatelliteで検索し、IBM Cloud Satelliteを選択します。
手動セットアップを選択、Satelliteロケーションの名前を入力します。ここではsatellite-location-xyz-1と入力します。入力BOXが出てこない時はSatellite ロケーションの右にある編集(鉛筆マーク)ボタンを押せばBOXが開きます。
下にスクロールして、管理元(ControlePoint)にインスタンスを生成するregionを選択します。ここではワシントンDCを選択して、ゾーンは、デフォルトのままzone-1,zone-2,zone-3として右下のロケーションの作成ボタンを押します
新規ロケーションのセットアップ画面が現れ、ロケーションのセットアップが開始されます。次へのボタンを押してください。
スクリプトの生成画面が現れます、そのままスクリプトのダウンロードボタンを押します。
ポップアップ画面が現れるのでファイルを保存ボタンを押してください。スクリプトがattachHost-ロケーション名.shの名前で自身のPCにダウンロードされます。ダウンロードが完了したら、右下の次へボタンを押してください
いったんIBM Cloud Portal画面を離れ、セットアップ対象のサーバー側の作業を実施します。まず先ほど自PCに保存したScriptファイルをサーバーへuploadします
% scp attachHost-satellite-xyz-1.sh root@10.xxx.xxx.xxx:/tmp/attachHost-satellite-xyz-1.sh
root@10.xxx.xxx.xxx's password:
attachHost-satellite-xyz-1.sh 100% 10KB 203.4KB/s 00:00
サーバーにLogin後、RedHat Subscrptionの更新を行います。
[root@poc21 ~]# subscription-manager refresh
ローカルデータがすべて更新されました
[root@poc21 ~]# subscription-manager repos --enable=*
リポジトリー 'rhel-ha-for-rhel-7-server-eus-rpms' は、このシステムに対して有効になりました。
リポジトリー 'rhel-server-rhscl-7-rpms' は、このシステムに対して有効になりました。
リポジトリー 'rhel-7-server-optional-rpms' は、このシステムに対して有効になりました。
中途省略
リポジトリー 'rhel-7-server-extras-rpms' は、このシステムに対して有効になりました。
リポジトリー 'rhel-7-server-eus-supplementary-rpms' は、このシステムに対して有効になりました。
先ほどアップロードしたスクリプトを実行します、進行状況をモニターするコマンドを実行して、サーバー側のセットアップが開始されたことが確認できたら、CTL+Cで抜けます。
[root@poc21 ~]# nohup bash /tmp/attachHost-satellite-xyz-1.sh &
[1] 2913
[root@poc21 ~]# nohup: 入力を無視し、出力を `nohup.out' に追記します
[1]+ 終了 nohup bash /tmp/attachHost-satellite-xyz-1.sh
[root@poc21 ~]# journalctl -f -u ibm-host-attach
-- Logs begin at Mon 2021-08-23 04:08:46 CDT. --
Aug 23 04:49:20 poc21.ibm.cloud ibm-host-attach.sh[2723]: Failed to execute operation: No such file or directory
Aug 23 04:49:20 poc21.ibm.cloud ibm-host-attach.sh[2723]: + systemctl mask iptables.service
Aug 23 04:49:20 poc21.ibm.cloud ibm-host-attach.sh[2723]: Created symlink from /etc/systemd/system/iptables.service to /dev/null.
以降省略
上記操作(Scriptアップロード~Subscription更新~Script実行)をセットアップ対象のサーバー分繰り返します。Script再実行についてはScriptを解読すればわかりますが、flag用Directory:/etc/satelliteflagsを削除すればScriptは再実行できます
ここからはIBM Cloud Portal画面に戻ります。
ホストの割り当てボタンの横にあるオンラインの未割り当てホストの数が、上記サーバーでのスクリプト実行が終了するごとに1ずつ増え、3になったらホストへの割り当てが開始できます。3になったら開始ボタンを押してください。ここでいくら待っても1から増えない場合は、サーバーで外部ネットワークへの名前解決ができているかなど疑った方がいいでしょう。
コントロールプレーンへのホストの割り当て画面が現れるので対象サーバーをチェツクして、次ヘのボタンを押してください
ゾーンの割り当て画面になりますのでzone-1、zone-2、zone-3と指定してください、ホストの割り当てボタンを押してください。
コントロールプレーンのセットアップ画面に戻り、割り当てが開始されたことがわかります、
30分程度で割り当てが完了します、次へのボタンを押して下さい
いくら待っても割り当てが完了しない、あるいはエラーが発生した場合は下記を参照ください
https://cloud.ibm.com/docs/satellite?topic=satellite-ts-hosts-login
https://cloud.ibm.com/docs/satellite?topic=satellite-assign-fails
ロケーションのファイナライズ画面が現れます、サーバーの割り当てが完了してから以降はサーバーへのsshログインはできなくなります。左のメニューからホストを選択します。
サーバーの状況が正常で割り当て済み,クラスターがコントロールプレーンであることが確認できます。
#ROKSのセットアップ
まずSatelliteロケーションの左メニューのホストを選ぶと出てくるSatelliteホスト一覧画面で未割り当てのサーバーが最低3つあることを確認ください。
ROKSのオーダーを開始します。カタログからOpenShiftで検索、クリック
ROKSのオーダー画面が現れます、Satelliteを選択、下にスクロール
Satelliteロケーションの一覧がでてくるので先ほど作成したロケーション(ここではsatellite-xyz-1)を選択、ワーカープールのSatelliteゾーンではzone-1,zone-2,zone-3をチェックして下にスクロール
Satellite Configでは上の"クラスター管理者の Satellite Config のアクセス権限を有効にしてください。"をチェツクして、クラスター名には、ここではmycluster-satellite--xyz1を入力、右下の作成ボタンを押してください。
Openshiftのクラスター画面が現れ、クラスターの作成が開始されたことがわかります。
クラスターの作成が完了すると下記画面になります。ノードの状況が通常であることを確認して、右上のOpenShift webコンソールのボタンを押してください
Webコンソールの画面が現れROKSクラスターにアクセスできました、右上のユーザーIDをクリックして、Copy Login Commnadを選ぶと別画面でDisplay Tokenと表示され、そのままクリックするとAPI Token付きのoc loginコマンドが表示されます。
oc loginコマンドを実行するとクラスターへログインできます。
% oc login --token=sha256~DFHLxmDdPSmuZeVVOIIAdRffwKNZMIRHTiXMa-uPmOk --server=https://sa3660e07e6bb157cdfca-6b64a6ccc9c596bf59a86625d8fa2202-ce00.us-east.satellite.appdomain.cloud:30794
Logged into "https://sa3660e07e6bb157cdfca-6b64a6ccc9c596bf59a86625d8fa2202-ce00.us-east.satellite.appdomain.cloud:30794" as "IAM#nsakata@jp.ibm.com" using the token provided.
You have access to 65 projects, the list has been suppressed. You can list all projects with ' projects'
Using project "test10".
Satelliteロケーションの左メニューからホストを選び、Satelliteのホスト一覧画面からも該当のホストに先ほど指定したクラスター名(mycluster-satellite--xyz1)で割り当てられていることが確認できます。
#サンプルアプリケーションの稼働確認。
サンプルアプリケーションのBuild,Deploy,接続確認を行います
##1.Registry設定(内部Storage)
新規にProjectを作成してRuby on Railsを導入してみます。Registryが見つからないのエラーがでます。
% oc new-project test10
% oc new-app rails-postgresql-example
% oc logs -f buildconfig/rails-postgresql-example
中途略
error: build error: After retrying 2 times, Pull image still failed due to error: while pulling "docker://image-registry.openshift-image-registry.svc:5000/openshift/ruby@sha256:5e828cb537399a3d7c4950ced8fbf2e084d89ab7c6fcff995598b44e8d394450" as "image-registry.openshift-image-registry.svc:5000/openshift/ruby@sha256:5e828cb537399a3d7c4950ced8fbf2e084d89ab7c6fcff995598b44e8d394450": Error initializing source docker://image-registry.openshift-image-registry.svc:5000/openshift/ruby@sha256:5e828cb537399a3d7c4950ced8fbf2e084d89ab7c6fcff995598b44e8d394450: error pinging docker registry image-registry.openshift-image-registry.svc:5000: Get "https://image-registry.openshift-image-registry.svc:5000/v2/": dial tcp: lookup image-registry.openshift-image-registry.svc on 172.21.0.10:53: no such host
そこでRegistryを内部storageのEmptyDirに登録します。
[ワーカー・ノードの空のディレクトリーへのイメージの保管]
(https://cloud.ibm.com/docs/openshift?topic=openshift-registry#emptydir_internal_registry)
% oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'
config.imageregistry.operator.openshift.io/cluster patched
% oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'
config.imageregistry.operator.openshift.io/cluster patched
NameRegistry(image-registry-785cd79745-g7hvn)が起動されたことを確認します。
% oc get pods -n openshift-image-registry
NAME READY STATUS RESTARTS AGE
cluster-image-registry-operator-547bd97747-nnkns 1/1 Running 0 47h
image-pruner-1628985600-hxt9n 0/1 Completed 0 26h
image-pruner-1629072000-8q7nv 0/1 Completed 0 145m
image-registry-5598549b9f-bhlq4 0/1 Terminating 0 20s
image-registry-785cd79745-g7hvn 1/1 Running 0 20s
node-ca-fn7rd 1/1 Running 0 46h
node-ca-gtjqq 1/1 Running 0 46h
node-ca-lhpv5 1/1 Running 0 46h
導入を再実行します。(先ほどのtest10の削除/再作成してから)今度はImageのRegistryへのPushが成功しました。
% oc new-app rails-postgresql-example
% oc logs -f buildconfig/rails-postgresql-example
Cloning "https://github.com/sclorg/rails-ex.git" ...
Commit: 57f02090043d0285de7e22261e9c407406c01ccf (Fix nokogiri dependencies)
Author: Yaakov Selkowitz <yselkowi@redhat.com>
Date: Tue Apr 20 16:10:47 2021 -0400
Caching blobs under "/var/cache/blobs".
Getting image source signatures
中途略
Writing manifest to image destination
Storing signatures
Successfully pushed image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0
Push successful
ROUTEを作成してアクセスできることまで確認します。
% oc get pods -n test10
NAME READY STATUS RESTARTS AGE
postgresql-1-deploy 0/1 Completed 0 4m7s
postgresql-1-zj6rc 1/1 Running 0 4m5s
rails-postgresql-example-1-build 0/1 Completed 0 4m7s
rails-postgresql-example-1-cbsrk 1/1 Running 0 118s
rails-postgresql-example-1-deploy 0/1 Completed 0 2m11s
rails-postgresql-example-1-hook-pre 0/1 Completed 0 2m8s
% oc get route -n test10
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
rails-postgresql-example rails-postgresql-example-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud rails-postgresql-example <all> None
% curl https://rails-postgresql-example-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
中途略
現時点では内部RegistryがEmptyDirなので、このままではNode再起動/障害には対応できていません。
##2.Registry設定(ICOS)
次にObject StorageをRegistryとして設定します。
カタログからObject Storageを検索して選択、Standardを選択してください。
スクロールしてサービス名を入力して、右下の作成ボタンを押してください。
左のメニューからサービス資格情報を選択し、新規資格情報のボタンを押してください
資格情報の作成画面が現れます、名前の入力、HMAC資格情報を含めるをOnにします、追加ボタンを押します。
作成されたaccess_key_idとsecret_access_keyをメモします。
左のメニューからエンドポイントを選択し、ここではReginal, jp-tokを選択してjp-tokのPublicのURLをのちに利用するためにメモします。
RegistryにSecretの登録を行います。先ほどメモしたサービス資格情報のアクセスキーとシークレットキーを利用します。Secret名は固定値でimage-registry-private-configuration-userにする必要があります。
% oc create secret generic image-registry-private-configuration-user \
--from-literal=REGISTRY_STORAGE_S3_ACCESSKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
> --from-literal=REGISTRY_STORAGE_S3_SECRETKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
> -n openshift-image-registry
secret/image-registry-private-configuration-user created
Registryコンフィグを修正し、spec.storageのemptyDir: {}の行は削除して,
代わりにs3の設定を追加します、regionにはバケットを作成するリージョンをクラス付きでここではjp-tok-standard,regionEndpointは先ほどメモしたバケットを作成するリージョンのパブリックエンドポイントです。
% oc edit configs.imageregistry.operator.openshift.io/cluster -n openshift-image-registry
spec:
storage:
s3:
region: jp-tok-standard
regionEndpoint: s3.jp-tok.cloud-object-storage.appdomain.cloud
コンフィグを確認すると、bucketキーの値が自動的に追加されています。
$oc get configs.imageregistry.operator.openshift.io/cluster -o yaml
s3:
bucket: kubernetes-image-registry-jp-tok-standard-btwxmjfhukeiuohlijug
region: jp-tok-standard
regionEndpoint: s3.jp-tok.cloud-object-storage.appdomain.cloud
virtualHostedStyle: false
確認のためここではNodeJSを導入してみます。Build/Deploy/Routeの作成まで行い、正常にアクセスできることまで確認します。
% oc new-app openshift/nodejs~https://github.com/sclorg/nodejs-ex.git -n test10
% oc expose service/nodejs-ex
route.route.openshift.io/nodejs-ex exposed
% oc get route -n test10
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
nodejs-ex nodejs-ex-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud nodejs-ex 8080-tcp None
rails-postgresql-example rails-postgresql-example-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud rails-postgresql-example <all> None
% curl https://nodejs-ex-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
以後省略
ICOSの画面でも自動的に作成されたバケットにイメージが保管されてることを確認します。
##3.最終確認(ノード障害テスト)
全てのテスト用アプリケーションは10.193.37.146のNode稼働しており、このノードを意図的にダウン(電源OFF)させます。
% oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nodejs-ex-1-build 0/1 Completed 0 5m24s 172.30.187.218 10.193.37.146 <none> <none>
nodejs-ex-7ffdf556bf-6ntsl 1/1 Running 0 3m53s 172.30.187.219 10.193.37.146 <none> <none>
rails-postgresql-example-1-build 0/1 Completed 0 98m 172.30.187.212 10.193.37.146 <none> <none>
rails-postgresql-example-1-cbsrk 1/1 Running 0 96m 172.30.187.217 10.193.37.146 <none> <none>
rails-postgresql-example-1-deploy 0/1 Completed 0 96m 172.30.187.215 10.193.37.146 <none> <none>
rails-postgresql-example-1-hook-pre 0/1 Completed 0 96m 172.30.187.216 10.193.37.146 <none> <none>
10.193.37.146がNotReadyになったことからNodeダウンを確認します。
% oc get nodes
NAME STATUS ROLES AGE VERSION
10.193.37.146 NotReady master,worker 2d2h v1.19.0+4c3480d
10.193.37.168 Ready master,worker 2d2h v1.19.0+4c3480d
10.193.37.186 Ready master,worker 2d2h v1.19.0+4c3480d
またIBM Cloud Portal画面からもNODEダウンを確認できます。
Podの状況を確認していきます、StatusがTerminatingから他のノードへ切替後ContainerCreatingが開始されたことがわかります。
% oc get pods
NAME READY STATUS RESTARTS AGE
nodejs-ex-7ffdf556bf-697vz 0/1 ContainerCreating 0 20s
nodejs-ex-7ffdf556bf-6ntsl 1/1 Terminating 0 110m
rails-postgresql-example-1-cbsrk 1/1 Terminating 0 3h23m
rails-postgresql-example-1-m5tv9 0/1 ContainerCreating 0 20s
10.193.37.168のNodeへの切替を確認できます。
% oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nodejs-ex-7ffdf556bf-697vz 1/1 Running 0 34m 172.30.74.100 10.193.37.168 <none> <none>
nodejs-ex-7ffdf556bf-6ntsl 1/1 Terminating 0 144m 172.30.187.219 10.193.37.146 <none> <none>
rails-postgresql-example-1-cbsrk 1/1 Terminating 0 3h56m 172.30.187.217 10.193.37.146 <none> <none>
rails-postgresql-example-1-m5tv9 0/1 ImagePullBackOff 0 34m 172.30.74.104 10.193.37.168 <none> <none>
PODの状況がRunningとErrImagePullのものがあります。
% oc get pods
NAME READY STATUS RESTARTS AGE
nodejs-ex-7ffdf556bf-697vz 1/1 Running 0 71s
nodejs-ex-7ffdf556bf-6ntsl 1/1 Terminating 0 111m
rails-postgresql-example-1-cbsrk 1/1 Terminating 0 3h23m
rails-postgresql-example-1-m5tv9 0/1 ErrImagePull 0 71s
ErrImagePullの原因を確認します。RegistryにImageが見つからない。これはRegistryをICOSへ設定する前、内部のEmptydirにある時に導入したアプリケーションでした。ImageをICOSに保存したPODのみノード障害時の切替が成功したことがわかります。
% oc describe pod/rails-postgresql-example-1-m5tv9
Name: rails-postgresql-example-1-m5tv9
Namespace: test10
Priority: 0
Node: 10.193.37.168/10.193.37.168
Start Time: Mon, 16 Aug 2021 15:10:40 +0900
Labels: deployment=rails-postgresql-example-1
deploymentconfig=rails-postgresql-example
name=rails-postgresql-example
中途略
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 6m18s default-scheduler Successfully assigned test10/rails-postgresql-example-1-m5tv9 to 10.193.37.168
Normal AddedInterface 6m16s multus Add eth0 [172.30.74.104/32]
Normal Pulling 3m48s (x4 over 6m16s) kubelet Pulling image "image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0"
Warning Failed 3m48s (x4 over 5m20s) kubelet Failed to pull image "image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0": rpc error: code = Unknown desc = Error reading manifest sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0 in image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example: manifest unknown: manifest unknown
Warning Failed 3m48s (x4 over 5m20s) kubelet Error: ErrImagePull
Normal BackOff 3m19s (x7 over 5m19s) kubelet Back-off pulling image "image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0"
Warning Failed 68s (x16 over 5m19s) kubelet Error: ImagePullBackOff
10.193.37.146を電源ONに戻します、下記で確認できます。
% oc get node
NAME STATUS ROLES AGE VERSION
10.193.37.146 Ready master,worker 2d4h v1.19.0+4c3480d
10.193.37.168 Ready master,worker 2d4h v1.19.0+4c3480d
10.193.37.186 Ready master,worker 2d4h v1.19.0+4c3480d
NodeのDown時は情報が取得できなかったためTerminatingだったPODがきれいに消えました。rails-postgresql-example-1-m5tv9のPODはNODEが再起動されてもIMAGEは依然取得できないのでImagePullBackOffのままです。またnodejs-ex-7ffdf556bf-697vzのPODが元のNode10.193.37.146が復活したからといって切り戻されることはありません。
% oc get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nodejs-ex-7ffdf556bf-697vz 1/1 Running 0 147m 172.30.74.100 10.193.37.168 <none> <none>
rails-postgresql-example-1-m5tv9 0/1 ImagePullBackOff 0 147m 172.30.74.104 10.193.37.168 <none> <none>