「OpenShift」カテゴリーアーカイブ

OpenShift Service Meshをインストールする方法

  • OpenShift Service Meshとは
  • OpenShift Service Meshのコンポーネント
  • OpenShift Service Meshをインストールする

OpenShift Service Meshとは


OpenShift ServiceMeshとは、OpenShift上で稼働するマイクロアプリケーションのMesh層を接続・管理・監視するためのOpenShiftサービスです。Istioとの違いなど、OpenShift Service Meshを使うメリットは以下のURLで紹介されています。

OpenShift Service Meshを選ぶ理由

OpenShift Service Meshのコンポーネント


OpenShift Service Meshのコンポーネントは以下の通りです。必ずしも全てインストールする必要はなく、オプションで設定できます。

  • Istio・・・全体のトラフィックの管理
  • Kiali・・・トラフィックの可視化
  • Grafana・・・メトリクスの可視化
  • Jeager・・・分散トレースログの管理
  • Elasticsearch・・・分散トレースログの保管先(※Jeagerを利用する場合に、all-in-oneのインメモリ構成かElasticsearchを選択できます。)

特に注意すべき点はElasticsearchで、それなりに大きいリソースを必要としますし、永続ボリューム用のストレージが必要になります。企業では通常予算を決めてから構築しますので、予算からずれる可能性があります。

Elasticsearchの要件は、こちらをご参照ください。

OpenShift Service Meshをインストールする


GUIのOperator HubからIstioだけインストールします。

1.「OperatorHub」タブから「ServiceMesh」を検索する

2.「Install」ボタンをクリックする

3. オプションを選択する

  • Installation Mode・・・プロジェクトが利用可能な範囲を選択します。
  • Update Channel・・・インストールする対象バージョンを選択します。GA済みの安定したバージョンかTech Previewのバージョンかどうか選択することができます。
  • Approval Strategy・・・Operatorのアップデートを自動か手動で選択できます。

4. 「Installed Operators」タブからServiceMeshのStatusが「Succeeded」であることを確認し、「Istio Service Mesh Controll Plane」をクリックする

インストールが完了するとOperator Podが作成されています。

$ oc get pods -n openshift-operators
NAME READY STATUS RESTARTS AGE
istio-operator-745ffbbcbb-wrhgq 1/1 Running 0 4m36s

5. 「Create ServiceMeshControllPlane」をクリックする

6. `spec.kiali.enabled`、`spec.grafana.enabled`、`spec.tracing.enabled`をtrue→falseに変更する

7. `metadata.namespace`を作成したproject名に変更し、「Create」ボタンをクリックする

以下のコマンドでOpenShift Service Meshをデプロイするプロジェクトを作成します。

$ oc new-project istio-system

作成したプロジェクトをmetadata.namespaceに指定します。

これでインストールが完了しました。IstioのPodがデプロイされていることがわかります。

$ oc get pods -n istio-system
NAME                                     READY     STATUS    RESTARTS   AGE
istio-citadel-5b66678f8-g847h            1/1       Running   0          2m8s
istio-egressgateway-58b5ccd6b7-7flg8     1/1       Running   0          50s
istio-galley-7dddcfffd8-5ssnn            1/1       Running   0          102s
istio-ingressgateway-6b6d8d747-8cdxs     1/1       Running   0          50s
istio-pilot-c77d8b5dd-nlh4f              2/2       Running   0          64s
istio-policy-57845f5d-shhsm              2/2       Running   0          88s
istio-sidecar-injector-64c496848-dh75r   1/1       Running   0          45s
istio-telemetry-656d4d654f-m2cpq         2/2       Running   0          88s
prometheus-5467bd8998-lph9v              2/2       Running   0          119s

以上です。

MacOSにS2IコマンドをインストールしてS2Iビルドする

  • S2Iとは
  • S2Iコマンドのインストール
  • S2Iビルダーイメージのビルド
  • アプリケーションイメージのS2Iビルド

S2Iとは


S2Iとは、Source To Imageの略で、OpenShiftの特徴的な機能の一つです。その名の通り、ソースコードをコンテナイメージに変換します。S2Iビルダーイメージとソースコードからアプリケーションイメージをビルドすることによって、ビルドを自動化するだけでなく、イメージとソースコードの保守を分離することができます。

この機能における具体的なメリットは、以下の公式ドキュメントをご参照ください。
https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.4/html/builds/understanding-image-builds#build-strategy-s2i_understanding-image-builds

本記事は、S2Iツールをローカルマシン(Mac)にインストールしてローカル上で使ってみます。

