はじめに
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 を使ってみる とほぼ同じなのですが、Azure
側の仕様でLoad Balancer
の名前が IPアドレスになっていたり、若干違う所がありました。前の記事に書き込むと読み分けが大変だと思ったので、その部分だけ変更して別記事にしました。
OpenShift 側のインストール手順は全く同じですが、こちらの記事はインストールに特化して細かい考察は省いています。
参考資料
以下の Git Hub のレポを参考にしました。ROSAと手順自体は同じです。
Nginx Ingress Operator のインストール
Operator Hub より Ingress Operator をインストールします。
ここは特に何の設定もせず、デフォルのままインストールボタンをクリックします。
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」をクリックします。
殺風景ですが、とりあえずデフォルトのままNginxIngress
というカスタムリソースを作ります。
Namespace nginx-ingress
内に nginxingress-sample
という名前の NginxIngress
リソースが作成されました。
上の行の 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
リソース も Route
リソースも処理できるようになっています。
Nginx Ingress Controller
に作成した Ingress
リソースを処理させるためには、以下の annotation
が必要になるようです。
annotations:
kubernetes.io/ingress.class: "nginx"
以下の ingress リソースを作成します。
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!
$
無事アクセスできました。