ARO の Ingress として Nginx Ingress Controller を使用してみる。

# はじめに
`ARO(Azure Red Hat OpenShift)` には、標準の `Ingress Controller` が存在していますが、標準の `Ingress` の代わりに `Nginx` の `Ingress Operator` を使用して、`Nginx`の`Ingress Controller` を使用してみます。

# ARO(Azure Red Hat OpenShift) とは？
`ARO` は、`Red Hat OpenShift` の `Azure` 上で提供されているマネージド・サービスです。名前のフォーマットは違いますが、簡単に言うと、`AKS`、`EKS`、`GKE` の `Red Hat` 版です。

`Red Hat` の Kubernetes Districution である `OpenShift` が使われています。

記事の内容は、以前書いた [ROSA で Nginx Ingress Operator を使ってみる](https://qiita.com/Yuhkih/items/b0495f39d6491d3d7c4f) とほぼ同じなのですが、`Azure` 側の仕様で`Load Balancer` の名前が IPアドレスになっていたり、若干違う所がありました。前の記事に書き込むと読み分けが大変だと思ったので、その部分だけ変更して別記事にしました。

OpenShift 側のインストール手順は全く同じですが、こちらの記事はインストールに特化して細かい考察は省いています。

# 参考資料

以下の Git Hub のレポを参考にしました。ROSAと手順自体は同じです。

https://github.com/nginxinc/nginx-ingress-helm-operator

# Nginx Ingress Operator のインストール

Operator Hub より Ingress Operator をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/b655a314-dc04-f480-2102-c282e113d9f8.png)

ここは特に何の設定もせず、デフォルのままインストールボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/acb2016d-3f07-1ae2-49e0-2438b1870209.png)

インストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/445c123d-31aa-59df-f955-855ff4df80dc.png)



# Nginx Ingress Controller の作成

`Nginx Ingress Controller` を作成していきます。`NginxIngress` リソースを作成する事で、`Nginx Ingress Controller` の Pod が生成されます。

## SCC の作成

`Ingress Controller` の作成前に、`OpenShift` では、以下のリンク先の yaml にある `SCC(Security Context Cosntrain)` が必要になります。

```
kubectl apply -f https://raw.githubusercontent.com/nginxinc/nginx-ingress-helm-operator/main/resources/scc.yaml
```

## NginxIngess リソース (Ingress Controller) の作成


「Nginx Ingress Controller」というタブをクリックして、「Create NginxIngess」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/f25b823d-35f8-d710-e879-e26f72ae147d.png)

殺風景ですが、とりあえずデフォルトのまま`NginxIngress` というカスタムリソースを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/5f3c6793-9081-721b-6bd5-e8b771ce7d9e.png)

Namespace `nginx-ingress` 内に `nginxingress-sample` という名前の `NginxIngress` リソースが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/6e6c95d5-2427-e254-7e5b-81bcf84dfa87.png)


上の行の Pod は、Operator の本体です。`nginxingress-sample-nginx-ingress-controller-79f4b97478-hkdjf` という Pod (下の行)が名前からもわかるように、`NginxIngress`リソースに対応して作られた `Nginx Ingress Controller` です。

```
$ oc get pods
NAME                                                            READY   STATUS    RESTARTS   AGE
nginx-ingress-operator-controller-manager-5c8fcfd66b-w7l6d      2/2     Running   0          42m
nginxingress-sample-nginx-ingress-controller-79f4b97478-hkdjf   1/1     Running   0          9m55s
$  
```

また `Serivce` も確認してみます。`Type=Loadbalancer` の `Service`リソースが作成されています。

```
$ oc get svc
NAME                                                        TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)                      AGE
nginx-ingress-operator-controller-manager-metrics-service   ClusterIP      172.30.119.163   <none>         8443/TCP                     45m
nginxingress-sample-nginx-ingress-controller                LoadBalancer   172.30.242.187   20.22.71.185   80:31599/TCP,443:31697/TCP   13m
$ 
```

# サンプルのアプリケーションのデプロイ

アプリケーションをデプロイするための 新しいプロジェクト (namespace)、 `hello-openshift` を作成します。

```
oc new-project hello-openshift
```

アプリケーションをデプロイします。

```
oc new-app --image=docker.io/openshift/hello-openshift  --labels=test=app
```

`Service` リソースも作成されている事を確認します。

```
 oc get svc
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
hello-openshift   ClusterIP   172.30.184.252   <none>        8080/TCP,8888/TCP   13m
$ 
```


# Ingress リソースを使ったサンプル・アプリの公開

アプリケーションのプロジェクト(namespace)、`hello-openshift` 内に `Ingress` リソースを作成します。

宛先は、先ほど作成された `hello-openshift` という `Service` リソースです。

OpenShift は、標準で [`Ingress` リソース](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.13/html-single/networking/index#nw-installation-ingress-config-asset_configuring-ingress) も `Route` リソースも処理できるようになっています。

`Nginx Ingress Controller` に作成した `Ingress` リソースを処理させるためには、以下の `annotation` が必要になるようです。

```
  annotations:
    kubernetes.io/ingress.class: "nginx"
```

以下の ingress リソースを作成します。

```ingress.yaml
cat << EOF > ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  defaultBackend:
    service:
      name: hello-openshift
      port:
        number: 8080
  rules:
  - host: test.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: hello-openshift
            port:
              number: 8080
EOF
```


`ingress` リソースが作成されているのを確認します。`ROSA(AWS)` の時と違い、`LoadBalancer` が FQDNではなく、IPアドレスとして表示されているのが特徴的です。

```
$  oc get ingress
NAME           CLASS    HOSTS              ADDRESS        PORTS   AGE
test-ingress   <none>   test.example.com   20.22.71.185   80      13m
$ 
```


-H で Host ヘッダーを `test.example.com` に偽装してアクセスしてみます。

```
$ LB=20.22.71.185
$ curl -H 'Host:test.example.com' $LB
Hello OpenShift!
$ 
```

無事アクセスできました。