S2Iコマンドのインストール


S2IコマンドをインストールしてMac PC上で操作します。

S2Iツールのパッケージは以下のURLからダウンロードできますが、Macではbrewコマンドでインストールができます。
https://github.com/openshift/source-to-image/releases/tag/v1.3.0

以下のコマンドでインストールします。

$ brew install source-to-image
$ s2i version
s2i v1.3.0-dirty

S2Iビルダーイメージのビルド


S2Iコマンドを使ってS2Iビルダーイメージをビルドしてみます。

以下のコマンドで例のようにS2Iビルダーイメージの雛形を作成することができます。指定したdirectory配下には、必要なファイルが作成されます。それぞれのファイルの解説はまた今度記事を書きたいと思いますが、自身で作成したいイメージに合わせてファイルを編集する必要があります。

$ s2i create [image名] [directory名]
例)
$ s2i create python:3.6 test-python
$ tree test-python/
test-python/
├── Dockerfile
├── Makefile
├── README.md
├── s2i
│   └── bin 
│       ├── assemble
│       ├── run
│       ├── save-artifacts
│       └── usage
└── test ←テストソースコードなので、S2Iビルダーイメージのビルドには不要です。
    ├── run
    └── test-app
        └── index.html
$ docker build -t python-s2i-builder test-python/ 
$ docker images python-s2i-builder REPOSITORY TAG IMAGE ID CREATED SIZE
python-s2i-builder latest 490710255550 3 minutes ago 426MB

今回は自分でS2Iビルダーイメージを作成するのではなく、以下のコマンドでregistry.redhat.ioのイメージを利用してアプリケーションイメージをS2Iビルドします(Red Hatのアカウントが必要になります。)。このように、OpenShiftではS2Iビルダーイメージをサポートしてくれるのが魅力の一つでもあります。

$ docker login registry.redhat.io
Username: 
Password: 
Login Succeeded
$ docker pull registry.redhat.io/rhel8/python-36
Using default tag: latest
latest: Pulling from rhel8/python-36
1a6747857d79: Pull complete 
fc5aa93e3b58: Pull complete 
dd09aac02f79: Pull complete 
8542dbe7d6e8: Pull complete 
ad98eb9d602e: Pull complete 
Digest: sha256:74057ed15aba3ba78ddf061a964b60a4e5c1d0eb8c989ad6831ea086721d9acf
Status: Downloaded newer image for registry.redhat.io/rhel8/python-36:latest
$ docker images registry.redhat.io/rhel8/python-36:latest
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
registry.redhat.io/rhel8/python-36   latest              77c14d37c369        4 weeks ago         781MB
$ docker tag registry.redhat.io/rhel8/python-36:latest python-s2i-builder
$ docker images python-s2i-builder
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
python-s2i-builder   latest              77c14d37c369        4 weeks ago         781MB

アプリケーションイメージのS2Iビルド


上記で作成したS2Iビルダーイメージを使って、アプリケーションイメージをビルドします。

以下のコマンドでアプリケーションイメージをビルドすることができます。

$ s2i build [ソースコード] [S2Iビルダーイメージ名] [アプリケーションイメージ名]

registry.redhat.ioからpullしたS2IビルダーイメージとGit上のサンプルPythonソースコードを使って、python-s2iアプリケーションイメージをビルドします。

$ s2i build https://github.com/sclorg/s2i-python-container.git --context-dir=3.6/test/setup-test-app/ python-s2i-builder python-s2i
$ docker images python-s2i
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python-s2i          latest              b07c7f096566        15 seconds ago      789MB

アプリケーションイメージが実行できることを確認できました。

$ docker run --name hello -d -p 8080:8080 python-s2i
ae57680ef2705b92a51727bc0e6d67ce14fca3d6a515abdffc48c9f4f6913bf4
$ curl localhost:8080
Hello from gunicorn WSGI application!

以上です!

OpenShiftのImageStreamを登録する方法

久しぶりに「コピーしておくと便利なコマンド」を書きます。今日はOpenShiftのImageStreamで外部レジストリを登録する方法をご紹介します。

ImageStreamについては、以下の公式ドキュメントをご参照ください。

https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.4/html/images/managing-image-streams

1. 外部レジストリにログインする


認証ファイルを生成するため、docker loginコマンドを使って対象の外部レジストリに一度ログインします。

$ docker login [外部レジストリURL]
→ユーザー名とパスワードを入力する

2. Secretを作成する


