投稿日:2020年10月19日
Ingressを使用するとパスごとに違うServiceをルーティングするすることができあます。この記事ではその方法について解説します。
この記事ではIngressを使用して複数のServiceをパスごとにコントロールして公開する方法について解説します。
まずはIngressコントローラーを有効化させます。
今回の環境はMinikubeなのでアドオンのnginx-ingressのコントローラーを有効化させます。
$ minikube addons enable ingress
🔎 Verifying ingress addon...
🌟 The 'ingress' addon is enabled
まずはIngressでルーティングする対象のPodとServiceを作成します。
今回はリクエストが最終的にどのPodにたどり着いたのかを明確にするためにHelloKubernetesのImageを使用します。このImageはHTTPリクエストを送ると動いているPodのnameを表示してくれます。
まずはyamlファイルを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp1
spec:
replicas: 1
selector:
matchLabels:
app: webapp1-pod
template:
metadata:
labels:
app: webapp1-pod
spec:
containers:
- name: webapp1-app
image: paulbouwer/hello-kubernetes:1.8
ports:
- containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp2
spec:
replicas: 1
selector:
matchLabels:
app: webapp2-pod
template:
metadata:
labels:
app: webapp2-pod
spec:
containers:
- name: webapp2-app
image: paulbouwer/hello-kubernetes:1.8
ports:
- containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp3
spec:
replicas: 1
selector:
matchLabels:
app: webapp3-pod
template:
metadata:
labels:
app: webapp3-pod
spec:
containers:
- name: webapp3-app
image: paulbouwer/hello-kubernetes:1.8
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: webapp1-svc
labels:
app: webapp1-svc
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: webapp1-pod
---
apiVersion: v1
kind: Service
metadata:
name: webapp2-svc
labels:
app: webapp2-svc
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: webapp2-pod
---
apiVersion: v1
kind: Service
metadata:
name: webapp3-svc
labels:
app: webapp3-svc
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 8080
selector:
app: webapp3-pod
デプロイします。
$ kubectl apply -f deployment.yaml
deployment.apps/webapp1 created
deployment.apps/webapp2 created
deployment.apps/webapp3 created
service/webapp1-svc created
service/webapp2-svc created
service/webapp3-svc created
次にserviceへルーティングするルールを作成します。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: webapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: my.kubernetes.example
http:
paths:
- path: /webapp1
backend:
serviceName: webapp1-svc
servicePort: 80
- path: /webapp2
backend:
serviceName: webapp2-svc
servicePort: 80
- path: /*
backend:
serviceName: webapp3-svc
servicePort: 80
このルールは以下のようにルーティングする設定になります。
ルールをデプロイします。
$ kubectl apply -f ingress.yaml
ingress.networking.k8s.io/webapp-ingress created
ホストマシンから確認してみます。
まずはminikubeのノードのIPを確認し、ローカルの環境で名前解決をできるように/etc/hostsを編集します。
$ minikube ip
192.168.39.6
[...]
192.168.39.6 my.kubernetes.example
[...]
ブラウザからそれぞれのURLで確認してみましょう。
問題なさそうですね。
ちなみに画像やCSSが取得できていない部分は特に問題ありません。
ワイルドカードで全てのパスがname:webapp1-svcに向いてしまっているため
/image/〇〇.jpgや/css/〇〇○.cssなどの素材に対してもこのサービスが公開されてしまっているだけです。