4. 内部 OpenShift Registry を使用する

この手順は 標準の Ngix コンテナをセキュアにする の続きです。

ROSA では、コンテナアプリケーションの開発に必要な Docker Registry が既にセットアップされて使えるようになっています。

主に、この ROSA Cluster の内部のプロジェクトから使用される事を目的とした、シンプルな Docker Image Registry なので、内部 OpenShift Registry のように呼ばれています。

1. 内部 OpenShift Registry の公開 #

コンテナをビルドした端末から、直接、内部 OpenShift Registry にアクセスできるようにするために、Route を使って 内部 OpenShift Registry をクラスター外のネットワークに公開します。

oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge

2. 内部 OpenShift Registry へのログイン #

内部 OpenShift Registry の ドメイン名を取得します。

export IMAGE_SERVER=`oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}'`

変数に値がセットされているか確認します。

echo $IMAGE_SERVER

内部 OpenShift Registry に、Bearerトークン を使ってログインします。

podman login -u `oc whoami` -p `oc whoami --show-token` ${IMAGE_SERVER}

3. 内部 OpenShift Registry への Image の Push #

新しい project を作成します。

export PROJECT_NAME=secure-nginx
oc new-project $PROJECT_NAME

現在、作業端末上にある image を確認します。

$ podman images
REPOSITORY                   TAG         IMAGE ID      CREATED         SIZE
localhost/new-nginx  latest      d623ca329bc4  19 minutes ago  303 MB
 $ 

作成したローカルイメージにタグを付けます。

内部 OpenShift Registry は、プロジェクト名を持った名前空間で区切られます。 tag 名に $PROJECT_NAME を入れる事で、特に追加の設定をしなくても、イメージが $PROJECT_NAME 内からアクセスできるようになります。

podman tag localhost/new-nginx:latest $IMAGE_SERVER/$PROJECT_NAME/mynginx:latest

イメージを push します

podman push  $IMAGE_SERVER/$PROJECT_NAME/mynginx:latest

これで内部 OpenShift Registryにビルドした image が push されました。

4. Push した Image の OpenShift 上へのデプロイ #

内部 Image Registry に Push したイメージを使用してアプリケーションを Deploy します。

  1. 現在いるプロジェクトを確認します。タグ付けに使った $PROJECT_NAME である事を確認します。
oc project                 
  1. コンテナをデプロイします。

oc new-app コマンドで Depoloyment と Service を作成します。

oc new-app --name new-nginx --image mynginx:latest
oc new-app コマンドが、image 名を引数に指定するだけで、Service まで作成できるのは、OpenShift が、コンテナ image 内でEXPOSE されているポートを自動的に認識しているためです。コンテナ image 内で EXPOSE が行われてない場合は、Service は自動では作成されません。

new-nginx という名前で Deployment と Service が作成されている事を確認します。

oc get deployment,service

今度は Pod が起動している事を確認します。

oc get pods

サービスを公開します。これをする事で Routeオブジェクトが作成されます。

oc expose svc new-nginx

route を確認します。

oc get route

route の HOST 名を変数 HOST に取り出します。

HOST=$(oc get route/new-nginx -o jsonpath={.spec.host})

curl でアクセスできる事を確認します。

curl $HOST