pullするときに、外部レジストリにアクセスするための認証情報をSecretで作成します。

$ oc create secret generic [Secret名] --from-file .dockerconfigjson=[認証情報のjsonファイルパス] --type kubernetes.io/dockerconfigjson

「認証情報のjsonファイルパス」は、OS毎に異なります。MacOSの場合は、~/.docker/config.jsonです。

3. SecretをServiceAccountにリンクする


手順2で作成したSecretがImageStreamに紐づいていないと、pullすることができないので、ServiceAccountにリンクします。

$ oc secrets link default [手順2で作成したSecret名]

S2Iビルダーイメージを利用する場合は、builderのServiceAccountにリンクします。

$ oc secrets link builder [手順2で作成したSecret名]

4. ImageStreamを登録する


以下のコマンドでImageStreamを登録します。

$ oc import-image [ImageStream名] --from [外部レジストリのURL] --confirm

 

以上です。

コピーしておくと便利なコマンド OpenShift編 Podにファイルを転送する

コピーしておくと便利なコマンド第三弾です。今回はOpenShift編ということで、Podにファイルを転送するコマンドをご紹介したいと思います。

ちょっとした時に、ローカルにあるファイルをコンテナに転送したいと思うことよくありませんか?例えば問題判別の時に定義ファイルを置き換えたいとき。永続ボリューム領域のファイルを書き換えようにも権限がなかったとき。再ビルドしようにも権限を付けてもらうにしても、結構面倒くさいです。

そんなときはコンテナにファイルを転送するコマンドを使って、ファイルを転送するのがオススメです。

Podの確認
$ oc get pods php-apache-1-zxxqd
NAME                 READY     STATUS    RESTARTS   AGE
php-apache-1-zxxqd   1/1       Running   1          11d

Pod内のファイル確認
$ oc exec -it  php-apache-1-zxxqd -- cat /test
cat: /test: No such file or directory
command terminated with exit code 1

ファイル作成
$ echo "Hello World" > test

ファイルの転送
$ oc cp test php-apache-1-zxxqd:/test

Pod内のファイル確認
$ oc exec -it  php-apache-1-zxxqd -- cat /test
Hello World
$

 

本来コンテナはImmutableな性質なので、このような操作はよくありませんが、ちょっとした問題判別や検証に使えるコマンドとして紹介しました。

以上です!皆さんも是非使ってみてください!

OpenShift上のコンテナにroot権限でコマンドを実行する方法

OpenShift上のコンテナに対して、root権限でコマンドを実行する方法について紹介します。

  • コンテナに対してコマンドを実行する方法
  • root権限でコマンド実行する方法
  • root権限でコマンド実行するユースケース

コンテナに対してコマンドを実行する方法


OpenShiftでコンテナに対してコマンドを実行する方法を紹介します。

コンテナに対してコマンドを実行するために、以下のコマンドを利用することがあります。podに接続してインタラクティブにコマンドを実行したり、ワンライナーのコマンドをコンテナで実行することができます。ただし、コンテナ実行ユーザーでの操作になりますので、実行ユーザーがrootでない場合はroot操作を行うことができません

  • oc rsh
  • oc exec

これはシステムをセキュアに保つためですが、どうしてもroot権限で操作したいことがあったりします。本記事ではその方法について紹介します。

root権限でコマンド実行する方法


root権限でコマンド実行する方法について紹介します。以下のサポート問い合わせ履歴を参考にしました。

https://access.redhat.com/solutions/4539631

1. podが実行されているノードを確認する

$ oc get pods -o wide

2. container idを確認する

$ oc describe pod [pod名] | grep -I container

3. 手順1で確認したノードにログインし、コンテナのpidを確認する

