podmanで自分のnginxイメージを作成してROKSにデプロイする

# 目的

以下のチュートリアルとなります。
- podmanでregistry.access.redhat.com上のnginxから自分のイメージを作成(Linuxサーバーを想定)
- IBM Cloud Container Registry(ICR)に作成イメージをPush
- Red Hat OpenShift on IBM Cloud(ROKS)上に上記イメージをデプロイ

# 前提

- Podmanは導入済み(RHEL8.10に導入)
- ROKSはデプロイ済み (ICRとの接続も済。OCP4.14)
- ibmcli、ocは導入済み
- ICRのデプロイおよびNamespaceは作成済み


# 手順

### ibmcliの準備

ibmcliは導入済みとする

### ユーザーの作成
podmanを利用する場合、ルートレスコンテナを利用するため、`/etc/subuid`、`/etc/subgid` に記載されたUID/GIDのユーザーが必要となる。
そのため、上記UID/GIDのユーザーではない場合、ユーザーを追加し、パスワード設定をする。

```
sudo useradd ユーザー名
sudo passwd ユーザー名
```
Container Registry CLI のインストールをおこなう

```
ibmcloud plugin install container-registry

ibmcloud plugin list
```


### 資料の取得

git cloneで資料を取得し、対象ディレクトリに移動


```
git clone https://github.com/sclorg/nginx-container.git nginx-container

cd nginx-container/examples/1.20/
```
もしくは、zipでダウンロードし、作業ディレクトリに配置する。

### 自分用ファイルを作成

以下のindex.htmlファイルを作成する。
作成後、index2.htmlも作成する(index.htmlをコピーしたものでよい)

\<title>部分や\<body>は適宜変更する。

イメージファイルを読み込むようにしてもよい。(以下のindex.htmlはindex-amaebi_computer.pngを読み込んでいる)

```
<html>
<head>
	<title>Test NGINX passed</title>
</head>
<body>
<h1>NGINX is working on ROKS</h1>
  <p>Hello, World!</p>
  <img src="index-amaebi_computer.png" alt="Legendary Japanese spirit, Amabie" title="Amabie" >
</body>
</html>
```

ファイルの配置ができたら、`index.html`と`index2.html`、使うイメージファイル等を
`nginx-container/examples/1.20/test-app/` 直下に配置する。(ファイルを置き換える)


### コンテナイメージの作成

### Dockerfileの確認

`nginx-container/examples/1.20/`にあるDockerfileを書き換える。

イメージファイルを配置する場合、ADD を追加し、イメージファイルを追加する。


```
FROM registry.access.redhat.com/ubi8/nginx-120

# Add application sources
ADD test-app/nginx.conf "${NGINX_CONF_PATH}"
ADD test-app/nginx-default-cfg/*.conf "${NGINX_DEFAULT_CONF_PATH}"
ADD test-app/nginx-cfg/*.conf "${NGINX_CONFIGURATION_PATH}"
ADD test-app/index* .

# Run script uses standard ways to run the application
CMD nginx -g "daemon off;"

```

### コンテナイメージのビルド

作成したDockerfileでコンテナイメージをビルドする

```
cd <Dockerfileがあるディレクトリ>
podman build -t <コンテナイメージ名>
(例) podman build -t nginx-app .
```
イメージの確認

```
podman images

(以下表示される)
REPOSITORY                                 TAG         IMAGE ID      CREATED         SIZE
localhost/nginx-app                        latest      66ee5daf56a3  10 seconds ago  451 MB
registry.access.redhat.com/ubi8/nginx-120  latest      eec8d440def2  2 months ago    450 MB
```


### コンテナイメージの稼働確認

コンテナイメージを稼働させて、想定のファイルがみえることを確認する。

```
podman run -it -d -p <てきとうなPORT>:8080 <コンテナイメージ名>
```

確認
```
curl -Lk 127.0.0.1:<指定したPort>

```


### コンテナイメージをICRへPUSH

参考

* [Docker イメージの名前空間へのプッシュ](https://cloud.ibm.com/docs/Registry?topic=Registry-registry_images_#registry_images_pushing_namespace)

* [Container Registry 概説](https://cloud.ibm.com/docs/Registry?topic=Registry-getting-started)



IBM Cloudにログイン

```
ibmcloud login
```


ICRのNamespaceが作成されていることを確認

```
ibmcloud cr namespace-list -v
```

作成したイメージにtagをつける

* source_imageは作成したコンテナイメージ名

```
podman tag <source_image>:<tag> <region>.icr.io/<my_namespace>/<new_image_repo>:<new_tag>

例) podman tag localhost/nginx-app jp.icr.io/isei20241010-1516-xxxx/nginx-app-yk:1.0
```

ICRにログインする(IBM Cloudにログインするだけではプライベートレジストリは使えません)


```
ibmcloud cr login --client podman
```

コンテナイメージをICRのNamespaceにPushする

イメージの指定は、先程つけたtag名を使用する


```
podman push <region>.icr.io/<my_namespace>/<image_repo>:<tag>

例) podman push jp.icr.io/isei20241010-1516-xxxx/nginx-app-yk:1.0
```


イメージがPushされたことを確認

```
ibmcloud cr image-list
```

### ROKSにデプロイする

ROKSにログインする

参考 [CLI からクラスターへの接続](https://cloud.ibm.com/docs/openshift?topic=openshift-access_cluster#access_oc_cli)


自分用のNamespace(Project)を作成する

``` 
oc create new-project <new-project>
```

NamespaceにImagePullSecretをコピーする

```
oc get secrets -n default | grep icr-io

oc get secret all-icr-io -n default -o yaml | sed 's/default/<new-project>/g' | oc create -n <new-project> -f -
```

Secretがコピーされたことを確認する

```
oc get secret -n <new-project> | grep all-icr-io
```



デプロイ用のyamlファイルを用意する(nginx-deploy.yaml)

```
apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: ここにICRのイメージを記載(例 jp.icr.io/isei20241010-1516-xxxx/nginx-app-yk:1.0)
        ports:
        - containerPort: 8080
      imagePullSecrets:
       - name: all-icr-io

```

Podのデプロイ

```
oc create -f nginx-deploy.yaml -n <new-project>

oc get pod -n <new-project>
```


Serviceの作成用yamlの作成 (nginx-svc.yaml)

```
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
    - port: 8080
      targetPort: 8080
```

Serviceの作成

```
oc create -f nginx-svc.yaml -n <new-project>

oc get svc -n <new-project>

```

Routeの作成

```
oc expose svc nginx-svc -n <new-project>


oc get route -n <new-project>
```

デプロイしたnginxコンテナにアクセスできることを確認

上記の`oc get route`に表示されているURLにアクセスする。

```
curl http://上記URL

```
GUIからもアクセスして確認する。


# 参考
[Nginx 1.22](https://catalog.redhat.com/software/containers/rhel8/nginx-122/627241269ee5e7f4800b7fd2?container-tabs=overview)