はじめに
以前の記事で、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を調査してみた」で調査した通信経路を理解すると、自分たちの Deployment を公開するときの通信経路の理解が深まります。もしお時間があれば、ざっと目を通すと良いと思います。
ROSA での公開方法は大きく分けて 2パターンがあると思います。
- OpenShift に備わっている Route で公開
- Kubernetes の機能を使い、Service LoadBalancer などで公開
どちらでも問題はないと思いますが、今回は Route で公開をしてみます。
ネットワーク接続図
今回紹介する Route で公開する手順で実現できる、ネットワーク接続図を載せます。
- 名前解決は Route 53 で行う
- Internet に接するコンポーネントは、CLB
- CLB が、Router Pod にリクエストを投げる
- Router Pod が これから設定する Route 情報に従い、Nginx にリクエストを投げる
Route で公開
独自の Deployment として、Nginx コンテナを使っていきます。また、この Deployment に紐づける形で Service Cluster IP を作成します。
マニフェストファイルは次の通りです。
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
コンソール上でも確認できます。
場所の URL が、実際にインターネットから接続可能な URL となります。
Nginx 画面が正常に表示されます。
まとめ
ROSA に付属されている Router を使って、Internet に公開する方法を紹介しました。今回は簡単に公開しただけですが、実際のサービスでは任意のドメイン名で公開したいですし、HTTPS を使ったアクセスも行いたいです。このあたりは時間ができたらまた確認したいと思います。