$ pstree -p $(ps aux | awk “/[container id]/ {print \$2; exit}")
conmon(1408224)-+-dockerregistry(1408236)-+-{dockerregistry}(1408282)
                |                         |-{dockerregistry}(1408283)
                |                         |-{dockerregistry}(1408284)
                |                         |-{dockerregistry}(1408285)
                |                         |-{dockerregistry}(1408286)
                |                         |-{dockerregistry}(1408287)
                |                         |-{dockerregistry}(1408288)
                |                         |-{dockerregistry}(1408289)
                |                         |-{dockerregistry}(1408318)
                |                         |-{dockerregistry}(1409115)
                |                         |-{dockerregistry}(1409558)
                |                         |-{dockerregistry}(1415043)
                |                         `-{dockerregistry}(1429776)
                `-{conmon}(1408226)

4. コンテナに接続する

$ nsenter -a -t 1408236

5. コマンドを実行する

以下のコマンドを確認すると、rootユーザーでコマンド実行していることが確認できます。

$ whoami

root権限でコマンド実行するユースケースと体験談


本記事で紹介した操作は、大体が障害時の問題切り分けで使われることを想定しています。何故ならば、コンテナのイミュータブルな性質を無視していて、根本解決になっていないからです。

先日、OpenShiftを操作していたらdocker registryが機能していないことに気づきました。突き詰めると、docker registry podの/registryのオーナーがroot:rootになっていたことが原因でした。権限不足でレジストリへのpush/pullができない状態だったのです。

/registryのオーナー権限をchmodchownで変更すれば解決するのですが、oc rshコマンドで実行しようにも、コンテナ実行ユーザー(この時のユーザーは、1000170000でした)での操作になるのでchmodchownコマンドが実行できませんでした。

本当に原因が合っているか確かめるため、かつ即時回復が求められていたため、一時的にroot権限でコマンドを実行して回復しました。このように、問題切り分けの時には有効だと思いますので是非ご活用ください。

以上です!

Mac OSにCode Ready Container(CRC)をインストールしてみる

OpenShiftを自分で動かしてみたので紹介致します。

以下の流れで紹介します。

  • CRCとは
  • CRCのダウンロード
  • CRCのセットアップ
  • CRCの起動

CRCとは

OpenShift4を個人用PCにインストールして動かすことができます。

CRCのダウンロード

まずはCRCを以下のサイトからダウンロードします。ダウンロードするにはRed Hatアカウントが必要になるので、お持ちでない方はアカウントを作成する必要があります。

CRCダウンロードサイト

以下赤枠をクリックしてダウンロードします。コラッタはmacOSを利用しているので、macOSのCRCをダウンロードしています。お使いのPCに合わせてダウンロードしてください。

完了すると以下のファイルがダウンロードされます。

  • crc-macos-amd64.tar.xz
  • pull-secret

CRCのセットアップ

以下のコマンドを実行して、ファイルを展開します。ディレクトリ名はcrc-macos-[バージョン]-amd64です。2020/05/18時点の最新は1.10.0みたいです。

$ tar xzvf crc-macos-amd64.tar.xz
$ cd crc-macos-1.7.0-amd64

ついでに、pull-secretもcrc-macos-1.7.0-amd64に移動します。

$ mv pull-secret crc-macos-1.7.0-amd64

以下のコマンドでCRCのセットアップを行います。コマンドのパスを通してあげることで、どこからでも実行できるようになりますが、今回はディレクトリにあるファイルを直接して実行します。 途中で求められるパスワードは自身の個人PCのパスワードです。

$ ./crc setup
INFO Checking if oc binary is cached
INFO Checking if podman remote binary is cached
INFO Checking if CRC bundle is cached in '$HOME/.crc'
INFO Checking if running as non-root
INFO Checking if HyperKit is installed
INFO Checking if crc-driver-hyperkit is installed
INFO Checking file permissions for /etc/resolver/testing
INFO Checking file permissions for /etc/hosts
INFO Setting file permissions for /etc/hosts
INFO Will use root access: change ownership of /etc/hosts
Password:
Setup is complete, you can now run 'crc start' to start the OpenShift cluster

CRCの起動

以下のコマンドでCRCの起動を行います。

$ ./crc start -p pull-secret

CRCの起動が完了すると、最後に以下のインフォメーションが表示されます。これがログイン方法になります。

INFO To access the cluster, first set up your environment by following 'crc oc-env' instructions
INFO Then you can access it by running 'oc login -u developer -p developer https://api.crc.testing:6443'
INFO To login as an admin, run 'oc login -u kubeadmin -p db9Dr-J2csc-8oP78-9sbmf https://api.crc.testing:6443'
INFO
INFO You can now run 'crc console' and use these credentials to access the OpenShift web console

実際にログインします。

$ oc login -u kubeadmin -p db9Dr-J2csc-8oP78-9sbmf https://api.crc.testing:6443
Login successful.

You have access to 56 projects, the list has been suppressed. You can list all projects with 'oc projects'

Using project "default".
$ oc get nodes
NAME                 STATUS    ROLES           AGE       VERSION
crc-pxt56-master-0   Ready     master,worker   73d       v1.16.2

コンソールを起動する場合は、以下のコマンドを実行します。

$ ./crc console

以上、CRCの導入手順と実行手順でした。OpenShiftに興味ある方は是非インストールしてみたください!