ROSAで独自コンテナをインターネットに公開してみた

# はじめに

以前の記事で、ROSA(Red Hat OpenShift Service on AWS) クラスターのデプロイ方法と、Web コンソールのアクセス経路を調査しました。

ROSA(Red Hat OpenShift Service on AWS) を動かしてみた
https://qiita.com/sugimount-a/items/73d3ad7864e69cba2cc7

ROSAのコンソールのアクセス経路と提供元Podを調査してみた
https://qiita.com/sugimount-a/items/0720c41cba6a1c0b2954



今回は、自分たちで作成した Deployment を外部公開するときの手順を紹介します。[「ROSAのコンソールのアクセス経路と提供元Podを調査してみた」](https://qiita.com/sugimount-a/items/0720c41cba6a1c0b2954)で調査した通信経路を理解すると、自分たちの Deployment を公開するときの通信経路の理解が深まります。もしお時間があれば、ざっと目を通すと良いと思います。

ROSA での公開方法は大きく分けて 2パターンがあると思います。

- OpenShift に備わっている Route で公開
- Kubernetes の機能を使い、Service LoadBalancer などで公開



どちらでも問題はないと思いますが、今回は Route で公開をしてみます。



# ネットワーク接続図

今回紹介する Route で公開する手順で実現できる、ネットワーク接続図を載せます。

- 名前解決は Route 53 で行う
- Internet に接するコンポーネントは、CLB
- CLB が、Router Pod にリクエストを投げる
- Router Pod が これから設定する Route 情報に従い、Nginx にリクエストを投げる

![image-20211230002442318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/45b0bd42-655e-6a52-4ac7-42f3e41885e5.png)



# Route で公開

独自の Deployment として、Nginx コンテナを使っていきます。また、この Deployment に紐づける形で Service Cluster IP を作成します。

マニフェストファイルは次の通りです。

```yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
```



ファイルに保存したうえで、apply でデプロイします。

```
kubectl apply -f ~/k8s-manifests/nginx.yaml
```



Pod 2個 が Worker Node で稼働しています。

```
$ kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP             NODE
                NOMINATED NODE   READINESS GATES
nginx-deployment-66b6c48dd5-4d7mb   1/1     Running   0          20s   10.129.2.14    ip-10-0-201-136.ap-northeast-1.compute.internal   <none>           <none>
nginx-deployment-66b6c48dd5-gs9v2   1/1     Running   0          20s   10.128.2.211   ip-10-0-164-3.ap-northeast-1.compute.internal     <none>           <none>
```



Service `nginx-service` が Cluster IP として稼働しています。

```
$ kubectl get svc
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP                            PORT(S)   AGE
kubernetes      ClusterIP      172.30.0.1       <none>                                 443/TCP   8h
nginx-service   ClusterIP      172.30.179.253   <none>                                 80/TCP    2m17s
openshift       ExternalName   <none>           kubernetes.default.svc.cluster.local   <none>    8h
```



Cluster IP を使ってアクセスが出来るか確認をするために、`kubectl debug` で、動作確認用のコンテナを起動します。curl コマンドなどが既にインストールされている、自分が作成したコンテナを利用します。

```
kubectl debug nginx-deployment-66b6c48dd5-4d7mb -it --image=sugimount/toolbox:0.0.4 --share-processes --copy-to=myapp-debug
```



nginx-service に ClusterIP 経由でアクセス可能なことがわかります。

```
# curl nginx-service
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```



コンテナから Exit します

```
exit
```



作成した確認用 Pod を削除しておきます

```
kubectl delete pod myapp-debug
```



oc expose で Route を作成します。これによって、Internet に公開されます。

```
oc expose service nginx-service
```



実行例

```
$ oc expose service nginx-service
route.route.openshift.io/nginx-service exposed
```



作成された Route の確認をします。

```
$ oc get route
NAME            HOST/PORT                                                        PATH   SERVICES        PORT   TERMINATION   WILDCARD
nginx-service   nginx-service-default.apps.my-rosa02.pkyx.p1.openshiftapps.com          nginx-service   80                   None
```



コンソール上でも確認できます。

![image-20211230000345790.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9e9d9372-df83-0db1-03ad-491daacf7966.png)



場所の URL が、実際にインターネットから接続可能な URL となります。

![image-20211230000639354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bc8b70da-9699-466f-6f6d-48e253350b23.png)



Nginx 画面が正常に表示されます。

http://nginx-service-default.apps.my-rosa02.pkyx.p1.openshiftapps.com/

![image-20211230000649475.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9a347165-de93-9d90-f326-08f3bfa3b8c9.png)



# まとめ

ROSA に付属されている Router を使って、Internet に公開する方法を紹介しました。今回は簡単に公開しただけですが、実際のサービスでは任意のドメイン名で公開したいですし、HTTPS を使ったアクセスも行いたいです。このあたりは時間ができたらまた確認したいと思います。